assign 只能给wire类型的变量赋值,而且它只能用来实现组合逻辑,它的赋值必须用=号。assign赋值语句不能放在alway里面。
对一个变量赋值,如果在always外面,只能用“assign wire_name = ……”或者parameter的格式。如果在always里面,有两种情况。
(1)如果多个变量被赋值的时候,是需要同时的,那么就用<=
(2) 如果多个变量被赋值的时候,需要有先后次序,那么就用=
通俗来讲,就像是3个人到ATM取钱的时候,(1)是有3台ATM,这三个人同时开始,同时取完;(2)是这3个人排队一个一个取。
但是对rtl仿真来讲,可以认为(1)和(2)的执行是“瞬间”完成的,即它们计算的时间为0.
1、=左边是wire类型,可在定义时用“assign”连续赋值语句;
例如:
wire[7:0] a;
input[7:0] c,d;
assign a=c+d;
则在后面的程序中要用到c+d的值就可以直接用a来表示了
这对模块间的互联非常有用
“=”阻塞赋值语句,相当于串行语句,即所有该类在所在模块内按顺序执行
“<=”非阻塞赋值语句,相当于并行语句,当该语句所在模块结束时,所有带“<=”的语句同时执行。
例如:
if(ena)
begin
a<=c;
a=b;
c=d;
end
若执行前,a=0,b=1,c=1,d=0,
则可以这样理解执行顺序和结果 :先执行a=b,得到a=0,再执行c=d,得到c=0;
当该条件语句执行完时,得到a==c==0的执行结果
Verilog HDL 中赋值语句分“assign”连续赋值语句和过程赋值语句(阻塞赋值语句和非阻塞赋值语句在)。
连续赋值操作取决于表达式右侧变量是否变化,只要右侧变化,就会进行赋值操作;主要用于端口变量的赋值,也可用在组合逻辑的行为描述中。
阻塞赋值语句将阻塞进程,直到该赋值事件执行完才执行下一条语句;这种语句只能满足数据的一般传送。
非阻塞赋值语句直到整个块的操作完成才一次完成赋值操作。这是一种并行机制,能够实现自动跟踪赋值。如时序逻辑电路中。
请注意 verilog是硬件语言,你在写代码的时候 要非常知道你写的将会变成什么东西,而不是软件的思维
assign 是给组合逻辑赋值
= 组合逻辑使用
<= 时序逻辑使用 也就是寄存器
多看看书吧,你这个问题回答者很累人,呵呵,这方面的书很多的