Verilog中阻塞赋值与非阻塞赋值的区别

2023-11-04

        最近有初学者会问阻塞(=)和非阻塞(<=)到底是有什么区别?

         可能确实有很多的文档对这两种语法的定义展开性讲的已经很天花乱坠,但是对于刚刚学习Verilog语法的小伙伴来说,确实有些绕,这边向大家总结一下个人对这两种赋值的一些简单想法。

        1. 在组合逻辑中,“=” 与 “<=”是完全相同的,但是assign赋值建议zhineng)使用阻塞赋值(“=”);

        2.在always语句中,同一信号不建议一会使用“=”、一会使用“<=”;

        3.在时序逻辑中,建议统一使用非阻塞赋值的方式进行电路的设计。

        这里主要以第三条时序逻辑给大家分析一下阻塞和非阻塞情况下的RTL视图:

  

module test(
    input           i_sys_clk,
    input           signal_in,
    
    output          out_reg
    );
    
    
reg r_d1, r_d2, r_d3;    
 
assign  out_reg = r_d3;
    
always@(posedge i_sys_clk)
begin    
    r_d1 <= signal_in   ;
    r_d2 <= r_d1        ;
    r_d3 <= r_d2        ;
end
    
endmodule

  首先是在时序逻辑电路中,使用非租塞赋值综合前和综合后生成的RTL视图

        

        就以综合后的RTL视图可以看出,非租塞赋值的代码为一个级联电路,非阻塞赋值的左边为下一级的输出。我们再把代码改为阻塞赋值,看一下综合前与综合后的RTL视图:

module test(
    input           i_sys_clk,
    input           signal_in,
    
    output          out_reg
    );
    
    
reg r_d1, r_d2, r_d3;    
 
assign  out_reg = r_d3;
    
always@(posedge i_sys_clk)
begin    
    r_d1 = signal_in   ;
    r_d2 = r_d1        ;
    r_d3 = r_d2        ;
end
    
endmodul

 

 

         其实,根据RTL视图结合代码我们可以猜测到,为什么使用阻塞赋值后,我们的电路就没有了级联关系了。因为使用阻塞赋值,相当于只是将输入信号的值赋值给了最好的r_d3,前面的r_d1和r_d2只是相当于一个缓冲器并没要参与级联关系,所以RTL给我们优化掉了另外两个寄存器。

