verilog的if语句问题

2019-07-15 20:43发布


新手
如图是代码和时序图。程序功能   是每个clk上升沿时检测a值(并存入ar,再将ar的存入b),在clk的上升沿同时执行if语句,使每当if(b)为真时,cr翻转,否则不变。
疑问   但我时序仿真时不理解一个地方(即问题1)。
推测   然后我认为是if(b)进行判断的同时,ar在对b进行赋值。由于只有当赋值结束,b才为1,因此,判断时if(b)不为真,维持原输出。
但好像不对,因为dr的输出立刻翻转了。
还是说由always驱动的/reg赋值/和/if语句块/有先后?时钟上升沿时,先if,再赋值?

问题1.我想不明白当b在上升沿时,为什么cr的输出没有立刻翻转,而是延时一个clk周期后翻转?
问题2.另一个dr的输出只是改变了敏感值里的上升沿触发为b的边沿触发,dr的输出就在b上升沿时立刻翻转了,这和cr的区别在哪?


还请各位帮忙解答一下,非常感谢!





时序 时序
代码 代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
uglyugly
1楼-- · 2019-07-15 21:18
这个就是时序逻辑和组合逻辑的区别了,也就是为什么我们在很多时候在时序逻辑赋值的时候会加一个延时,仅仅就是为了让仿真看上去更舒服。实际上如下所示,b是会在时钟的上升沿的之后一点点的位置才有效的,而仿真工具因为是理想状态,所以所有的delay都是按照0来计算的所以这个延时无限小,但是也还是在时钟延后面才有效的,所以cr在这拍时钟延的位置必然无效,只有下一拍才能触发到b的变化。而你这边的dr是组合逻辑,组合逻辑不需要时钟关系,只要条件有效,结果马上翻转。
clk ---------             ----------             ----------            ------------
                |            |          |           |          |           |             |
                ------------           ----------            ----------              ------------
b                              --------------------------------------------------------------
                                |
    ------------------------
cr                                                    ---------------------
                                                      |                       |
  ---------------------------------------------                        -------------------
最佳答案

评分

参与人数 1积分 +5 收起 理由 yahazadzh + 5 谢谢!

查看全部评分

guotong1984
2楼-- · 2019-07-15 22:48
建议先看下Verilog里面几个幅值语句的先后吧
人微凉
3楼-- · 2019-07-16 03:47
 精彩回答 2  元偷偷看……
aiohu
4楼-- · 2019-07-16 07:42
b 的上升沿触发又有下降沿的触发这是不对的
我爱大脸猫
5楼-- · 2019-07-16 12:16
always语句里面不允许有同一个信号的上升沿和下降沿,你括号里的b信号即有上升沿也有下降沿,就会出现时序错误。

一周热门 更多>