以下是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);
答案 0 :(得分: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
为高的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。
这用于检测某些信号的边沿,而不是时钟,因此同步设计。
要使设计同步
- 所有触发器应始终从同一边沿计时 相同的时钟
- 应该没有锁存器
- 应该没有组合反馈。
醇>
如果您使用代码
实现了边缘检测器if (s_axi_resetn'event and s_axi_resetn = '0')
然后,这将合成到由信号s_axi_resetn
计时的触发器。你刚刚违反规则#1,你的设计不再同步。
由于各种原因,真正的设计不太可能完全同步。但是,您应该尽量减少同步设计的离开次数,任何离开都应该让您在夜间保持清醒。因此,您应始终使用同步边沿检测器来检测信号上的边沿,而不是将该信号连接到触发器的时钟输入。