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

相关推荐
范纹杉想快点毕业4 小时前
12个月嵌入式进阶计划ZYNQ 系列芯片嵌入式与硬件系统知识学习全计划(基于国内视频资源)
c语言·arm开发·单片机·嵌入式硬件·学习·fpga开发·音视频
迎风打盹儿6 小时前
一种无需IP核的FPGA RAM初始化方法:基于源码定义与赋值实现
fpga开发·verilog·vivado·ram·rom
建筑玩家8 小时前
从零开始Verilog编写AXI FULL MASTER协议并读写ZYNQ DDR3
fpga开发
hazy1k21 小时前
51单片机基础-IO扩展(并转串 74HC165)
stm32·单片机·嵌入式硬件·fpga开发·51单片机·1024程序员节
9527华安1 天前
全国产化方案实现NVMe over 100G RDMA,解决智算超算中“存算”不匹配问题
fpga开发·nvme·rdma
碎碎思1 天前
FPGA新闻速览-从漏洞到突破:FPGA技术在安全、架构与量子领域
安全·fpga开发
FPGA_ADDA1 天前
100%全国产化4路125M FMC子卡
fpga开发·fmc子卡·全国产·4路ad采集·国产ad9653
国科安芯1 天前
抗辐照MCU芯片在激光雷达领域的适配性分析
网络·人工智能·单片机·嵌入式硬件·fpga开发
数字IC吗喽1 天前
三、ILA逻辑分析仪抓取及查看波形
fpga开发
bnsarocket1 天前
Verilog和FPGA的自学笔记8——按键消抖与模块化设计
笔记·fpga开发·verilog·自学·硬件编程