完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
大家好,
我用的软件是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会自动拉低呢? 非常感谢! |
|
相关推荐
6个回答
|
|
这种很多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信号
|
|
|
|
将<=改成=,也许是因为你用的是非阻塞赋值方式
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1421 浏览 1 评论
1215 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
1426 浏览 0 评论
913 浏览 0 评论
2229 浏览 0 评论
1427 浏览 34 评论
5612 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 09:21 , Processed in 0.695450 second(s), Total 91, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号