verilog阻塞赋值和非阻塞赋值
简介
- Verilog 编程很容易混淆阻塞赋值和非阻塞赋值。
- always 块中,阻塞赋值使用 “=”,非阻塞赋值使用 “<=”。
- 建议:在时序电路中,用非阻塞赋值 “<=”。
- 建议:在锁存器电路中,用非阻塞赋值 “<=”。
- 建议:在组合逻辑中,用阻塞赋值 “=”。
- 建议:在同一个always 块中不要既用非阻塞赋值又用阻塞赋值。
- 建议只是建议,不是绝对的,要灵活掌握。
- 在一些迭代算法中,阻塞赋值是简化代码的一个非常好的
- 阻塞赋值和我们软件编程有些类似。可以理解成按顺序串行执行的语句(不是并行执行)
数字电路分类:
数字电路简介
- 1:组合逻辑电路,采用没有时钟的门电路组成逻辑电路,没有反馈,简称组合电路。
- 2:时序逻辑电路,用带时钟的寄存器的电路,简称组合电路。
- 3:锁存器逻辑电路,采用没有时钟的门电路组成逻辑电路,有反馈,简称锁存器电路。
举例
注意事项
- 在组合逻辑的电路设计中要避免产生“锁存器逻辑电路”,会破坏代码的逻辑正确。出毛病很难查。
- 比如
reg a,b,c;
- 举例 1
always@(*) //组合逻辑电路
begin
if(b0)
a = 0;
else if(c0)
a= 1;
//在组合逻辑中这里少个 else 会出现锁存器 latch
end
- 举例 2
reg [3:0] x;
reg y;
always@(*) //组合逻辑电路
begin
case (x)
4’b000:y= 0;
4’b001:y= 1;
4’b010:y= 1;
//在组合逻辑中这里少个 default 会出现锁存器 latch
endcase
end
相关连接
- 文章会陆续补充多个 verilog 举例代码,包括一些测试文件