fpga系列 HDL: 05 阻塞赋值(=)与非阻塞赋值(<=)

  • 在Verilog硬件描述语言(HDL)中,信号的赋值方式主要分为两种:连续赋值和过程赋值。每种赋值方式有其独特的用途和语法,并适用于不同类型的电路描述。

1. 连续赋值(Continuous Assignment,assign 和=)

  • 连续赋值 主要用于描述组合逻辑,通常与assign关键字一起使用。它在顶层模块或过程块外部进行,用于对wire类型的信号赋值。

特点:

  • 组合逻辑:连续赋值用于实现组合逻辑,表示输出信号始终等于表达式的值。
  • 实时更新:当右边的表达式中的任何信号发生变化时,左边的信号会立即更新。
  • 信号类型 :通常用于wire类型信号。

示例

示例 1:

c 复制代码
module blink_led(
    input wire a,
    output wire b
);

assign b = a;

endmodule

示例 2:

verilog 复制代码
module combinational_logic (
    input wire a,
    input wire b,
    output wire c
);
    // c 始终等于 a 和 b 的逻辑与
    assign c = a & b;
endmodule

2. 过程赋值(Procedural Assignment)

  • 过程赋值 用于过程块(如always或initial块)内,适用于描述组合逻辑或时序逻辑。过程赋值可以进一步分为两种:阻塞赋值(=)和非阻塞赋值(<=)。

2.1 阻塞赋值(Blocking Assignment,=)

特点 :

  • 顺序执行:阻塞赋值按书写顺序执行,一个语句必须在前一个语句完成后才能执行下一个语句。
  • 阻塞行为:在赋值完成之前,后续的语句不会执行。相当于"阻塞"了后续操作。
  • 主要用于组合逻辑 :通常用于描述组合逻辑,在always @(*)块中使用。

示例 :

  • 这个代码,阻塞赋值与下边的非阻塞赋值电路一样
c 复制代码
module blink_led(
clk,reset_n,a,b,c,out
    );
    input clk;
    input reset_n;
    input a,b,c;
    output reg [1:0] out;
    reg [1:0] d;

    always@(posedge clk or negedge reset_n)
    if(!reset_n)begin
        out =2'b0;
        d =0;    
    end
    else begin
    	out =d+c;
        d =a+b;
    end

endmodule

ISE的RTL Schematic


vivado的 Schematic

更换两句的顺序

c 复制代码
module blink_led(
clk,reset_n,a,b,c,out
    );
    input clk;
    input reset_n;
    input a,b,c;
    output reg [1:0] out;
    reg [1:0] d;

    always@(posedge clk or negedge reset_n)
    if(!reset_n)begin
        out =2'b0;
        d =0;    
    end
    else begin
	   d =a+b;
       out =d+c; // 这里的 out 使用更新后的 d 值,电路图中少一一个寄存器
    end
    
endmodule

ISE的RTL Schematic


ISE的Technology Schematic

vivado

2.2 非阻塞赋值(Non-blocking Assignment,<=)

特点 :

  • 并行执行:非阻塞赋值允许赋值操作并行执行,不必等待前一个语句完成。
  • 主要用于时序逻辑 :通常用于描述时序逻辑,在always @(posedge clk)块中使用。

示例:

复制代码
module mux2(
clk,reset_n,a,b,c,out
    );
    input clk;
    input reset_n;
    input a,b,c;
    output reg [1:0] out;
    reg [1:0] d;

    always@(posedge clk or negedge reset_n)
    if(!reset_n)begin
        out =2'b0;
        d =0;    
    end
    else begin
	   d <=a+b;
       out <=d+c;// 这里的 out 使用更新前的 d 值
    end
    
endmodule
vivado


更换两句的顺序电路图没有改变

手绘示例


3.对比与应用场景

  1. 连续赋值 vs. 过程赋值:

    • 连续赋值 :用于wire类型信号,描述组合逻辑。
    • 过程赋值 :用于reg或integer等类型信号,描述组合或时序逻辑。
  2. 阻塞赋值 vs. 非阻塞赋值:

    • 阻塞赋值 :用于组合逻辑,按顺序执行,通常在always @(*)块中。
    • 非阻塞赋值 :用于时序逻辑,并行执行,通常在always @(posedge clk)块中。

CG

相关推荐
szxinmai主板定制专家2 小时前
基于Zynq的高精度多通道数据采集卡完整解决方案(工业振动/高速采集/边缘传输)
fpga开发·zynq·数据采集卡
szxinmai主板定制专家4 小时前
基于TI AM62x+FPGA的24bit高精度数据采集卡设计(振动/风电/发动机监测)
人工智能·fpga开发·arm+fpga·rk3588+fpga
szxinmai主板定制专家7 小时前
基于 ARM+FPGA 雕刻机控制系统的设计
arm开发·人工智能·fpga开发·rk3576·半导体设备
吉他英雄一里1 天前
zynq入门教程
fpga开发·zynq
XMAIPC_Robot1 天前
RK3576/RK3588+FPGA+AI数据采集系统:实时性与边缘AI算力兼顾
人工智能·fpga开发·机器人·数据采集·rk3588+fpga·rk3576+fpga
156082072192 天前
JFMRFVU3P5G的bit正常,但烧录mcs程序后加载异常
fpga开发
狂奔蜗牛(bradley)2 天前
把 EtherCAT 初始化从 FPGA 搬到 ARM:命令通道的接口设计与11个坑
arm开发·人工智能·fpga开发·架构
女神下凡3 天前
芯参谋(37):EEPROM_电路设计指南
arm开发·单片机·嵌入式硬件·fpga开发·设计规范
szxinmai主板定制专家4 天前
工业视觉新思路:FPGA图像预处理+RK NPU推理,实现高速缺陷检测
人工智能·嵌入式硬件·fpga开发·rk3576+codesys
FPGA小徐4 天前
【硬件实战】立创 EDA 绘制 TF/SD 卡模块电路|SPI 模式原理图 + 阻抗匹配 + PCB 布局布线全教程
单片机·嵌入式硬件·fpga开发