fpga有一个信号自动拉低
我用的软件是ISE13.1.芯片是spartan3a。
请教一个非常蹊跷的问题。
代码如下:
reg flag;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
flag <= 0;
else if(full_pulse)
flag <= 1;
else if(color == 2'd3)
flag <= 0;
else
;
end
full_pulse是一个脉冲,color是一个颜色计数。
问题是,有的情况下,当full_pulse使flag = 1之后,flag又立刻变成0,而此时rst_n一直是1的,color也没有加到3,就是说让flag变成0的条件并没有满足。
为什么flag会自动拉低呢?
非常感谢!
这种很多if else if else if.....语句里面赋值很容易出问题,还有敏感变量里面用negedge rst_n产生的是异步电路,最好改成
if( xxx )
flag <= 0;
else if( xxx ) 或 else( xxx )
flag <= 1;
数字设计应该坚持同步设计原则,以保证电路的可靠性。目前full_pulse 来自另外一个clock domain, 而且是一个脉冲,而不是电平。这种情况下,你可以采用toggle synchronizer [Ref 1] 来处理,以在新的clock domain 中能产生一个完整的脉冲。 目前你所遇到这种情况,可能是因为你在cross clock domain 后,又经过一系列组合逻辑,会产生毛刺。在同步设计的情况下,毛刺不是问题,但是在异步cross clock domain 情况下,就会引起误触发 Ref: [1] Practical design for transferring signals between clock domains, By Michael Crews and Yong Yuenyongsgool, Philips Semiconductors, EDN Magazine, Feb, 2003
可以把 full_pulse加到关键列表中,做一个同步电路试试。使用modelsim或者quartus自带的仿真程序仿真下试试。
该电路就你说明的很明显,按常规是如你想象的那样,但我担心一点:
full_pulse == 1 而 结果还是等于0
为什么?
分析一下:
不应该以full_pulse==1作为所有的条件,必须把时钟上升沿考虑进来
总结:
电路中的条件是:
1. full_pulse == 1;
2. 时钟上升沿;
两条件相与,缺一不可! 请检查你的电路。
确认一下你仿真抓的是你这个模块的rst信号
将<=改成=,也许是因为你用的是非阻塞赋值方式
