文章目录

  • 1. 数据流建模
    • 1.1 连续赋值语句
  • 2. 行为级建模
  • 2.1 过程语句
  • 2.2 语句块
  • 2.3 过程赋值语句
  • **!!!小结**
  • 2.4 过程连续赋值语句
  • 2.5 条件分支语句
    • 2.5.1 if分支语句
    • 2.5.2 case条件分支语句
  • 2.6 循环语句

  • 在电路设计过程中,Verilog HDL有三种程序设计方式:数据流建模,行为级建模,结构化建模
  • 结构化建模就是搭电路,连线这个过程,在硬件描述语言成为模块的调用过程
  • 数据流建模是硬件描述语言非常重要的一种建模方式
  • 行为级建模只会在很局部的时候用到

1. 数据流建模

1.1 连续赋值语句

  • 连续赋值语句只能用来对连线型变量进行驱动,而不能对寄存器型变量进行赋值
  • 它可以采取显式连续赋值语句和隐式连续赋值语句两种赋值方式
  • 在组合电路的描述方式中,一种方式是写出真值表,化出最简逻辑表达式然后用结构进行描述。这个的唯一区别是最后用的是运算符来表达最小项表达式
  1. 显式连续赋值语句
    (就是信号定义和assign分成两条语句)
  2. 隐式连续赋值语句
  • 显示连续赋值举例:
  • 隐式连续赋值举例:
  • !!!连续赋值语句是数字电路中要求掌握非常强的一个东西,对数字电路的基本构成和概念要非常清楚,这样就可以用最小的电路取得这样的效果
  1. !!!需要注意
    (1)赋值目标只能是线网类型(wire)
    (2)在连续赋值中,只要赋值语句右边表达式任何一个变量有变化,表达式立即被计算,计算的结果立即给左边信号(若没有定义延迟量)(连续赋值语句是对组合电路的一个基本的描述,在组合电路中输入发生变化,输出也会随之变化
    (3)连续赋值语句不能出现在过程块中(initial,always)
    (4)多个连续赋值语句之间是并行语句,因此与位置顺序无关
    (5)连续赋值语句中的延时具有硬件电路中惯性延时的特性,任何小于其延时的信号变化脉冲都将被滤除掉,不会体现在输出端口上(器件延迟做的非常小的时候,这时候传统电路的毛刺就有可能会带到输出端。整个电路代表的是电容特性,如果延迟很大,电容就很大,毛刺就被滤掉了,不会对输出电流有影响。但是延迟非常小的话,这个毛刺就会穿过到达输出端。对于连续赋值语句,它可以由#定义延迟。惯性延迟就是干扰信号能允许的一个工作频率范围,惯性延迟小于干扰,干扰就会起作用)

2. 行为级建模

  • 硬件描述语言对于电路设计的语句主要就在行为级建模

  • 行为级建模归结起来只有三条语句:赋值,条件,循环(循环语句不作为行为级建模的主要描述语句)

  • 对于可综合来讲就是什么样的语句能够形成电路,什么样的语句不能形成电路

  • 连续赋值赋值语句能够形成电路,这是没有问题的,牵扯的都是最基本的元器件和语法单元,不会有问题。这样来讲的话,出问题出的最多的就在行为级建模上面

2.1 过程语句

  • Verilog HDL中过程块是由过程语句所组成的。过程语句有两种,分别是initial过程语句和always过程语句。
  1. initial过程语句

    (1)initial语句主要用在仿真和测试
    (2)initial在可综合语句中起到什么作用:初始化。!!电路的初始化是靠复位信号完成的,所以initial语句没有太大用。在语法严格的VHDL里面,它是没有initial语句的,它的全局复位就是用复位信号。在代码中,有人信号把刚上电的置位信号全放在initial里面,这样是非常危险的,如果程序跑掉必须断电重来,如果用的复位信号做的初始化只需要复位重来就行了

  2. always过程语句

  • 敏感时间列表可以没有
  • always 过程语句的触发状态是一直存在的,只要满足 always 后面的敏感事件列表,就执行语句块
  • 两个问题:
    (1)问题1:always语句到底是用来做什么?
    (2)问题2:敏感事件表是个什么情况?
  • 数字电路是停不下来的,一加电流就一直存在,不会因为输入信号没有就停。当信号来的时候就会动,也就是always这样的过程语句是在敏感时间表发生变化的情况下,信号变化的一个过程,这个实际上是对于电路特性的一种作用
  • 敏感事件表的可能性如下:
  • !!!在敏感时间表种不会由与的概念,只有或的概念,因为组合电路任何一个输入变化输出都会变化,这时一个或
  • 对于@(a)来说,当遇到a的上升沿或者下降沿,只要a变化了,输出都会跟着变化,所以@(a)包括了@(posedge a)和@(negedge a)
  • @(a or b)等效于@(a,b),有多少信号往里面or或者,就行了
  1. 过程语句需要注意的问题
  • initial语句不会有什么问题,主要在于always。always牵扯到它的敏感事件表
  • 数据流描述方式来讲的话,加运算符我们可以描述几乎所有的组合电路。但是过程赋值语句放在行为级描述里面,这种方式可以对组合电路进行描述也可以对时序电路进行描述。!!!在这个描述过程种,如果描述的是一个组合电路,所有的输入信号必须全部写在敏感事件表里面,这时由组合电路的基本定义来定的。对于时序电路来说,需要把时间信号和我关心的输入信号全部写在敏感事件表里面
  • $finish语句是HDL的一个系统语句,代表的是结束退出
  • 现在的电路为了节约面积,都把异步复位信号做成了同步(趋势)
  • 时序电路分为同步时序电路和异步时序电路,课程主要讲述的是同步时序电路,异步时序电路用的非常少(主要在心脏起搏器等超低功耗的电路)

2.2 语句块

  • 可综合的硬件描述语言主要集中在过程语句的always语句,串行语句块,赋值语句,条件语句,循环语句很少作为我们可综合电路设计的一个程序设计(这个是和C语言等高级语言是有很大不同的)
  • 语句块包括串行语句块(begin-end)和并行语句块(fork-join)两种。其中串行语句块(begin-end)可以用在可编程的程序设计,而并行语句块(fork-join)主要用在测试和放着
  1. 串行语句块
    (1)串行语句块中的每条语句依据块中的排列次序逐条执行。块中每条语句给出的延时间都是相对于前一条语句执行结束的相对时间
    (2)串行语句块的起始执行时间就是串行语句块中第一条语句开始执行的时间;串行语句块的结束时间就是块中最后一条语句执行结束的时间

  2. 并行语句块
    (1)块内语句是同时执行的,即程序流程控制一进入到该并行语句块,块内语句则同时开始执行
    (2)块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间的

  3. 语句块的使用


  • 串行语句块和并行语句块的对比

2.3 过程赋值语句

  • 过程块中的赋值语句称为过程赋值语句
  • 过程赋值语句有阻塞赋值语句和非阻塞赋值语句两种
  • !!阻塞赋值语句和非阻塞赋值语句主要放在begin…end这种串行程序块中进行讨论,fork-join没有这个概念,fork-join所有语句全是并行化语句
  1. 阻塞赋值语句
    (1)阻寨赋值语句的操作符号为“=”
    (2)阻塞赋值语句有两个特点:
  • 在串行语句块中,各条阻塞赋值语句将按照排列顺序依次执行;在并行语句块中的各条阻寨赋值语句则同时执行,没有先后之分(也就是阻塞赋值只在串行语句块中起作用)
  • 执行阻塞赋值语句的顺序是,先计算等号右端表达式的值,然后立刻将计算的值赋给左边的变量,与仿真时间无关。
  1. 非阻塞赋值语句
    (1)非阴塞赋值语句的操作符号为“<=”
    (2)非阻塞赋值语句有两个特点:
  • 在串行语句块中,各条非阻塞赋值语句的执行没有先后之分,排在前面的语句不会影响到后面语句的执行,各条语句并行执行
  • 执行非阻塞赋值语句的顺序是,先计算右端表达式的值,然后等待延迟时间的结束再将计算的值赋给左边的变量
  1. 非常典型的阻塞和非阻塞实例
    (1)例1:



  • 补充:在数字电路中,学过流水线的概念。实际上,在现在的高性能数字电路中都采用了流水线的概念(具体流水线的概念可以看我数电的博客:https://blog.csdn.net/y_u_yu_yu_/article/details/127641915),在主流处理器来讲,现在的流水线级数能够达到14级以上甚至21级
  • !!非阻塞赋值是一个非常重要的语句,因为在我们的电路设计过程中,穿插流水线的时候,主要采用的是非阻塞型赋值语句来进行
    (2)例2(注意程序(2)实际上一个流水线的应用):

!!!小结

(1)在第一章中,我们说会讲三种语句:连续赋值语句(数据流建模),行为级建模(initial或者always),结构级建模
(2)这三条语句是完全并行的三条语句,没有任何的前后顺序
(3)在行为级建模会有顺序的概念,语句块会用串行语句块(begin-end)和并行语句块(fork-join),fork-join也没有顺序的概念,只有在begin-end有前后的顺序。在begin-end有两条赋值语句,一条是阻塞型赋值语句,一条是非阻塞型赋值语句,对于阻塞型赋值语句,它是一个一个执行下来的,对于非阻塞型赋值语句它又是全并行的。
(4)!!!!硬件描述语言的设计思想:在HDL中,只有在行为级中间的串行语句块中间使用阻塞型赋值语句的时候才是串行的结构

2.4 过程连续赋值语句

  • 连续赋值语句有两种类型:赋值、重新赋值语句(assign、deassign)和强制、释放语句(force、release)

  • 这个语句是不可综合的语句

  • 语法结构:

  • 在语法中force、release比assign、deassign优先级更高

  • 举例:(只是作为语法讲,不建议这么写



  • !!!!起作用的环节:当代码量很大的时候,信号有错误,我们可以用assign、deassign或force、release来把这个信号在某个时刻强制拉到正确的位置,看后面的结果对不对。,所以,这两个语句一般只在超大型系统中使用。

2.5 条件分支语句

  • 是Verilog中唯一一条可以广泛使用的,相对来说比较高级的程序
  • VerilogHDL的条件分支语句有两种:if条件分支语和case 条件分支语句

2.5.1 if分支语句

  • 条件语句只能在 initial和always 语句引导的语句块(begin-end)中使用,模块的其它部分都不能使用
  • if 条件分支语句有三种形式:
  • !!!if-else语句在电路中就是一个二选一的数字选择器,不断的嵌套下去
  • 因为它是一个天然的二选一数据选择器,所有它可以直接综合
  • 例1:

    (1)描述的是一个组合电路,所以所有的输入都要在敏感事件中
    (2)同时,等号左边被赋值的信号一定是reg信号
  • 例2:

    (1)例2描述的电路如下图:

    (2)一共有四个门,两个比较器和两个数据选择器
  • 形式3 是多路选择控制,执行的过程是:首先判断条件表达式 1,若为真则执行语句块1,若为假则继续判断条件表达式 2,然后再选择是否执行语句块 2,依此类推。从条件表达式 1到条件表达式 的排列顺序,可以看出这种形式的条件语句是分先后次序的,本身隐含着一种优先级关系。在实际使用中,有时就需要利用这一特性来实现优先级控制,但有时则要注意避免它给不需要优先级的电路设计带来的影响
  • 在if 语句中允许一个或多个 if 语句的嵌套使用
  • !!!!当嵌套的数量非常多的时候,要写的if-else语句会特别多,这时候显然设计效率是比较低的。对于多个条件分支,如果超过四个,千万不要再用if-else,而要用case

2.5.2 case条件分支语句

  • case 语句是一种可实现多路分支选择控制的语句

  • case语句的真值表:

  • 除了 case 分支语句以外,还有 casez、casex 这两种功能类似的条件分支语句,相应的真值表如下

  • 这三个其实就是在不同情况下用的3个语句
    (1)case语句:其实是一个全等的比较,不光比较0和1,还会比较x和z的状态
    (2)casez语句:只比较0,1,x,当遇到高阻就认为是真
    (2)casex语句:只比较0,1,当遇到x和z就认为是真

  • 对于case需要注意:
    (1)值1到值n 必须各不相同,一旦判断到与某值相同并执行相应语句块后,case 语句的执行便结束
    (2) 如果某几个连续排列的值项执行的是同一条语句,则这几个值项间可用逗号间隔而将语句放在这几个值项的最后一项中
    (3)default 选项相当于 if-else 语句中的else 部分,可依据需要用或者不用,当前面已经列出了控制表达式的所有可能值时,default 可以省略
    (4)case 语句的所有表达式的值的位宽必须相等,因为只有这样,控制表达式和分支表达式才能进行对应位的比较

  • !!!!case语句描述了一种非常关键的组合电路的描述方式,case语句的重要作用就是描述真值表(组合电路)。case语句的第二个作用就是对于有限状态机的描述(时序电路)。这两个作用分别是对组合电路和时序电路完全的描述方式(有真值表肯定就能推出电路)

  • 实际上用一个case语句描述了七个真值表

  • 如果写不好case

  • 如果没有列全也没有default,就会造成输出引脚直接接到输入引脚,这是绝对不允许的

  • !!!这时候就会产生latch这个概念,latch在组合电路中是绝对不允许的

2.6 循环语句

  • 不重要,如果水平很高,完全可以不用循环写出所有语句。所以仅是作为语法来讲
  1. forever
    (1)关键字“forever”所引导的循环语句表示永久循环
    (2)在永久循环中不包含任何条件表达式,只执行无限循环,直至遇到系统任务$finish。如果需要从 forever 循环中退出,则可以使用disable语句
  2. repeat
    关键字“repeat”所引导的循环语句表示执行固定次数的循环

  • !!现在几乎所有的器件都是低功耗器件,时钟网络占数字电路功耗的30%以上,因为它是全局的概念。所以,我们在有一些低功耗设计的时候是需要有的时候给你时钟,在不需要你的时候不给你时钟,所以循环次数在这时候很重要
  1. while
    while 语句根据条件表达式的真假来确定循环体的执行,当指定的条件表达式取值为真时才会重复执行循环体,否则就不执行循环体

  2. for
    关键字“for”所引导的循环语句也表示一种“条件循环”,只有在指定的条件表达式成立时才进行循环


  • !!四条语句尽量不要用在可综合逻辑设计里面,因为这四个语句在硬件里面没有任何意义
  • !!!!但是循环语句是否一定不能用在可综合逻辑设计里面?
    (1)首先理解一个事情,for语句在C语言当中是一个定时的概念,也就是定多少次数。在数字电路中为什么不用循环语句呢?是因为这个次数不是用for来定义的,而是用计数器,所以循环语句没有它存在的任何价值。
    (2)但是for语句在很多程序设计里面又会使用这条语句,那么怎么使用这个语句,我们看一个简单的例子,描述一个移位寄存器
  • 对于程序设计语言,不管是否是可综合的,如果表征的只是一个变量的形式而不是物理意义存在的信号量的时候,是可以用第二种写法的,但是它只是作为一个标号去表述赋值关系上逻辑中的对应关系,没有具体的物理意义

数字集成电路设计(三、Verilog HDL程序设计语句和描述方式)(一)相关推荐

  1. VerilogHDL(1)数字集成电路设计方法概述

    一.数字集成电路设计方法概述 2.什么是硬件描述语言,其主要的作用是什么? 硬件描述语言是一种用形式化方式来描述数字电路和系统的语言. 它的主要作用是:数字电路系统的设计者利用这种语言可以从上层到下层 ...

  2. 数字集成电路设计(一、Verilog HDL数字集成电路设计方法概述)

    文章目录 集成电路发展 HDL产生 HDL分类 Verilog HDL的发展 Verilog HDL与VHDL Verilog HDL在数字集成电路设计中的优点 组合逻辑电路原理图设计和Verilog ...

  3. (23)Verilog HDL条件语句:if-else语句

    (23)Verilog HDL条件语句:if-else语句 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL条件语句:if-else语句 5)结语 ...

  4. (24)Verilog HDL条件语句:case语句

    (24)Verilog HDL条件语句:case语句 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL条件语句:case语句 5)结语 1.2 FP ...

  5. (25)Verilog HDL循环语句:forever

    (25)Verilog HDL循环语句:forever 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL循环语句:forever 5)结语 1.2 ...

  6. (26)Verilog HDL循环语句:repeat

    (26)Verilog HDL循环语句:repeat 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL循环语句:repeat 5)结语 1.2 FP ...

  7. (27)Verilog HDL循环语句:while

    (27)Verilog HDL循环语句:while 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL循环语句:while 5)结语 1.2 FPGA ...

  8. (28)Verilog HDL循环语句:for

    (28)Verilog HDL循环语句:for 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL循环语句:for 5)结语 1.2 FPGA简介 F ...

  9. 数字集成电路设计中------各种工程师职责

    数字集成电路设计实现流程是个相当漫长的过程,拿手机基带芯片为例,对于3G, 4G, 5G, 工程师最初见到的是无数页的协议文档. 架构师要根据协议来确定:协议的哪些部分可以用软件实现,哪些部分需要用硬 ...

