当前位置:   article > 正文

FPGA学习笔记(3)——如何理解时序逻辑会延迟一拍的现象_fpga如何理解寄存器输出延迟1clk

fpga如何理解寄存器输出延迟1clk

疑惑:什么是时序逻辑会延迟组合逻辑一拍?如何理解该现象?当数据变化沿与寄存器时钟上升沿重合时,寄存器输出信号是什么?

结论:

  1. DFF有输入端(D端)和输出端(Q端),D端连接部分组合电路,其值随组合电路的输入值同步变化;
  2. 所谓“延迟一拍”是指当时钟上升沿来临时,D端数据会传送到Q端,即Q值相较于D值会延迟一拍;
  3. 当数据变化沿与寄存器时钟上升沿重合时,可看作D端数据先变化,随即再将值传给Q端,即波形图显示的是寄存器输出(Q)为信号跳变沿后的值,如图4;
  4. 寄存器之间的延迟,即每经过一个DFF,就会增加一个时钟周期的延迟。

说明:

一、组合逻辑VS时序逻辑

如图1所示,led_out直接与key_in相连,led_out2与key_in之间有DFF,输出信号的波形如图2所示。①②处和④⑤处,led_out2延迟led_out;但在③处key_in的变化与clk上升沿重合时,led_out2与led_out的变化同步。该过程可以看作,DFF的D端随key_in随时同步变化(组合电路),但只有在clk上升沿时才将D端值(led_out)赋给Q端(led_out2),跳变沿重合时可看作因为组合逻辑D端值马上变化,再传输到Q端。

结论:led_out2最多延迟led_out一个时钟周期,在仿真中也可能同步

图1

图2

二、4bit计数器,当计数使能cin与clk上升沿同时到达时的情况

如下代码:

else if(cin == 1'b1)

      q <= q + 1'b1;

完整代码见文末

仿真环境:Modelsim SE-64 10.5

图3 counter_4bit 的电路

图4 仿真波形图

如图4所示,当cin的变化与时钟上升沿重合时(①②处),q在①处“加1”,但在②处“不变”。即重合时,捕获到的是cin“下一时刻”的值;不重合时,捕获到的是当前时刻的值。

三、DFF之间的数据延迟

在上述计数器中再加入一个DFF2,cout2会延迟cout一个时钟周期,如图6.

图5

图6

当DFF2的D端连接的是DFF1的Q端时,因为DFF总是在时钟上升沿传送数据,所以在此刻DFF2的Q值是上一时刻DFF1的Q值,即DFF2的输出值相较于DFF1的输出值,延迟一个时钟周期。

counter_4bit

RTL:

  1. module counter_4bit
  2. #( parameter c_number = 4'd10 )
  3. (
  4. input clk ,
  5. input rst_n ,
  6. input cin ,
  7. output reg cout ,
  8. output reg cout2 ,
  9. output reg[3:0] q
  10. );
  11. always@(posedge clk or negedge rst_n)
  12. begin
  13. if(!rst_n)
  14. q <= 4'd0 ;
  15. else if(q == c_number)
  16. q <= 4'd0 ;
  17. else if(cin == 1'b1)
  18. q <= q+1'b1;
  19. else q <= q;
  20. end
  21. always@(*) begin
  22. if(q == c_number)
  23. cout <= 1'b1;
  24. else cout <= 1'b0;
  25. end
  26. always@(posedge clk or negedge rst_n)
  27. begin
  28. if(!rst_n)
  29. cout2 <= 1'd0 ;
  30. else if(q == c_number)
  31. cout2 <= 1'd1 ;
  32. else cout2 <= 1'b0 ;
  33. end
  34. endmodule

Tb:

  1. `timescale 1ns/1ns
  2. `define clk_period 20
  3. module tb();
  4. reg clk;
  5. reg rst_n;
  6. reg cin;
  7. wire cout;
  8. wire cout2;
  9. wire[3:0] q;
  10. initial begin
  11. clk <= 1'b0;
  12. cin <= 1'b0;
  13. rst_n <= 1'b0;
  14. #30 rst_n <= 1'b1;
  15. repeat(20)begin
  16. #90 cin <= 1'b1;
  17. #20 cin <= 1'b0;
  18. end
  19. #1000
  20. $stop;
  21. end
  22. always #(`clk_period/2) clk <= ~clk;
  23. counter_4bit
  24. #( .c_number (10) )
  25. u1
  26. (
  27. .clk (clk ),
  28. .rst_n (rst_n),
  29. .cin (cin ),
  30. .cout (cout ),
  31. .cout2 (cout2),
  32. .q ( q )
  33. );
  34. endmodule

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/460007
推荐阅读
相关标签
  

闽ICP备14008679号