打印
[FPGA]

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

[复制链接]
1438|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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级图:

从上图的RTL级图可以看出,有一个指令译码器,来决定输出信号out的最后输出值。
       以上就是本篇**的全部内容。如有疑问,可发私信与我。




相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

26

帖子

1

粉丝