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)

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

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类型信号,描述组合逻辑。
    • 过程赋值 :用于reginteger等类型信号,描述组合或时序逻辑。
  2. 阻塞赋值 vs. 非阻塞赋值

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

CG

相关推荐
liuluyang5306 小时前
SV中#和##的区别与用法
fpga开发·sva
404是NotFound呀10 小时前
[FPGA] Ubuntu 22.04 安装 Vivado 2023.1 和 PetaLinux 踩坑记录
linux·ubuntu·fpga开发
liuluyang53012 小时前
SV中if与iff区别与用法
fpga开发·sv
高速上的乌龟13 小时前
Lattice LFCPNX-100 HSB+Fpga开发详解:2.2 Marvell MV-Q3244 Phy的Podl电路详解
单片机·嵌入式硬件·fpga开发·软件工程
zlinear数据采集卡17 小时前
深入底层:从SAR ADC原理到模拟前端设计,解析高精度数据采集卡的硬件架构
c语言·前端·嵌入式硬件·fpga开发·自动化·硬件架构
夜幕下的灯火18 小时前
基于 FPGA 的 SD 卡音频播放与电子琴系统
fpga开发·毕业设计·课程设计·fpga·altera
weiweiliulu18 小时前
FPGA和MATLAB仿真测试常会用的语句
fpga开发
FPGA_小田老师2 天前
PCIe XDMA数据传输:三种工作模式详解(ARM发起 → FPGA自主)
fpga开发·pcie·xdma·c2h·fpga触发传输
GateWorld2 天前
LCD显示技术完全指南:原理·制造·驱动·FPGA实现之驱动四
fpga开发·lcd显示·fpga点亮屏幕·minilvds·fpga点屏
喵喵苗2 天前
【Vivado2024.2】纯PL端128×128 Sobel边缘检测IP封装 | 单AXI4-Stream接口设计与仿真验证
人工智能·fpga开发