当前位置: 首页 > news >正文

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

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

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

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

特点

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

示例

示例 1

module blink_led(input wire a,output wire b
);assign b = a;endmodule

在这里插入图片描述

示例 2

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 @(*)块中使用。

示例 :

  • 这个代码,阻塞赋值与下边的非阻塞赋值电路一样
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)beginout =2'b0;d =0;    endelse beginout =d+c;d =a+b;endendmodule

ISE的RTL Schematic

在这里插入图片描述
在这里插入图片描述

vivado的 Schematic

在这里插入图片描述

更换两句的顺序

在这里插入图片描述

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)beginout =2'b0;d =0;    endelse begind =a+b;out =d+c; // 这里的 out 使用更新后的 d 值,电路图中少一一个寄存器endendmodule

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)beginout =2'b0;d =0;    endelse begind <=a+b;out <=d+c;// 这里的 out 使用更新前的 d 值endendmodule
vivado

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

手绘示例

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.对比与应用场景

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

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

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

CG

  • https://www.bilibili.com/video/BV1va411c7Dz?p=11
http://www.lryc.cn/news/355064.html

相关文章:

  • 大白话DC3算法
  • 力扣HOT100 - 75. 颜色分类
  • Vue.js - 计算属性与侦听器 【0基础向 Vue 基础学习】
  • 技术速递|使用 C# 集合表达式重构代码
  • 我的世界开服保姆级教程
  • [转载]同一台电脑同时使用GitHub和GitLab
  • 【网络协议】【OSI】一次HTTP请求OSI工作过程详细解析
  • springboot vue 开源 会员收银系统 (2) 搭建基础框架
  • Java进阶学习笔记26——包装类
  • 【JavaEE进阶】——要想代码不写死,必须得有spring配置(properties和yml配置文件)
  • 第十四 Elasticsearch介绍和安装
  • YOLOv10介绍与推理--图片和视频演示(附源码)
  • Java实验08
  • MyBatis复习笔记
  • HTML的基石:区块标签与小语义标签的深度解析
  • Windows域控简介
  • 项目延期,不要随意加派人手
  • 帝国CMS验证码不显示怎么回事呢?
  • 【必会面试题】Redis 中的 zset数据结构
  • 括号匹配数据结构
  • c语言:strcmp
  • 传统关系型数据库与hive的区别
  • windows-386、windows-amd64、windows-arm64这三者有什么区别?
  • 链表经典题目—相交链表和链表倒数第k个节点
  • Java 写入 influxdb
  • npm的基本命令和用法
  • Python 基于深度图、RGB图生成RGBD点云数据
  • 力扣刷题--LCR 075. 数组的相对排序【简单】
  • 机器学习笔记——K近邻算法、手写数字识别
  • 基于STM32实现智能园艺系统