以下是 Xilinx Zynq 示例中的代码。我不明白这是做什么用的?
正如我所见,pulse_d2仅在s_axi_resetn的下降沿为1。
以这种方式检测下降沿的原因是什么?
为什么不使用事件,比如“if (s_axi_resetn'event and s_axi_resetn = '0')”?
process(s_axi_clk)
begin
if (s_axi_clk'event and s_axi_clk = '1') then
if (s_axi_resetn = '0') then
pulse <= '0';
else
pulse <= '1';
end if;
end if;
end process;
process(s_axi_clk)
begin
if (s_axi_clk'event and s_axi_clk = '1') then
if (s_axi_resetn = '0') then
pulse_d1 <= '0';
else
pulse_d1 <= pulse;
end if;
end if;
end process;
pulse_d2 <= pulse and (not pulse_d1);
在
s_axi_clk
的上升沿(对于 s_axi_resetn
为低电平),pulse
和 pulse_d1
被迫为 '0'
,且 pulse_d2
也取值“0
”。
在
s_axi_clk
为高电平的第一个上升沿,s_axi_resetn
变高,但 pulse
对 pulse_d1
的当前值进行采样,即 pulse
。因此 '0'
的值为 'pulse_d2
'。在
1
的第二个上升沿,
s_axi_clk
为高电平,s_axi_resetn
保持高电平,pulse
变高。因此 pulse_d1
的值为 'pulse_d2
'。在
0
为高电平的后续
s_axi_clk
上升沿上,s_axi_resetn
和 pulse
保持高电平。因此 pulse_d1
的值为 'pulse_d2
'。因此,该设计是一种检测复位解除断言并通过
0
上高电平的单个时钟周期脉冲发出信号的方法。
的示例 - 例如,参见this。 这用于检测某些非时钟信号的边沿,因此是
同步设计。
为了同步设计所有触发器应始终从同一边沿计时 同一个时钟
如果您使用代码实现了边缘检测器
- 不应该有闩锁
- 不应该有
组合反馈- 。
pulse_d2
然后这将合成一个触发器,该触发器由信号
if (s_axi_resetn'event and s_axi_resetn = '0')
提供时钟。您刚刚违反了第一条规则,并且您的设计不再同步。
由于各种原因,真正的设计不太可能完全同步。然而,您应该尽量减少同步设计的偏离次数,任何偏离都会让您彻夜难眠。因此,您应该始终使用同步边沿检测器来检测信号的边沿,而不是将该信号连接到触发器的时钟输入。