fpga有一个信号自动拉低

2019-07-16 01:07发布

大家好,
      我用的软件是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是一个颜 {MOD}计数。
        问题是,有的情况下,当full_pulse使flag = 1之后,flag又立刻变成0,而此时rst_n一直是1的,color也没有加到3,就是说让flag变成0的条件并没有满足。
        为什么flag会自动拉低呢?
        非常感谢!
   

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
z00
1楼-- · 2019-07-16 05:31
这种很多if else if else if.....语句里面赋值很容易出问题,还有敏感变量里面用negedge rst_n产生的是异步电路,最好改成

           if( xxx )
                flag <= 0;
           else if( xxx ) 或 else( xxx )
                flag <= 1;
z00
2楼-- · 2019-07-16 07:07
数字设计应该坚持同步设计原则,以保证电路的可靠性。目前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

评分

参与人数 1威望 +1 +1 收起 理由 中华小虾 + 1 + 1 很有道理。非常感谢。

查看全部评分

youzizhile
3楼-- · 2019-07-16 08:57
可以把  full_pulse加到关键列表中,做一个同步电路试试。使用modelsim或者quartus自带的仿真程序仿真下试试。
camp
4楼-- · 2019-07-16 13:04
 精彩回答 2  元偷偷看……
乐百事
5楼-- · 2019-07-16 18:06
确认一下你仿真抓的是你这个模块的rst信号
jjj0701
6楼-- · 2019-07-16 18:48
将<=改成=,也许是因为你用的是非阻塞赋值方式

一周热门 更多>