总结:

        1. 在assign语句中推荐大家使用阻塞赋值也就是我们的“=”;

        2.在always语句中建议大家使用非阻塞赋值也就是“<=”;

        3.特别是在时序逻辑电路中一定要使用非阻塞赋值“<=”,延迟一个时钟周期。

        当然这只是我个人目前学习FPGA的一些个人理解,希望对大家有些帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Verilog中阻塞赋值与非阻塞赋值的区别 的相关文章

  • Quartus II 安装

    本次介绍使用的 Quartus 版本为 10 1 目前 Quartus II 官网已经没有 13 1 以下版本的安装包 大家可以安装 13 1 以上版本的软件 功能都是大同小异 下载地址 FPGA Software Download Cen
  • 【Xilinx Vivado时序分析/约束系列6】FPGA开发时序分析/约束-IO时序输入延时

    目录 源同步FPGA输入时序分析的模型 input delay约束 极限input delay 往期系列博客 源同步FPGA输入时序分析的模型 以下为源同步FPGA输入时序分析的模型的示意图 在之前的文章中介绍过 在此介绍一下各个时钟延时的
  • DDR的VTT有源端接和无源端接(slua886a笔记)

    DDR的VTT有源端接和无源端接 slua886a笔记 背景 对于DDR的VTT端接 一直有说法是有源端接可降低功耗 之前一直没仔细理解其中原因 现在找了些相关的资料来介绍和对比有源和无源端接 理解有源端接的优点和降低功耗的原理 主要基于读
  • Vivido添加pynq-Z2开发板

    一 下载pynq z2开发板文件 下载地址 https www tulembedded com FPGA ProductsPYNQ Z2 html 二 将下载的文件解压到vivado安装的位置 如果boards目录下面没有boards fi
  • HDLBits — Verilog Practice(每日一题)

    HDLBits Verilog Practice 每日一题 一 Getting Started 1 Getting Started 一 Getting Started 1 Getting Started 问题描述 Build a circu
  • 【FPGA入门】第八篇、FPGA驱动VGA实现动态图像移动

    目录 第一部分 实现效果 第二部分 动态VGA显示的原理 1 将动态显示的区域提前进行赋值 2 图像块的移动是每张图片叠加后的效果 3 如何实现图像块位置的改变 第三部分 系统结构和驱动波形 1 系统的Top down结构 2 图像块移动的
  • 二、RISC-V SoC内核注解——译码 代码讲解

    tinyriscv这个SoC工程的内核cpu部分 采用经典的三级流水线结构进行设计 即大家所熟知的 取值 gt 译码 gt 执行三级流水线 另外 在最后一个章节中会上传额外添加详细注释的工程代码 完全开源 如有需要可自行下载 上一篇博文中注
  • SD卡读写实验(SPI模式)

    对于 SD 卡的 SPI 模式而言 采用的 SPI 的通信模式为模式 3 即 CPOL 1 CPHA 1 在 SD 卡 2 0 版 本协议中 SPI CLK 时钟频率可达 50Mhz SD 卡的 SPI 模式 只用到了 SDIO D3 SP
  • 笔试

    文章目录 前言 40 复位电路设计 1 recovery time和removal time 2 同步复位和异步复位 3 异步复位同步释放 本文参考 往期精彩 前言 嗨 今天来学习复位电路设计相关问题 微信关注 FPGA学习者 获取更多精彩
  • 数码管电子时钟

    文章目录 前言 一 回顾数码管 二 任务描述 三 系统框图 四 模块调用 五 模块原理图 六 工程源码 6 2 时钟计数模块代码 6 2 数码管驱动模块代码 6 3 顶层模块代码 七 仿真测试 7 1 测试代码 7 2 仿真结果 八 管脚信
  • FIFO读写控制

    如果在两个模块之间传输数据 两个模块之间的处理速率不同 会导致采集数据的遗漏或错误 在他们之间加一个数据缓存器 所有数据先经过缓存器缓存 再输入数据接送模块 创建两个模块 一个 作为发送模块 一个作为接受模块 发送模块检测到 fifo为空开
  • 握手2倍速率进,一倍速率出[verilog]

    module two to one parameter WORD LEN 33 input clk input arst input 2 WORD LEN 1 0 i din input i din valid output o din r
  • FPGA提示产生latch的报错

    在fpga的设计中有时会遇到 latch 的报错 1 latch是什么 Latch 就是锁存器 是一种在异步电路系统中 对输入信号电平敏感的单元 用来存储信息 锁存器在数据锁存使能时 数据被锁存 输入信号不起作用 这违背了组合逻辑中输出随输
  • Verilog之assign

    Verilog中的关键词assign主要用于如下两个地方 数据流建模 用于数据流建模的显示连续赋值语句语法格式如下
  • 八段数码管动态显示(输入数据为BCD编码)

    八段数码管动态显示 输入数据为BCD编码 一 数码管概述 图1 八段共阴数码管内部等效原理图 图2 八段共阳数码管内部等效原理图 上面两图分别是对应八段共阴 共阳的数码管内部等效图 共阴是将八个LED数码管的阴极连接在一起接低 阳极segm
  • FPGA_时钟显示(时钟可调)

    1 实验说明 在数码管显示数据的基础上 让六位数码管显示数字时钟 并且通过按键可以对时间进行修改 实验目标 六位数码管分别显示时间的时分秒 且通过按键可实现加减调整时间及清零功能 key1 切换键 选择待调整的时间单位 时 分 秒 key2
  • FPG—VGA显示器字符显示(附代码)

    目录 1 实操 1 1 字符取模 1 2 顶层模块 1 3 图像数据生成模块 1 3 1 模块框图 1 3 2 波形图绘制 1 3 3 代码编写 1 3 4 仿真验证 2 总结 本例程大部分与VGA显示驱动内容相同 只是显示部分改变了 故此
  • 画时序图软件——TimeGen和Timing Designer下载

    在写实验报告的时候需要画波形图 但是手头没有很好的软件 就上网搜了一些 分享出来 这里分享的是TimeGen和Timing Designer两个软件 资源均来自网上 有侵权请联系 TimeGen使用和安装都比较简单 我发的应该里面有破解方法
  • 无线网络管理系统与无线路由器的区别

    第5章 波形发生器软件设计 本章我们将介绍系统的软件设计 系统中控制软件占有很重要的地位 它不仅要产生波形数据 控制波形的发生 还要控制显示电路和键盘电路 因此系统软件的好坏直接决定着系统的功能和稳定 5 1软件的总体结构 在本系统中 由于
  • Vivado ILA的debug信息保存与读取

    保存 write hw ila data D Project FPGA ILA Debug Data 202401041115 ila upload hw ila data hw ila 1 读取 display hw ila data r

