Verilog 高级知识点

news2024/12/25 0:45:31

目录

Verilog 高级知识点

1、阻塞赋值(Blocking)

2、非阻塞赋值(Non-Blocking)

3 、assign 和 always 区别

4、什么是 latch


Verilog 高级知识点

       本节给大家介绍一些高级的知识点。高级知识点包括阻塞赋值和非阻塞赋值、assign 和 always 语句差异、什么是锁存器、状态机、模块化设计等。

1、阻塞赋值(Blocking)

       阻塞赋值,顾名思义即在一个 always 块中,后面的语句会受到前语句的影响,具体来说就是在同一个 always 中,一条阻塞赋值语句如果没有执行结束,那么该语句后面的语句就不能被执行,即被阻塞也就是说 always 块内的语句是一种顺序关系,这里和 C 语言很类似。符号“=”用于阻塞的赋值(如:b = a;),阻塞赋值“=”在 begin end 之间的语句是顺序执行,属于串行语句。

       在这里定义两个缩写:

  • RHS:赋值等号右边的表达式或变量可以写作 RHS 表达式或 RHS 变量;
  • LHS:赋值等号左边的表达式或变量可以写作 LHS 表达式或 LHS 变量;

       阻塞赋值的执行可以认为是只有一个步骤的操作,即计算 RHS 的值并更新 LHS,此时不允许任何其他语句的干扰,所谓的阻塞的概念就是值在同一个 always 块中,其后面的赋值语句从概念上来讲是在前面一条语句赋值完成后才执行的。

       为了方便大家理解阻塞赋值的概念以及阻塞赋值和非阻塞赋值的区别,我们这里以在时序逻辑下使用阻塞赋值为例来实现这样一个功能:在复位的时候,a=1b=2c=3;而在没有复位的时候,a 的值清零,同时将 a 的值赋值给 bb 的值赋值给 c,代码以及信号波形图如下图所示:

        代码中使用的是阻塞赋值语句,从波形图中可以看到,在复位的时候(rst_n=0),a=1b=2c=3;而结束复位之后(波形图中的 0 时刻),当 clk 的上升沿到来时(波形图中的 2 时刻),a=0b=0c=0。这是因为阻塞赋值是在当前语句执行完成之后,才会执行后面的赋值语句,因此首先执行的是 a=0,赋值完成后将 a 的值赋值给 b,由于此时 a 的值已经为 0,所以 b=a=0,最后执行的是将 b 的值赋值给 c,而 b 的值已经赋值为 0,所以 c 的值同样等于 0

2、非阻塞赋值(Non-Blocking

       符号“<=”用于非阻塞赋值(如:b <= a;),非阻塞赋值是由时钟节拍决定,在时钟上升到来时,执行赋值语句右边,然后将 begin-end 之间的所有赋值语句同时赋值到赋值语句的左边,注意:是 begin—end 之间的所有语句,一起执行,且一个时钟只执行一次,属于并行执行语句。这个是和 C 语言最大的一个差异点,大家要逐步理解并行执行的概念。

       非阻塞赋值的操作过程可以看作两个步骤:

  • 1)赋值开始的时候,计算 RHS
  • (2)赋值结束的时候,更新 LHS

       所谓的非阻塞的概念是指,在计算非阻塞赋值的 RHS 以及 LHS 期间,允许其它的非阻塞赋值语句同时计算 RHS 和更新 LHS

       我们下面使用非阻塞赋值同样来实现这样一个功能:在复位的时候,a=1b=2c=3;而在没有复位的时候,a 的值清零,同时将 a 的值赋值给 bb 的值赋值给 c,代码以及信号波形图如下图所示:

        代码中使用的是非阻塞赋值语句,从波形图中可以看到,在复位的时候(rst_n=0),a=1b=2c=3;而结束复位之后(波形图中的 0 时刻),当 clk 的上升沿到来时(波形图中的 2 时刻),a=0b=1c=2。这是因为非阻塞赋值在计算 RHS 和更新 LHS 期间,允许其它的非阻塞赋值语句同时计算 RHS 和更新 LHS。在波形图中的 2 时刻,RHS 的表达是 0ab,分别等于 012,这三条语句是同时更新 LHS,所以 a、b、c 的值分别等于 012

       在了解了阻塞赋值和非阻塞赋值的区别之后,有些朋友可能还是对什么时候使用阻塞赋值,什么时候使用非阻塞赋值有些疑惑,在这里给大家总结如下。

       在描述组合逻辑电路的时候,使用阻塞赋值,比如 assign 赋值语句和不带时钟的 always 赋值语句,这种电路结构只与输入电平的变化有关系,代码如下:

       在描述时序逻辑的时候,使用非阻塞赋值,综合成时序逻辑的电路结构,比如带时钟的 always 语句;这种电路结构往往与触发沿有关系,只有在触发沿时才可能发生赋值的变化,代码如下:

