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

时间:2017-06-22 16:40:14

标签: vhdl

以下是Xilinx Zynq示例中的代码。我无法理解它的用途是什么?

我看到 pulse_d2 仅在 s_axi_resetn 的下降沿为1。

以这种方式检测下降沿的原因是什么?

为什么不使用事件,例如“ if(s_axi_resetn'event和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);

2 个答案:

答案 0 :(得分:1)

s_axi_clks_axi_resetn低的pulse的上升沿,pulse_d1'0'被强制为pulse_d20也取值's_axi_clk'。

s_axi_resetnpulse为高的pulse_d1的第一个上升沿,pulse变高但'0'采样pulse_d2的当前值,即1s_axi_clk。因此,s_axi_resetn的值为“pulse”。

pulse_d1pulse_d2为高的0的第二个上升沿,s_axi_clk保持高位,s_axi_resetn变高。因此,pulse的值为“pulse_d1”。

pulse_d20为高的pulse_d2的上升沿,StringBuilder output = new StringBuilder(); using (XmlReader reader = XmlReader.Create(new StreamReader(value))) { bool isValue = false; while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "Value") { isValue = true; } if (reader.NodeType == XmlNodeType.Text && isValue) { output.AppendLine((output.Length == 0 ? "" : ", ") + reader.Value); isValue = false; } } } import urllib.request class AppURLopener(urllib.request.FancyURLopener): version = "Mozilla/5.0" opener = AppURLopener() response = opener.open('http://store.nike.com/us/en_us/pw/mens-clothing/1mdZ7pu?ipp=120') print(response.read()) 保持高位。因此, <div id = "wrapper"> <div id = "header"> </div> <div id = "navigation"> </div> <div id = "image"> </div> <div id = "repairs"> </div> <div id = "whitespace"> </div> <div id = "footer"> </div> </div> 的值为“#wrapper{ width:100%; height:100vh; background-color: black; margin:0; padding:0; } #header{ width:100%; height:4vh; background-color: #ededed; } #navigation{ width:100%; height:16vh; background-color:white; } #image { width:100%; height:30vh; background-image:url("image.png"); } #repairs { width:100%; height:20vh; background-color:green; } #whitespace{ width:100%; height:20vh; background-color:purple; } #footer{ width:100%; height:10vh; background-color:blue; } ”。

因此,这种设计是一种检测复位失效的方法,并通过 // regular forward node var x0 = d.source.x + d.source.dx, x1 = d.target.x, xi = d3.interpolateNumber(x0, x1), x2 = xi(curvature), x3 = xi(1 - curvature), y0 = d.source.y + d.sy + d.dy / 2, y1 = d.target.y + d.ty + d.dy / 2; return "M" + x0 + "," + y0 + "C" + x2 + "," + y0 + " " + x3 + "," + y1 + " " + x1 + "," + y1; 上的单个时钟周期脉冲来发信号。

答案 1 :(得分:1)

您引用的代码是同步边缘检测器的示例 - 请参阅,例如this on my company's website

这用于检测某些信号的边沿,而不是时钟,因此同步设计

  

要使设计同步

     
      
  1. 所有触发器应始终从同一边沿计时   相同的时钟
  2.   
  3. 应该没有锁存器
  4.   
  5. 应该没有组合反馈
  6.   

如果您使用代码

实现了边缘检测器
if (s_axi_resetn'event and s_axi_resetn = '0')
然后,这将合成到由信号s_axi_resetn计时的触发器。你刚刚违反规则#1,你的设计不再同步。

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