对于阻塞赋值和非阻塞赋值,概念烦人,难记,直接看例子吧,一句话就能搞定(个人理解)随便写一个always块,初始化我就不写了,a,b都为零。
这个是非阻塞赋值(不用管什么名字,知道怎么用就行),一个上升沿之后,a=1,b=0
always@(posedge clk)begin
a <=1;
b <=a;
end
这个是阻塞赋值(不用管什么名字,知道怎么用就行),一个上升沿之后,a=1,b=1
always@(posedge clk)begin
a =1;
b =a;
end
总结 两种情况对赋值常数的没有影响,对赋值变量的会有影响,再具体一些总结:“<=”这种赋值就是看进入always块之前"<="右边是什么值左边就被赋什么值,看第一个例子,第一次进入always之前,a等于零所以b被赋值为零。而“=”赋值,就是看进入always块运算之后是多少,就赋值多少,看第二个例子,进入always之后,a = 1了,所以b = 1。不用去管什么概念,名字,认清楚符号就行了。
举例:
初始值a,b,c为0
always@(posedge clk)begin
a <= 1;
b <= a;
c <= b;
end
第一次进入之前初始值a,b,c为0,第一次进入之后a=1,b=0,c=0;
第二次进入之前a=1,b=0,c=0,第二次赋值a=1,b=1,c=0;
第三次进入之前a=1,b=1,c=0,第三次赋值a=1,b=1,c=1;
看进入always之前的值
初始值a,b,c为0
always@(posedge clk)begin
a = 1;
b = a;
c = b;
end
不看进入之前,直接进入赋值,a = 1 ,运行完之后运行第二个,b = a = 1,c = b =1。
看运算之后的值
这样还不能理解,就写代码写代码写代码,看仿真看仿真看仿真。