码农知识堂 - 1000bd
Python
PHP
JS/TS
JAVA
C/C++
C#
GO
Kotlin
Swift
数字集成电路设计(三、Verilog HDL程序设计语句和描述方式)(二)
文章目录
3.结构化建模
3.1 模块级建模
3.1.1 模块的调用方式
3.1.2 模块端口对应方式
3.2 门级建模
3.2.1 Verilog HDL基本门级元件的类型
3.2.2 门级模块调用
3.3 开关级建模
3.3.1 MOS开关
3.3.2 双向开关
3.结构化建模
本质上和以前数字电路的原理图输入方法是一致的,特点就是用HDL把所有的模块连接到一起。
用代码连接的好处:
(1)用代码连接比用原理图连接要简单
(2)连线型变量和我们的模块之间的关系会非常清楚
!!语法非常简单,但是在整个硬件描述语言的设计中间,结构化建模的代码占用量是巨大的,远远超过了数据流建模和行为级建模
结构化建模的几种方式:
(1)模块级建模(常用)
(2)门级建模
(3)开关级建模
应当指出的是,开关级建模这种方式是Verilog区别于VHDL的一个重要特点
,换句话说,Verilog能够描述开关级建模,而VHDL是不具备这个方式的
!!门级建模和开关级建模是对基本的门或者开关电路描述的一个过程,也就是我们的设计对象是已有的门级或开关级电路,把他们连在一起的过程,这两种设计方式实际上在大型的程序中,我们用的非常少
!!模块级建模通过调用由用户设计生成的低级子模块来对硬件电路结构进行说明,这种情况下的模块由低级模块的实例组成。硬件描述语言中间,除了底层的设计方式,越往高层发展,主要的越是结构化建模
,把来自于不同设计组件的电路合在一起,形成一个更高级的电路
3.1 模块级建模
模块级建模主要分为两个部分
(1)模块的设计
(2)模块的调用(比较重要)
3.1.1 模块的调用方式
在 Verilog HDL中,模块可以被任何其它模块调用,这种调用实际上是将模块所描述的电路复制并连接。一个模块可以调用多个模块,这些模块可以是相同的,也可以是不同的
一个模块被调用一次
实际上对于模块调用来讲,只需要注意这四个地方就可以了
(1)“模块名”是在 module 定义中给定的模块名,它指明了被调用的是哪一个模块
(2)“参数值列表”是可选项,它是将参数值传递给被调用模块实例中的各个参数
(3)“实例名”是模块被调用到当前模块的标志,用来索引层次化模块建模中被调用模块的位置,就是被调用模块在当前模块的名称
(4)“端口名列表”是被调用模块实例各端口相连的外部信号,所有的输入输出信号的列表
根据不同层次的实例名。可以很快找到目标信号(一般用U代表Utility,也可以自己起名字)
一个模块被调用多次
!!衡量一个硬件描述语言是否写的好,并不是看你代码是否写成简化的样子,而是看你综合之后的电路是否是一个最简结构或者非常有效的一个结构
。所以,虽然定义了这种方式,但是很少这么写
(重要)定义了一个标量模块,但是想矢量调用(
边界调用方式
)
当需要对同–个模块进行多次调用时,还可以采用阵列调用的方式对模块进行调用
举例:
等价于下面的语句
但是可以被一句话替代
!!!!所以,在结构化的描述里,实际上有意义的是模块级的建模,而没有意义的是门级建模,我们在门级建模最常用的方式连续赋值语句,这也是为什么我们讲描述方式的第一个就是连续赋值语句
3.1.2 模块端口对应方式
有两种:端口位置对应,端口名对应
大部分都是位置对应,位置对应非常快,非常简单
!!但是写多了之后会发现位置对应方式是一个非常头疼的方式,对不齐,而且有的时候信号会多或者少。所以一般在工程应用中我们一般采用模块名对应
端口位置对应方式
端口位置对应方式是被调用的模块按照一定的顺序出现在端口连接表中的一种模块调用方式,就是调用时和定义时顺序一致
举例
(1)对于半加器,有两个输入两个输出,输出一个是当前的和,另一个是进位。和位是一个异或的关系,进位是与的关系
(2)半加器可以构成全加器
例子中通过or的方式调用或门,这个后面会讲
端口名对应方式
端口名是用户定义时的端口名称,信号名是连接时的信号名称
有两个好处:
(1)调用名称的顺序可以变化
(2)当有的信号为空的时候可以不写,把端口名写出来,后面括号空着(电路和函数的概念不一样,函数是都要接,但是电路不用的有些可以不接)
!!在大规模电路设计的时候,最好采用模块名对应的方式
不同位宽的匹配
这是一个错误的命题,因为我们在所有的信号使用过程中间,我们对它的位宽要进行严格的定义。这个说的是输入的位宽和模块定义的位宽不匹配。这个在硬件电路设计是一个彻底错误的概念,但是对于Verilog HDL语法,有解决这种问题的语法,
这也是为什么说Verilog的语法结构比较松散
,它经常干这样的事情,但是对电路设计没有帮助
采用右端对齐的方式,没有填进去,多了砍掉
模块参数值
把某些量定义成参数,参数改变,所有相关量全都改了
!!!!当一个模块在另–个模块的内部被实例引用时,较高层次的模块能够通过调用较低层次的模块来改变低层次模块的值。这个功能在实际的设计当中很有用,能够降低程序的复杂度,使程序简化
通过下面两种途径可以改变模块实例的参数值。
(1)使用带有参数的模块实例语句修改参数值
该例中通过在模块 para2 中对模块 para1 的引用,改变了模块 paral 中的参数值,其中语句1是利用位置对应方式将4传给a3传给b,这和模块 para1中定参数的先后顺序有关。而语句2则是利用名称对应方式将 6 传给 b5传给,此时和 para1 模块中参数定义的顺序无关。
(2)使用参数重定义语句 defparam 修改参数值
需要注意的是,“参数名”必须采用分级路径的形式,才能锁定需要修改的参数
3.2 门级建模
门级建模更多的是采用数据流的方式
3.2.1
Verilog
HDL基本门级元件的类型
Verilog HDL内置有 26个基本元件,其中 14 个是门级元件,12个为开关级元件
在门类中分为基本门和三态门。基本就是输入信号和输出信号只有0和1两个概念,没有高阻状态,三态包含了高阻状态。
基本门中间又有与门,或门这种多输入的信号得到一个结果的门,称为多输入门。还有一种情况是一个非门或者一个buffer(同相输入端,逻辑输入1输出1,输入0输出0),对这种有一个输入端有很多输出端叫多输出门
!!!!(补充)buffer是数字电路非常重要的概念,并不代表逻辑,而是代表驱动能力,当一个信号电流强度不够的时候就要去穿插一个buffer而提高电流的驱动能力
三态有一个控制信号,比如bufif0就是一个低电平控制的,如果是0,就是一个同相输出端,如果是1的话就是一个高阻态
3.2.2 门级模块调用
关键在于信号列表。对于一个多输入或多输出信号门,实际上它的端口顺序是有规则的
(1)多输入门元件的规则
多输入门元件举例:
!!可以一直增多输入信号的个数,一直到9
,输入输出加起来不能超过10
(2)多输出门元件的规则
多输出门元件举例:
(3)三态门元件的规则
三态门元件举例:
门元件搭电路
!!!!输入输出信号的数量是可以变的,但是有个最高的值,这个最高的值是由语法结构定义的(早期计算机处理器效率比较低,所以在所有Verilog代码的所有端口中间记住一个10的概念,输入输出引脚很多东西都不会超过10)
3.3 开关级建模
不是特别重要,但是毕竟是区别于VHDL的一个特点
晶体管级建模指的是用输入、输出为模拟信号的晶体管搭建硬件模型,Verilog HDL 提供了开关级建模方式,主要用于ASIC 设计。在开关级建模方式下,硬件结构用晶体管级描述,而晶体管的输入、输出均被限定为数学信号。此时,晶体管表现为通断形式的开关。由于VerilogHDL采用四值逻辑系统,因此 Verilog HDL 描述的开关的输入、输出可以为0、1、z或x。
Verilog HDL语言提供了十几种开关级基本元件,它们是实际的MOS管的抽象表示这些开关级基本元件分为两大类:一类是 MOS 开关,–类是双向开关。每一大类又可分为电阻型(前缀用r表示)和非电阻型。本节主要以非电阻型开关为例,介绍 MOS 开关和双向开关。
3.3.1
MOS
开关
MOS 开关模拟了实际的 MOS 器件的功能,包括 nmos、pmos、cmos 三种
cmos有两个管,所以有一个pmos的控制开关,一个nmos的控制开关
3.3.2 双向开关
!!!重要的例子(通过数电知识得到右边的电路,然后通过HDL描述出来)
要表征的是一个与非门
上面是两个pmos,下面是一个nmos
a,b为0的时候g1和g2导通,a,b为1的时候,g1,g2截止
在a,b有至少一个0的时候,阻抗很小,y相当于接到电源,y下面的通路就相当于断掉了,相当于Vdd直接接到y
当a和b都是1的时候,上面截止,y下面导通,这时候y就是0
相关阅读:
《持续交付:发布可靠软件的系统方法》- 读书笔记(十四)
C语言中的位域
V8中的快慢数组(附源码、图文更易理解😃)
AKK菌——下一代有益菌
[C/C++]_[中级]_[static_cast的详细解析]
centos7安装Nginx
SpringBoot整合JSP笔记整理
算法 day29 回溯5
GAN生成手写数字(TensorFlow,Mnist数据集)
process.env.NODE_ENV与@vue/cli-service及其.env.*默认外部环境配置文件之跨域部署
原文地址:https://blog.csdn.net/y_u_yu_yu_/article/details/127855343
最新文章
攻防演习之三天拿下官网站群
数据安全治理学习——前期安全规划和安全管理体系建设
企业安全 | 企业内一次钓鱼演练准备过程
内网渗透测试 | Kerberos协议及其部分攻击手法
0day的产生 | 不懂代码的"代码审计"
安装scrcpy-client模块av模块异常,环境问题解决方案
leetcode hot100【LeetCode 279. 完全平方数】java实现
OpenWrt下安装Mosquitto
AnatoMask论文汇总
【AI日记】24.11.01 LangChain、openai api和github copilot
热门文章
十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
奉劝各位学弟学妹们,该打造你的技术影响力了!
五年了,我在 CSDN 的两个一百万。
Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
面试官都震惊,你这网络基础可以啊!
你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
心情不好的时候,用 Python 画棵樱花树送给自己吧
通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
13 万字 C 语言从入门到精通保姆级教程2021 年版
10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系
2656653265@qq.com
京ICP备2022015340号-1
正则表达式工具
cron表达式工具
密码生成工具
京公网安备 11010502049817号