学习Verilog HDL语言过程中关于三种常用赋值语句的困惑!

正在学习Verilog HDL语言,学习过程中遇到困惑,就是在Verilog 中讲到了有三种常用的赋值语句,一个是连续赋值语句assign,一个是阻塞赋值语句=,一个是非阻塞赋值语句<=,请问这三个到底有什么区别,在实际编程中,各应该怎样使用?
什么情况下,用“assign”连续赋值语句?
什么情况下,用“=”阻塞赋值语句?
什么情况下,用“<=”非阻塞赋值语句?

最好每个都用实例来说明,谢谢!

assign 只能给wire类型的变量赋值,而且它只能用来实现组合逻辑,它的赋值必须用=号。assign赋值语句不能放在alway里面。

对一个变量赋值,如果在always外面,只能用“assign wire_name = ……”或者parameter的格式。如果在always里面,有两种情况。
(1)如果多个变量被赋值的时候,是需要同时的,那么就用<=
(2) 如果多个变量被赋值的时候,需要有先后次序,那么就用=

通俗来讲,就像是3个人到ATM取钱的时候,(1)是有3台ATM,这三个人同时开始,同时取完;(2)是这3个人排队一个一个取。
但是对rtl仿真来讲,可以认为(1)和(2)的执行是“瞬间”完成的,即它们计算的时间为0.
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-12-16
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的执行结果本回答被提问者采纳
第2个回答  2010-09-07
Verilog HDL 中赋值语句分“assign”连续赋值语句和过程赋值语句(阻塞赋值语句和非阻塞赋值语句在)。
连续赋值操作取决于表达式右侧变量是否变化,只要右侧变化,就会进行赋值操作;主要用于端口变量的赋值,也可用在组合逻辑的行为描述中。
阻塞赋值语句将阻塞进程,直到该赋值事件执行完才执行下一条语句;这种语句只能满足数据的一般传送。
非阻塞赋值语句直到整个块的操作完成才一次完成赋值操作。这是一种并行机制,能够实现自动跟踪赋值。如时序逻辑电路中。
第3个回答  2010-09-07
请注意 verilog是硬件语言,你在写代码的时候 要非常知道你写的将会变成什么东西,而不是软件的思维

assign 是给组合逻辑赋值
= 组合逻辑使用
<= 时序逻辑使用 也就是寄存器
第4个回答  2010-09-05
多看看书吧,你这个问题回答者很累人,呵呵,这方面的书很多的
相似回答