组合逻辑建模时应使用阻塞赋值语句

1、什么是组合逻辑?

  任意时刻的输出仅仅取决于该时刻的输入逻辑。个人认为在verilog中,由与或非门逻辑运算组成的就是组合逻辑。但是组合逻辑什么时候输出就不是组合逻辑含义的范畴了

2、组合逻辑部件有哪些?

  (如多路器、比较器、加法器、乘法器、双向三态门和总线等)电路结构和性能的深入了解,是设计复杂数字逻辑系统的基础。

所以应该认真地复习一下它们的结构和逻辑表达式,并用可综合的verilog模块来表示。

  多路器 

  比较器

  加法器

  乘法器

  双向三态门

  总线

3、单组合逻辑应用阻塞赋值举例

  1、always@(a or b or c or d)

      begin 

        tmp1<=a&b;

        tmp2<=c&d;

        y<=tmp1|tmp2;

      end

    //这里需要说的的是,这是一个组合逻辑电路,但是没有达到我们的期望  

    //因为,这里的tmp1和tmp2是进入always之前的数据,你懂的,并不是我们想要的数据。  

  2、always@(a or b or c or d or tmp1 or tmp2)

      begin 

        tmp1<=a&b;

        tmp2<=c&d;

        y<=tmp1|tmp2;

      end

     //这样虽然实现了功能,但是我们知道他是经过了几重参数传递才实现的。所以效率不高。

  3、always@(a or b or c or d)

      begin 

        tmp1=a&b;

        tmp2 =c&d;

        y =tmp1|tmp2;

      end

    //这样显然是简单正确的。

4、时序和组合的混合逻辑时,使用非阻塞赋值

  1、always@(posedge clk or negedge rst)

      if(!rst)  q<=1'b0;//这是时序逻辑

      else   q<=a^b;//这里的异或是组合逻辑

  2、always@(a or b)

      y=a^b;//组合逻辑(看到组合逻辑就要想到,我们这么写对其他always块会不会有不正确的影响)

    always@(posedge clk or negedge rst)

      if(!rst)  q<=1'b0';

      else   q<=y;

    //也可以用两个always块,你懂的。。。 

5、结论

  1、使用always块描述组合逻辑时,应采用阻塞赋值语句。

    2、在同一个always快中描述时序和组合逻辑电路时,用非阻塞赋值。

摘自:verilog数字系统设计教程

原文地址:https://www.cnblogs.com/qidaiymm/p/4887100.html