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

相关推荐
Riwuarua3 小时前
从近似0基础开始FPGA开发——Part.25:GT 高速收发器架构与 KU5P 资源规划
fpga开发·架构
星夜离尘566 小时前
FPGA 三点中值滤波:不补零、不丢背压样本的流式实现
fpga开发
hexiaoyan82715 小时前
互联卡设计方案:504-PCIE X16 金手指 FPGA Aurora协议互联卡
fpga开发·测试载板·互联卡·fpga aurora协议·夹板连接器·板卡互联
星夜离尘5615 小时前
FPGA 二进制数如何变成十进制显示:可背压的逐位 BCD 转换器
fpga开发
匠行科技15 小时前
基于VPX架构的4路10GSPS ADC信号采集处理板
fpga开发
幻智星科技2 天前
蒙哥马利模乘FPGA优化实战
fpga开发·密码学
星夜离尘562 天前
FPGA 多通道 DAC 目标码影子寄存器:成组提交、同拍写入与快照边界
fpga开发
t_niu_niu2 天前
基于多帧累加平均的图像传感器暗电流抑制方法与 FPGA 实现
fpga开发·ram·fpn·固定模式噪声·image sensor
幻智星科技2 天前
FPGA纯硬件UDP桥接:微秒级响应新范式
c++·fpga开发·硬件架构
小蘇的FPGA2 天前
基于FPGA实现PCIe H2C过程中TAG的一种管理方法
fpga开发