奇怪的边缘检测或其他什么?

问题描述 投票:0回答:2

以下是 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);
vhdl
2个回答
1
投票

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

上高电平的单个时钟周期脉冲发出信号的方法。

    


1
投票
同步边缘检测器

的示例 - 例如,参见this 这用于检测某些非时钟信号的边沿,因此是

同步设计

为了同步设计

所有触发器应始终从同一边沿计时 同一个时钟
  1. 不应该有闩锁
  2. 不应该有
  3. 组合反馈
如果您使用代码实现了边缘检测器

pulse_d2

然后这将合成一个触发器,该触发器由信号 
if (s_axi_resetn'event and s_axi_resetn = '0')

提供时钟。您刚刚违反了第一条规则,并且您的设计不再同步。

由于各种原因,真正的设计不太可能完全同步。然而,您应该尽量减少同步设计的偏离次数,任何偏离都会让您彻夜难眠。因此,您应该始终使用同步边沿检测器来检测信号的边沿,而不是将该信号连接到触发器的时钟输入。

© www.soinside.com 2019 - 2024. All rights reserved.