Board logo

标题: FPGA实践笔记(七)—verilog组合逻辑描述用assign或者always@(*)的区别和值得注意之处 [打印本页]

作者: wxg1988    时间: 2013-1-21 09:02     标题: FPGA实践笔记(七)—verilog组合逻辑描述用assign或者always@(*)的区别和值得注意之处

  verilog描述组合逻辑一般常用的有两种:assign赋值语句和always@(*)语句。两者之间的差别有:
    1. 被assign赋值的信号定义为wire型,被always@(*)结构块下的信号定义为reg型,值得注意的是,这里的reg并不是一个真正的触发器,只有敏感列表为上升沿触发的写法才会综合为触发器,在仿真时才具有触发器的特性。
    2. 另外一个区别则是更细微的差别:举个例子,
    wire a;
      reg b;
   assign a = 1'b0;
   always@(*)
       b = 1'b0;
    在这种情况下,做仿真时a将会正常为0, 但是b却是不定态。这是为什么?verilog规定,always@(*)中的*是指该always块内的所有输入信号的变化为敏感列表,也就是仿真时只有当always@(*)块内的输入信号产生变化,该块内描述的信号才会产生变化,而像always@(*) b = 1'b0;
    这种写法由于1'b0一直没有变化,所以b的信号状态一直没有改变,由于b是组合逻辑输出,所以复位时没有明确的值(不定态),而又因为always@(*)块内没有敏感信号变化,因此b的信号状态一直保持为不定态。事实上该语句的综合结果有可能跟assign一样(本人没有去尝试),但是在功能仿真时就差之千里了。
作者: TLP291    时间: 2013-1-21 10:13






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0