因为去实习,所以最近都没有更新,特来更新一发。
最近发现一个问题,就是很多代码中会特地的新建一个D触发器用来锁存信号,让很多人都比较疑惑,明明一个D触发器就可以检测输入是上升沿和下降沿,为什么要用两个?第二个触发器的作用是什么呢?我们举一个最简单的例子,按键的输入控制输出,可以从代码和RTL图中看出不同
下面是用一个D触发器的代码(接下面的图是rtl图)
`timescale 1ns / 1ps
module key_test
(
input clk,
input [3:0] key,
output[3:0] led
);
reg[3:0] led_r;
always@(posedge clk)
begin
led_r <= ~key;
end
assign led = led_r;
endmodule
下面是用两个D触发器的代码(接下面的图是rtl图)差别在于多了一个led_r1寄存器
`timescale 1ns / 1ps
module key_test
(
input clk,
input [3:0] key,
output[3:0] led
);
reg[3:0] led_r;
reg[3:0] led_r1;
always@(posedge clk)
begin
led_r <= ~key;
end
always@(posedge clk)
begin
led_r1 <= led_r;
end
assign led = led_r1;
endmodule
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
解析:一开始我也觉得第二个寄存器是多余的,但是通过思考还是想到了比较合理的原因,首先我们要了解一个概念,就是建立时间和保持时间(几乎所有硬件相关笔试文档里都有的问答题)。
什么是 Setup和 Hold 时间?
答:Setup/Hold Time 用于测试芯片对输入信号和时钟信号之间的时间要求。建立时间(Setup Time)是指触发器的时钟信号上升沿到来以前,数据能够保持稳 定不变的时间。输入数据信号应提前时钟上升沿(如上升沿有效)T 时间到达芯片,这个T就是建立时间通常所说的 SetupTime。如不满足 Setup Time,这个数据就不能被这一时钟打入触发器,只有在下一个时钟上升沿到来时,数据才能被打入 触发器。保持时间(Hold Time)是指触发器的时钟信号上升沿到来以后,数据保持稳定不变的时间。如果 Hold Time 不够,数据同样不能被打入触发器。
以上就是用2个触发器的问题所在,当我们按键时,很有可能会正好碰到与时钟上升沿时间距离很短的时候(也就是建立时间不足),这时候触发器会进入亚稳态(这会导致在后面组合电路中有时为低电平有时为高电平),且在下个上升沿到来之前都不会进入稳态,这就为后续电路埋下隐患。解决方案就是用多个触发器,第二个触发器实际上是在按键按下的第二个上升沿接收到的正确信号,这时候第一个触发器大概率已经进入稳态,所以可以正常输出,两者同时出现亚稳态的情况也存在不过概率比较低,日常中一般两个触发器就可以满足要求,这就是为什么要用两个触发器。
这就是实践和理论的区别,理论中的D触发器可是没有建立和保持实践的,所以在理论中2个D触发器可以说是浪费,但是在实践中是必不可少的。