标签:article 多级 -- input 作用 声明 实现 表示 数据
阻塞赋值语句(=)与非阻塞赋值语句(<=)
区别叙述如下:
1、在串行语句中,阻塞赋值语句按照排列顺序依次执行;非阻塞赋值语句没有先后之分,并行执行,排在前面语句不影响后面语句(实质是通过每级之间加一个D触发器实现)。
2、赋值语句执行时,阻塞的先计算右端表达式的值,然后立刻将值赋给左边变量;非阻塞的也是先计算右端表达式的值,但是要等待延时后再将值赋给左边(同样因为D触发器)。文字叙述起来不直观,我们看例子。
例:下面代码实现一个寄存器
**********************************************************
module resist(din,clk,out1,out2,out3);
input din,clk;
output out1,out2,out3;
reg out1,out2,out3;
always@(posedge clk) //上升沿触发
begin
out1=din; // 使用阻塞赋值语句
out2=out1;
out3=out2;
end
endmodule
**********************************************************
测试代码如下:
**********************************************************
module resist_tb;
reg din,clk;
wire out1,out2,out3;
resist U1(din,clk,out1,out2,out3);
always #100 clk=~clk; //时钟周期为200
initial
begin
clk=0; // clk开始为0
din=1;
#350 din=0; // 传递的数据
#400 din=1;
#400 din=0;
#2000 $finish;
end
endmodule
**********************************************************
仿真wave图像:
我们从wave图形上看到out1、out2、out3是完全相同的。
所以实际电路是:
明显电路为一寄存器,不过可以同时输出到out1、out2、out3。
而如若将模型中阻塞赋值语句改为非阻塞赋值语句:
out1=din; out1<=din;
out2=out1; ----> out2<=out1;
out3=out2; out3<=out2;
测试代码不变,仿真后wave图形为:
我们发现out3落后out2一个时钟周期,out2落后out1一个时钟周期;这正是因为非阻塞赋值语句要等待时钟的效果。具体是在一个上升沿到来时,数据din,out1‘,out2‘(‘表示上个时钟时的数据),数据平行(并行)向右移动,out2得到的并不是当前out1,而是上个时钟D触发器存储out1‘(=d‘),当前out1=d,这样out2要得到din就比out1落后一个时钟周期,同样out3与out2相比,这其中就是由于各个D触发器的作用。
实际电路即为:
这两个实质差别就在于非阻塞会引入D触发器,各个数据必须按时钟节拍从左向右传递,而阻塞赋值语句代码从左往右顺序写不会引入多级D触发器。
————————————————
版权声明:本文为CSDN博主「ChunyuY19」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/c_ycy/article/details/53883794
标签:article 多级 -- input 作用 声明 实现 表示 数据
原文地址:https://www.cnblogs.com/hegangben/p/12256579.html