always @(posedge sys_clk or negedge sys_rst_n) begin 
     if (!sys_rst_n) begin 
          a <= 1'b0; 
          b <= 1'b0; 
     end 
     else begin
          a <= c; 
          b <= d; 
     end 
end

3 、assign always 区别

       assign 语句和 always 语句是 Verilog 中的两个基本语句,这两个都是经常使用的语句。

       assign 语句使用时不能带时钟。

       always 语句可以带时钟,也可以不带时钟。在 always 不带时钟时,逻辑功能和 assign 完全一致,都是只产生组合逻辑。比较简单的组合逻辑推荐使用 assign 语句,比较复杂的组合逻辑推荐使用 always 语句。

示例如下:

assign counter_en = (counter == (COUNT_MAX - 1'b1)) ? 1'b1 : 1'b0; 
always @(*) begin
     case (led_ctrl_cnt) 
         2'd0 : led = 4'b0001;
         2'd1 : led = 4'b0010;
         2'd2 : led = 4'b0100;
         2'd3 : led = 4'b1000;
         default : led = 4'b0000;
     endcase
end

带时钟和不带时钟的 always

        always 语句可以带时钟,也可以不带时钟。在 always 不带时钟时,逻辑功能和 assign 完全一致,虽然产生的信号定义还是 reg 类型,但是该语句产生的还是组合逻辑。

reg [3:0] led;
always @(*) begin
      case (led_ctrl_cnt) 
           2'd0 : led = 4'b0001;
           2'd1 : led = 4'b0010;
           2'd2 : led = 4'b0100;
           2'd3 : led = 4'b1000;
           default : led = 4'b0000;
      endcase
end

       在 always 带时钟信号时,这个逻辑语句才能产生真正的寄存器,如下示例 counter 就是真正的寄存器。

//用于产生 0.5 秒使能信号的计数器
always @(posedge sys_clk or negedge sys_rst_n) begin
      if (sys_rst_n == 1'b0)
           counter <= 1'b0;
      else if (counter_en)
           counter <= 1'b0;
      else
           counter <= counter + 1'b1;
end

4、什么是 latch

       latch 是指锁存器,是一种对脉冲电平敏感的存储单元电路。锁存器和寄存器都是基本存储单元,锁存器是电平触发的存储器,寄存器是边沿触发的存储器。两者的基本功能是一样的,都可以存储数据。锁存器是组合逻辑产生的,而寄存器是在时序电路中使用,由时钟触发产生的。

       latch 的主要危害是会产生毛刺(glitch),这种毛刺对下一级电路是很危险的。并且其隐蔽性很强,不易查出。因此,在设计中,应尽量避免 latch 的使用。

       代码里面出现 latch 的两个原因是在组合逻辑中,if 或者 case 语句不完整的描述,比如 if 缺少 else 分支,case 缺少 default 分支,导致代码在综合过程中出现了 latch解决办法就是 if 必须带 else 分支,case 必须带default 分支。

      大家需要注意下,只有不带时钟的 always 语句 if 或者 case 语句不完整才会产生 latch,带时钟的语句 if 或者 case 语句不完整描述不会产生 latch。

      下面为缺少 else 分支的带时钟的 always 语句和不带时钟的 always 语句,通过实际产生的电路图可以看到第二个是有一个 latch 的,第一个仍然是普通的带有时钟的寄存器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

合宙Air724UG Cat.1模块硬件设计指南--ADC接口

ADC接口 简介 ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。 合宙Cat.1模块ADC接口主要用来检测模拟电压信号量&#xff0c;用于电池电压检测&#xff0c;温湿度检测&#xff0c;TDS检测等应用。 特性 ADC精度&#…

华为OD机试真题 JavaScript 实现【素数之积】【2022Q4 100分】

一、题目描述 RSA加密算法在网络安全世界中无处不在&#xff0c;它利用了极大整数因数分解的困难度&#xff0c;数据越大&#xff0c;安全系数越高。 给定一个32位正整数&#xff0c;请对其进行因数分解&#xff0c;找出是哪两个素数的乘积。 二、输入描述 一个正整数num …

【自动文摘】BART实现finetune及evaluate

文章目录 BART介绍下游任务 fine tune BART介绍 我最近在看自动文摘相关的预训练模型&#xff0c;BART模型是2019-2020左右提出来的&#xff0c;首先介绍下它的基本情况。 论文&#xff1a;https://arxiv.org/abs/1910.13461 github&#xff1a; fairseq例子&#xff1a;http…

Efficient Global 2D-3D Matching for Camera Localization in a Large-Scale 3D Map

文章目录 Efficient Global 2D-3D Matching for Camera Localization in a Large-Scale 3D Map1. 相似源码choose_solution.pyeight_point.pyepipolar_match.py Efficient Global 2D-3D Matching for Camera Localization in a Large-Scale 3D Map 1. 相似源码 由于paper并没…

ChatGPT带火的提示工程师,构造自己的提示语

ChatGPT是一个大语言模型&#xff0c;学过全球几乎公开的大部分有效知识库&#xff0c;它什么都懂。 ChatGPT的风靡&#xff0c;爆火了一个年薪百万的提示工程师这个新就业岗位。 提示工程师&#xff0c;也就是AI训练师&#xff0c;即通过与AI交互写出相关提示&#xff0c;以帮…

Spring Boot进阶(48):SpringBoot之集成WebSocket及使用说明 | 超级详细,建议收藏

1. 前言&#x1f525; 对于很多小伙伴来说&#xff0c;项目现在都普遍前后端分离&#xff0c;各干各的事儿&#xff0c;在前后端进行服务调用才会有大面积的碰头&#xff0c;后端接口数据格式发生变更要通知前端&#xff0c;相反&#xff0c;前端有变化要告诉后端&#xff0c;这…

【这小文章绝了!】一文看穿,MATLAB | 数组与矩阵超详细入门进阶必须看

目录 介绍 一、数组的创建和操作 通过 : 创建一维数组 通过logspace函数创建一维数组 通过linspace函数创建一维数组 二、数组的运算 数组的关系运算 数组的逻辑运算 三、矩阵 矩阵的构造 矩阵的下标引用 矩阵大小 四、矩阵元素的运算 矩阵的差分 矩阵运算 矩阵…

Spring Boot进阶(50):Spring Boot如何全局统一处理异常?| 超级详细,建议收藏

1. 前言&#x1f525; 今天和大家讨论的是Spring Boot如何统一处理异常。这里先说一下我们为什么需要全局统一处理异常&#xff1f;其实理由很简单&#xff0c;因为程序在运行的过程中&#xff0c;不可避免会产生各种各样的错误。比如说用户传过来的参数不正确&#xff0c;无法…

4端到端协议-4.2【实验】【计算机网络】

4端到端协议-4.2【实验】【计算机网络】 前言推荐4端到端协议4.2 TCP协议流捕获与TCP协议分析实验目的实验内容及实验环境实验原理实验过程实验过程演示 4.2.1实验章节测验一.单选题&#xff08;共5题,25.0分&#xff09;二.阅读理解&#xff08;共1题,70.0分&#xff09;三.填…

xxl-job核心源码解析

xxl-job源码解析 如何自研一个xxljob 注册服务调度服务RPC组件(基建&#xff0c;底层严重依赖)日志服务告警服务 系统架构 执行流程 各大调度中心对比 1&#xff09;服务端启动流程 首先找到配置类 XxlJobAdminConfig 可以发现该类实现 InitializingBean接口&#xff0c;…

openpose保姆级教程代码详细解析——训练部分

一&#xff1a;前言 OpenPose是一个基于深度学习的人体姿势估计库&#xff0c;它可以从图像或视频中准确地检测和估计人体的关键点和姿势信息。OpenPose的目标是将人体姿势估计变成一个实时、多人、准确的任务。它的原理部分已经在上一篇非常详细的讲解了——本节介绍训…

Dynamic .NET TWAIN 8.3.3 for NetCore Crack

用于 WinForms 和 WPF 应用程序的扫描仪和网络摄像头捕获 SDK 适用于 .NET 应用程序的简单高效的扫描和网络摄像头 SDK Dynamsoft 的 Dynamic .NET TWAIN 是一个基于 TWAIN 和 DirectShow 标准的 .NET 文档成像 SDK。它为扫描仪和网络摄像头软件开发提供了丰富、高效且…

修改依赖包下的子依赖版本,前端项目安全扫描出来的漏洞——解决过程

为什么要升级&#xff0c;如图云桌面&#xff08;相当于堡垒机-远程桌面&#xff09;的项目审查是大概基于node16版本进行扫描的&#xff0c;本来我方是通过降版本从14到12绕过大范围更新&#xff0c;但现在躲得过初一躲不过十五&#xff0c;如何更新 package-lock.json 中的一…

DAY24:二叉树(十四)二叉搜索树中的插入操作+删除二叉搜索树中的节点(二叉树结构修改难点)

文章目录 701.二叉搜索树中的插入操作思路递归法如何保证连接的节点就是空节点的父节点&#xff1f; 迭代法迭代法注意debug测试 450.删除二叉搜索树中的节点&#xff08;坑较多&#xff0c;注意复盘&#xff09;思路最开始的写法debug测试1.使用了释放后的空间ERROR: AddressS…

通知!2023年湖北住建厅七大员新考和继续教育要求有变化了?启程别

通知&#xff01;2023年湖北住建厅七大员新考和继续教育要求有变化了&#xff1f;启程别 湖北住建厅七大员新考以及继续教育的相关要求都即将有一些变化了目前在征集意见的阶段&#xff0c;具体实施等后续具体通知 对于新考的变化主要是&#xff1a; 1.由原先报名之后只需要完成…

Vue中如何进行颜色选择与调色板

Vue中如何进行颜色选择与调色板 颜色选择和调色板是Web开发中常用的功能&#xff0c;它们可以帮助用户选择或调整颜色。Vue作为一个流行的JavaScript框架&#xff0c;提供了一些工具和库&#xff0c;可以方便地实现颜色选择和调色板功能。本文将介绍如何在Vue中进行颜色选择和…

【aspose-words】Aspose.Words for Java模板语法详细剖析

文章目录 前言&#x1f34a;缘由aspose-words模板语法再了解 &#x1f3af;主要目标实现3大重点 &#x1f381;快速链接&#x1f348;猜你想问如何与狗哥联系进行探讨1.关注公众号【JavaDog程序狗】2.踩踩狗哥博客 &#x1f36f;猜你喜欢文章推荐 正文&#x1f34b;aspose-word…

mfc140.dll丢失的解决方法,解析mfc140.dll这个文件

其实大部分人在使用计算机过程中&#xff0c;您可能会遇到mfc140.dll丢失的错误提示。这个错误会导致一些应用程序无法正常运行&#xff0c;那么要如何解决这个问题呢&#xff1f;今天小编就来给大家详细的解析mfc140.dll这个文件以及教大家 mfc140.dll丢失的解决方法。 目录 …

【算法与数据结构】349、LeetCode两个数组的交集

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;使用了一个哈希数组记录nums1出现的数字&#xff0c;然后遍历nums2&#xff0c;找到hash数组为1的值就…

Vue-Element-Admin项目学习笔记(6)Vuex状态管理

前情回顾&#xff1a; vue-element-admin项目学习笔记&#xff08;1&#xff09;安装、配置、启动项目 vue-element-admin项目学习笔记&#xff08;2&#xff09;main.js 文件分析 vue-element-admin项目学习笔记&#xff08;3&#xff09;路由分析一:静态路由 vue-element-adm…