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的最后输出值。
以上就是本篇文章的全部内容。如有疑问,可发私信与我。
复制代码
一周热门 更多>