HDLBits 系列(15) 如何设计一个双边沿采样的电路?

举报
李锐博恩 发表于 2021/07/15 01:44:47 2021/07/15
【摘要】 目录 背景 原题复现 审题 我的设计1 我的设计2 背景 曾经专门写过这个话题,可是今天在练习HDLBits时候,又发现了这个问题,但是以前的思路我已经忘了,不得不回顾。 FPGA中如何实现双边沿采样? 奇怪的是我竟然之前用过的方法,今天我已经想不通为什么了? 直接见原题吧: 原题复现 You're familiar with flip-flops...

目录

背景

原题复现

审题

我的设计1

我的设计2


背景

曾经专门写过这个话题,可是今天在练习HDLBits时候,又发现了这个问题,但是以前的思路我已经忘了,不得不回顾。

FPGA中如何实现双边沿采样?

奇怪的是我竟然之前用过的方法,今天我已经想不通为什么了?


直接见原题吧:

原题复现

You're familiar with flip-flops that are triggered on the positive edge of the clock, or negative edge of the clock. A dual-edge triggered flip-flop is triggered on both edges of the clock. However, FPGAs don't have dual-edge triggered flip-flops, and always @(posedge clk or negedge clk) is not accepted as a legal sensitivity list.

Build a circuit that functionally behaves like a dual-edge triggered flip-flop:

(Note: It's not necessarily perfectly equivalent: The output of flip-flops have no glitches, but a larger combinational circuit that emulates this behaviour might. But we'll ignore this detail here.)

审题

(注意:它不一定完全等效:触发器的输出没有毛刺,但是可以模仿这种行为的较大的组合电路。但是在这里我们将忽略此细节。)

上面注意的意思是可以接受毛刺。

我还是说一下自己的思路吧,本身最容易想到的方法应该是:


  
  1. always@(posedge clk or negedge clk) begin
  2. q <= d;
  3. end

但是由于不存在这样的触发器,所以编译器是过不去的,不能这样做。

那这样呢?


  
  1. always@(posedge clk) begin
  2. q <= d;
  3. end
  4. always@(negedge clk) begin
  5. q <= d;
  6. end

这不是废话吗?这和上面的写法没什么区别?属于掩耳盗铃。

对时钟做文章:


  
  1. assign clk_gen = ~clk;
  2. always@(posedge clk) begin
  3. q <= d;
  4. end
  5. always@(posedge clk_gen) begin
  6. q <= d;
  7. end

综合工具不能综合,同样属于掩耳盗铃之举动。

生成的时钟clk_gen和clk直接相关,然后对同一个reg变量进行赋值,无异于同一个时钟上下边沿进行赋值。

那我们对reg变量动手,用不同的reg变量代表输出,之后进行逻辑运算。

我的设计1

给出一种可行的方案:


  
  1. module top_module (
  2. input clk,
  3. input d,
  4. output q
  5. );
  6. reg p = 0, n = 0;
  7. always@(posedge clk) begin
  8. n <= d;
  9. end
  10. always@(negedge clk ) begin
  11. p <= d;
  12. end
  13. assign q = clk ? n : p;
  14. endmodule

我的设计2

最后还有一种可行的方案:


  
  1. module TwoEdge(
  2. input clk,
  3. input rst_n,
  4. input d,
  5. input out
  6. );
  7. reg p = 0, n = 0;
  8. always@(posedge clk) begin
  9. p <= d ^ n;
  10. end
  11. always@(negedge clk ) begin
  12. n <= d ^ p;
  13. end
  14. assign out = p ^n;
  15. endmodule

但此刻我心力交瘁,竟想不出为什么了?

2019年11月24(周日),21:57(这个日子过后,我将又是一个状态)。

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/103229354

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。