assign 与always@(*)的区别和联系

2020-02-03 10:12发布

assign 与always@(*)的区别和联系

      今天早上刷牙洗脸时,突然脑洞大开,想到这个语法问题——assign 与always@(*)这两个同为组合逻辑到底有什么相同点和不同点。下面详细讨论这两个问题:
     1、相同点
         assign和always@(*)同为组合逻辑,用阻塞赋值"="进行赋值;下面举一个例子来说明
                               assign out=en?a:1'bz;
                               /***************************/
                              reg out;
                              always @(*)
                                    begin
                                           if(en)
                                                out=a;
                                           else out=1'bz;
                                   end
         上面这两条语句综合后的RTL图如下:
                              
      从上面的两个语句的RTL图可以看出:两条语句的RTL级图是一样的,功能是一样的。只是语法上是不同的。以上就是它们的相同点。
  2、不同点:
        由于篇幅有限,在这里我主要说下它们最大的区别。assign语句后面只能加一条语句,(如:assign out=en?a:1'bz;),而always@(*)可跟块语句begin······end。后者可实现更为复杂的组合逻辑设计。再华丽丽的语言也抵不过具体的实例说明,下面我用一个例子来说明如何使用always@(*)来实现一个复杂的组合逻辑。
reg out;
always @(sel or a)
        begin
                case(sel)
                        1'b0:out=1'bz;
                        1'b1:out=a;
                        default:out=1'bz;
                endcase
        end
下面是此段代码的RTL级图:
always_example.jpg
从上图的RTL级图可以看出,有一个指令译码器,来决定输出信号out的最后输出值。
       以上就是本篇文章的全部内容。如有疑问,可发私信与我。




复制代码
0条回答

一周热门 更多>