verilog非阻塞赋值
时间: 2023-08-15 20:07:15 浏览: 236
Verilog 非阻塞赋值(Non-blocking Assignment,简称“<=”)是一种并发赋值语句,它可以用于描述时序逻辑。与阻塞赋值(Blocking Assignment)不同的是,非阻塞赋值语句的执行不会直接影响到当前的时钟周期,而是在下一个时钟周期开始时才会生效。
例如,下面是一个简单的 Verilog 代码片段,使用非阻塞赋值语句来描述一个 D 触发器:
```
always @(posedge clk) begin
q <= d;
end
```
在上述代码中,当时钟上升沿到来时,非阻塞赋值语句 `q <= d;` 会被执行,将输入信号 `d` 的值赋给输出信号 `q`。由于这是一个非阻塞赋值语句,因此该操作不会直接影响到当前时钟周期的输出,而是在下一个时钟周期开始时生效。
需要注意的是,当出现多个非阻塞赋值语句时,它们的执行顺序是不确定的,因此需要使用阻塞赋值语句(Blocking Assignment,简称“=”)来保证执行顺序。例如,下面是一个简单的 Verilog 代码片段,使用阻塞赋值语句和非阻塞赋值语句来描述一个 4 位计数器:
```
always @(posedge clk) begin
count <= count + 1; // 非阻塞赋值语句
if (count == 4'd15) begin
reset = 1; // 阻塞赋值语句
count <= 0; // 非阻塞赋值语句
end else begin
reset = 0; // 阻塞赋值语句
end
end
```
在上述代码中,首先使用非阻塞赋值语句 `count <= count + 1;` 来实现计数器的计数功能。当计数器的值达到 15 时,使用阻塞赋值语句 `reset = 1;` 将复位信号置为 1,并使用非阻塞赋值语句 `count <= 0;` 将计数器清零。最后,使用阻塞赋值语句 `reset = 0;` 将复位信号置为 0,以便下一次计数。
阅读全文