随机推荐

  • 刷脸支付降低实现数字商业的难度

    移动支付和银行卡支付没有办法确定使用者到底是谁 因为可以和家人等共同使用 刷脸支付可以确定消费实体是谁 定位到具体人确定数据标签 一位新零售从业者认为 刷脸支付除了提供更便捷的支付服务外 还可以提供更多的商业数据用于精细化经营 从垂直领域来
  • Java并发基础知识

    基础概念 什么是进程和线程 进程是程序运行资源分配的最小单位 是具有一定独立功能的程序关于某个数据集合上的一次运行活动 进程是系统进行资源分配和调度的一个独立单位 线程是 CPU 调度的最小单位 必须依赖于进程而存在 与同属一个进程的其 他
  • CUDA之矩阵乘法——globalmemory

    CUDA 矩阵乘法 使用global memory 报错 错误 17 error no instance of overloaded function cudaMalloc matches the argument list E Niki
  • Python requests实现图片上传接口自动化测试

    最近帮别人写个小需求 需要本地自动化截图 然后图片自动化上传到又拍云 实现自动截图非常简单 在这里就不详细介绍了 主要和大家写下 如何通过Python requests实现上传本地图片到又拍云服务器 话不多说 因为我们要使用requests
  • Linux——FTP服务器搭建及访问

    FTP是文件传输协议的英文简称 其用于Internet上的控制文件的双向传输 同时 他也是一个应用程序 基于不同的操作系统有不同的FTP应用程序 而所有这些应用程序都遵守同一种协议以传输文件 互联网上提供文件存储进而访问服务的计算机 他们依
  • 自研一个简易版本的OkHTTP

    一 背景 为了彻底搞明白okhttp原理 仿照okhttp自研一个 二 思路 业务上没发出一个request 使用AsyncCall包装起来 然后在网络分发器的作用下 执行具体的每一个Call 这些具体的Call会经过层层的拦截器 最终会调
  • ref使用之react / react hook

    在react典型的数据流中 props传递是父子组件交互的一种方式 通过传递一个新的props值来使子组件重新render 从而达到父子组件通信 某些情况下 例如和第三方的dom库整合 或者某个dom元素focus等 为了修改子组件我们可能
  • 已解决:Navicat 1046 - UDAL - No database selected

    解决方法 1 在常规选项中填入正确的数据库信息 测试连接通过 2 在数据库选项中 勾选 使用自定义数据库列表 gt gt 添加数据库到列表 gt gt 输入数据库名 gt gt 确定 3 搞定
  • redis scan反向二进制位迭代原理

    scan反向二进制位迭代原理 顺序遍历会有什么问题 在Redis中 key是使用Hash结构存储的 使用链表法解决hash冲突 需要遍历所有的key最直观的想法就是遍历hash数组 假设数组长度为8 则从0 7遍历取值即可 但hash是会自
  • Linux之PXE高效批量网络装机

    目录 一 PXE批量部署部署的优点 1 规模化 2 自动化 3 远程实现 二 PXE使用服务 服务端 客户端 三 基本部署过程 四 PXE装机需要的四大文件 五 实验 一 PXE批量部署部署的优点 1 规模化 同时装配多台服务器 2 自动化
  • 2022年Java面试题整理

    一 Java基础部分面试题 1 Java面向对象的三个特征 封装 对象只需要选择性的对外公开一些属性和行为 继承 子对象可以继承父对象的属性和行为 并且可以在其之上进行修改以适合更特殊的场景需求 多态 允许不同类的对象对同一消息做出响应 2
  • 浅析三极管工作状态

    1 NPN三极管输出特征曲线 2 NPN三极管工作状态 2 1 截止 发射结反偏 集电结反偏 UBE lt 0 7V 发射结反偏 UCE gt UBE 集电结反偏 三极管工作在截止状态 当发射结电压Ube小于0 7V的导通电压 发射结没有导
  • python中with...as的用法

    文章内容主要部分来至 http www 360doc com content 16 0905 16 25664332 588595085 shtml with as 就是个python控制流语句 像 if while一样 with as语句
  • SQLi LABS Less-29

    第29关使用GET请求提交参数 在url中构造payload即可 源码中并没有做什么过滤 直接测试注入点即可 在url中输入 1 and true a 源码中的SQL会拼接成下面这样 注释后面的内容不起作用 所以真正执行的SQL是这样的 a
  • Idea 14 最详细创建最简单web项目,并且发布在tomcat

    1 New Project 2 选择Empty Project 然后Next 3 填写Project名称 然后 finish 4 出现如下页面
  • 算法小题4→正整数分解质因数

    题目 将一个正整数分解质因数 例如 输入90 打印出90 2 3 3 5 程序分析 对n进行分解质因数 应先找到一个最小的质数k 然后按下述步骤完成 1 如果这个质数恰等于n 则说明分解质因数的过程已经结束 打印出即可 2 如果n lt g
  • Redis使用总结(三、缓存击穿问题)

    什么是缓存击穿 在谈论缓存击穿之前 我们先来回忆下从缓存中加载数据的逻辑 如下图所示 因此 如果黑客每次故意查询一个在缓存内必然不存在的数据 导致每次请求都要去存储层去查询 这样缓存就失去了意义 如果在大流量下数据库可能挂掉 这就是缓存击穿
  • MATLAB求解函数极值及函数图像

    MATLAB具有求解函数极值以及函数图像的功能 简单举一个例子 求解上述函数极值与图像 1 驻点求解 syms x gt gt y 3 x 2 4 x 4 x 2 x 1 gt gt dy diff y gt gt xz solve dy
  • 防火墙旁挂,策略路由引流

    1 案例拓扑图 2 核心设备AR2的主要配置 2 1AR2 acl number 2000 rule 5 permit source 192 168 1 0 0 0 0 255 匹配需要过滤的路由 traffic classifier li
  • Verilog中阻塞赋值与非阻塞赋值的区别

    最近有初学者会问阻塞 和非阻塞 lt 到底是有什么区别 可能确实有很多的文档对这两种语法的定义展开性讲的已经很天花乱坠 但是对于刚刚学习Verilog语法的小伙伴来说 确实有些绕 这边向大家总结一下个人对这两种赋值的一些简单想法 1 在组合