FPGA|CPLD|ASICwilliam hill官网
直播中

yhz

5年用户 21经验值
私信 关注
[问答]

verilog的if语句问题


新手
如图是代码和时序图。程序功能   是每个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)

xiaohui

2018-11-28 17:45:41

最佳答案

这个就是时序逻辑和组合逻辑的区别了,也就是为什么我们在很多时候在时序逻辑赋值的时候会加一个延时,仅仅就是为了让仿真看上去更舒服。实际上如下所示,b是会在时钟的上升沿的之后一点点的位置才有效的,而仿真工具因为是理想状态,所以所有的delay都是按照0来计算的所以这个延时无限小,但是也还是在时钟延后面才有效的,所以cr在这拍时钟延的位置必然无效,只有下一拍才能触发到b的变化。而你这边的dr是组合逻辑,组合逻辑不需要时钟关系,只要条件有效,结果马上翻转。
clk ---------             ----------             ----------            ------------
                |            |          |           |          |           |             |
                ------------           ----------            ----------              ------------
b                              --------------------------------------------------------------
                                |
    ------------------------
cr                                                    ---------------------
                                                      |                       |
  ---------------------------------------------                        -------------------
1 举报

李娓仑

2018-11-28 18:44:12
建议先看下Verilog里面几个幅值语句的先后吧
举报

邹九发

2018-12-1 15:29:51
always敏感信号不可以同时包括同一个信号的上升沿和下降沿
举报

668301

2018-12-8 17:21:32
b 的上升沿触发又有下降沿的触发这是不对的
举报

我爱大脸猫

2019-3-27 10:08:23
always语句里面不允许有同一个信号的上升沿和下降沿,你括号里的b信号即有上升沿也有下降沿,就会出现时序错误。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分