检测信号(非clk)上跳沿的问题,高手帮帮小弟吧!
在这里,我检测的信号是Hsync,Hsync是input信号,我是这样写的:
always @ (posedge clk or negedge rst)begin
if (rst) begin
Hsync_reg1<=0;
end
else begin
Hsync_reg1<=Hsync;
end
end
assign H_cout_s =Hsync&(~Hsync_reg1);
如果检测到H_cout_s为1,那么就说明Hsync有个上跳沿。
但是使用modelsim仿真,Hsync_reg1,Hsync两个信号居然同时跳转,也就是说这两个信号是一样的,我觉得Hsync_reg1要比Hsync晚一个时钟才对,请高手指教。
网上一些检测上跳沿的程序用了2个寄存器,我觉得这样是多余的。
灌水 啊啊
复位信号的级性?
代码写的有问题,
always @ (posedge clk or negedge rst)begin
这里用的是异步复位,低电平有效,
if (rst) begin
Hsync_reg1<=0;
end
但是这里却是高电平有效。
应该是:
always @ (posedge clk or negedge rst)begin
if (!rst) begin
Hsync_reg1<=0;
end
else
....
end
和复位信号没有什么关系吧,我试了一下,还是一样的~哎,我只是想知道:
我明明在clk下面把Hsync给了Hsync_reg1,Hsync_reg1应该比Hsync晚一个时钟才对?
而我仿真的结果是他们的波形完全一样。
还是谢谢您的回复!
这个延迟还是对着Clk看吧,是不是没有放大,给人错觉是没有延迟
可以帮你的仿真代码和波形截图贴出来看看,应该会延迟一个周期的啊
你用的是功能仿真吧?而且Hsync信号的上跳沿刚好和时钟的上跳沿差不多?你可以将Hsync信号的上跳沿放到离时钟上跳沿远一点的位置试一试!
有可能是这种情况:你做的应该是前仿,正好Hsync在clk上升沿到来的时候起来了,所以看起来Hsync和Hsync_reg是一致的。
你把Hsync的上升沿放在别的地方,比如说clk的下降沿附近,就能看出来了
对啊,很有可能是前仿时候,如果你的信号时testbench给出的,有可能信号比clk早一个delta跳变,所以clk上跳时候信号已经变了,结果reg之后结果只比输入信号晚2个delta,这个反映在波形图里就是同时变化。解决方法:输入信号不要在时钟沿变化。或者testbench中信号经过clk同步之后输入
这样做有问题,除非你的输入信号是clk驱动的。
建议多加一级寄存器,这样可以比较好的实现
小编不要不经思考就说什么用两个寄存器检测上升或者下降沿是无用,浪费的;如果你真认真去查了就应该知道这样做是为了防止亚稳态的一种办法
正解啊
另外,别写完了就丢到仿真器里面去仿。
自己先琢磨一下,你写的每一句,每一段实现什么功能,最好能自己画出来!把中间变量拎出来出来看。
你说说的一起跳变,原因,很简单,你自己加的激励在仔细查一下,Hsync 这个信号的变化时间一定是和clk上沿很近了。
功能模拟不会出现你说的问题,带延时的话到可能是穿透。肯定是你看错了
而且你又没说Hsync是不是clk域的,要是异步的,没对太准,你看花了也有可能。
现在你的问题跟检测不检测上沿完全没关系,完全就是你怀疑时序非阻塞赋值都出问题了,Hsync_reg1<=Hsync
要不你就是看成H_cout_s 和Hsync了,这倒是部分正确的,会一起升,不一定一起降
同步问题
让Hsync信号在远离时钟上升沿的位置变高,这样才能有效果
最好用2次 时钟延迟信号,
Q1 <= Hsync ;
Q2 <= Q1;
然后再进程外对Q1和Q2取组合逻辑
这主要是modelsim功能仿真的问题,你的做法是没有问题的,你用QuartusII自带的那个直接仿真,肯定没问题,哈
Hsync也是同一个时钟域的吗?是不是Hsync对clk而言是个异步信号?
如果不是同一个时钟域,那么当Hsync的变化非常接近clk的上升沿的时候,你在波形上就会看到2个信号一起变化了。这种情况下,把波形发大也许可以看到延迟。
最好把你Hsync的driver那一部分的code也贴出来
恩,看看!
同意12#, 17#, 23#, 你的Hsync不是clk驱动的,也就是说是异步的,或者是一个input pin,就会有这种问题,可以多加一级ff来解决~~~
这个检测应该做2个delay才行吧
http://www.cnblogs.com/ifys/archive/2010/11/02/edge.html
这有个vhdl的。
学习了,谢谢
囧……这个……你代码有问题,
Hsync_reg1<=Hsync;这条语句虽然说时非阻塞赋值,但是在一个alway中就完成赋值了,所以当执行assign H_cout_s =Hsync&(~Hsync_reg1)的时候,Hsync_reg1和Hsync是相同的值,这也就是为什么你在仿真中会发现这两个信号是一样的原因了。
用两个寄存器才是王道……
always @ (posedge clk or negedge rst)begin
if (rst) begin
Hsync_reg1<=0;
end
else begin
Hsync_reg1<=Hsync;
Hsync_reg2<=Hsync_reg1;
end
end
assign H_cout_s =Hsync_reg1&(~Hsync_reg2);
Hsync_reg1存的是此刻Hsync的值,Hsync_reg2存的是上一刻Hsync的值,如果H_cout_s=1说明是上跳沿。
不要误导别人。如果是同步信号,一个寄存器就够了。
最好还是把波形放大看,对着clk的上升沿看一下。
