论坛» 嵌入式开发» FPGA

FPGA有一个信号不受控制自动拉低

助工
2013-11-27 16:29 1楼
大家好,
我用的软件是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会自动拉低呢?

非常感谢!
高工
2013-11-27 23:04 2楼

这种很多if else ifelse if.....语句里面赋值很容易出问题,还有敏感变量里面用negedge rst_n产生的是异步电路,最好改成

if( xxx )
flag <= 0;
else if( xxx ) 或 else( xxx )
flag <= 1;



助工
2013-11-28 15:43 3楼
你的else之后是什么,最好将if else语句补充完整! 也可以用modelsim做个仿真看看!
助工
2013-12-02 17:33 4楼
我怎么记得回过了 在什么情况下出现的,仿真?板子? full_pulse和clk的关系是? color 和clk的关系是?
菜鸟
2013-12-03 16:45 5楼
最后一个else后边没有其他情况,我就写了else ;
菜鸟
2013-12-04 15:40 6楼
color都是与clk的上升沿产生的。full_pulse是由另一个比clk小点的时钟clk1产生的。这个我没说清楚。clk是125M,clk1是100m。我认为是100m产生的脉冲宽度比125m大,所以125m是一定会采集到full_pulse进行其它操作的。请问我这个想法是不是有问题呢?
菜鸟
2013-12-09 17:38 7楼
是的,您的想法有些问题。因为数字设计应该坚持同步设计原则,以保证电路的可靠性。目前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
助工
2013-12-16 14:42 8楼
太谢谢您了。这个问题我仿真也查不出来,逻辑上怎么看都正确。还是没有足够的数字设计知识。总之,非常感谢!
助工
2013-12-17 17:46 9楼
你125M去采一个100M的脉冲是够呛的。 然后,也要有跨时钟域的处理。 这就是我问你那些问题的原因。 你仿真出不来,是因为你仿真时候给的100M和125M 信号的相位关系是不出错的情况。你改变一下他们之间的相位关系……就能出现问题了。 另外,你所做的仿真,只是功能仿真,所以是不应该来检查这类错误的。 这类型的错误,应该是从编码规范,设计原则来杜绝。 检查工具有0-in 的CDC检查
助工
2013-12-18 14:17 10楼
采样定理可是要求2倍的规则啊

共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]