最新文章

  1. javascript数组集锦
  2. 主流Kubernetes发行版梳理,看完就会选了
  3. Git--团队开发必备神器
  4. redis简单了解 二 (集群)
  5. 解决mysql不能远程登入的问题
  6. webpack 入门,说一下那些不入流的知识点、module.exports{ } 中配置说明
  7. python有理数_Python中的as_integer_ratio()用于减少给定有理数的分数
  8. code craft_Craft.io调度中使用的重要术语
  9. Spark基础学习笔记07:搭建Spark HA集群
  10. 《基于CapsNet的汉字字形表征模型》文章理解
  11. 搭建ntp时间服务器 ntp - (Network Time Protocol)
  12. SLAM--intel realsense2在ORB SLAM2 和 ORB SLAM3下建图和重定位(ubuntu 20.04, opencv 4.2.0 以上)
  13. 【历史上的今天】5 月 28 日:图灵提交划时代论文;DR DOS 的第一个版本发布;TrueCrypt 停止开发
  14. python 邮件抄送是什么意思_python使用SMTP发邮件时使用Cc(抄送)和Bcc(密送)...
  15. 计算机二级考试真题李阳答案,英语二级笔译_二级笔译培训_二级笔译真题 - 沪江英语...
  16. 自制XILINX FPGA JTAG下载器
  17. 重新定义股票交易中的试错和复盘
  18. 360与腾讯的连横合纵
  19. 内购伪造服务器证书,Xposed绕过元气骑士内购验证
  20. Java定时器Timer和第三方定时器Quartz

热门文章

  1. (13)打鸡儿教你Vue.js
  2. 从零开始的Arduino单片机开发(1):初识Arduino
  3. 栈的应用行编辑数据结构c语言,数据结构题典022:栈的应用——行编辑程序(C语言版)...
  4. aardio工具提示控件的简单实例
  5. ARM GIC(五) ARM TrustZone如何支持安全中断 分析笔记。
  6. centos 一键安装配置nginx脚本
  7. 关于硅胶按键丝印的表面问题及解决办法
  8. 静态词向量预训练模型
  9. 数据库判断关系是第几范式
  10. 004-云E办_学习Oathu2和Spring Security Oauth2