三、6【Verilog HDL】基础知识之门级建模
参考书籍:《Verilog HDL 数字设计与综合》第二版,本文档为第5章的学习笔记。由于本章也讲述的建模方式。该建模方式是通常设计师常用的底层抽象层次。更为低层的为开关级建模。
想了解更多低层建模方式之开关级建模:
三、5【Verilog HDL】基础知识之开关级建模_FPGA-桥的博客-CSDN博客参考书籍:《VerilogHDL 数字设计与综合》第二版,本文档为第五章的学习笔记。Verilog HDL中的门级原语、实例引用、符号、真值表如何根据电路的逻辑图生成Verilog描述学习门级设计中的上升、下降和关断延迟https://blog.csdn.net/ARM_qiao/article/details/124220910
关于门电路的数电基础知识介绍,请参考本人的相关《数字电子技术基础》的书籍阅读笔记,有助于大家对门级建模有深入的认识与学习
https://blog.csdn.net/arm_qiao/category_11744079.htmlhttps://blog.csdn.net/arm_qiao/category_11744079.html
学习目标
- 掌握Verilog提供的门级原语
- 理解门的应用
- 会根据门电路写Verilog描述
- 清楚门级设计中的上升、下降和关断延迟
- 门级设计中的最小、最大和典型延迟
5.1 门的类型
基本的逻辑门分为两类:1、与/或门类(and/or);2、缓冲器/非门类(buf/not)
5.1.1 与门(and)和或门(or)
相对应的关键字有
and //与门 nand //与非门
or //或门 nor //或非门
xor //异或门 xnor //同或门
门级原语实例化引用的时候,我们可以不指定具体实例的名字。
门级的实例引用:
wire OUT, IN1, IN2;//基本门的实例引用
and a1(OUT, IN1, IN2);
nand na1(OUT, IN1, IN2);
or or1(OUT, IN1, IN2);
nor nor1(OUT, IN1, IN2);
xor xor1(OUT, IN1, IN2);
xnor xnor1(OUT, IN1, IN2);
//输入端超过两个;三输入的与非门
nand na1_3inp(OUT, IN1, IN2, IN3);
5.1.2 缓冲器/非门(buf/not)
相对应的关键字,及关键字的实例引用
//关键字
buf //缓冲器 not //非门
//缓冲门、非门的调用 ,实例引用时可以不加实例命名
buf b1(OUT1, IN);
not n1(OUT1, IN);//输出端多于两个
buf b1_2out(OUT1, OUT2, IN);
带控制端的缓冲器/非门(bufif / notif)
相对应的关键字,及关键字的实例引用
//关键字
bufif1 //高电平使能导通的缓冲门 notif1 //高电平使能导通的非门
bufif0 //低电平使能导通的缓冲门 nitif0 //低电平使能导通的非门
//实例化引用
bufif1 b1(out, in ,ctrl);
bufif0 b0(out, in ,ctrl);notif1 n1(out, in, ctrl);
notif0 n0(out, in, ctrl);
5.1.3 实例数组
有很多情况下,需要多某种相同的门类型进行多次调用(实例引用),这些相同的门实例的区别仅仅在于它们分别连接在不同的向量信号位上,为了简化这种类型的门,Verilog允许用户自己来定义门实例数组。
//简单的门级原语实例数组
wire [3:0] OUT, IN1, IN2; //声明了3个4位线型变量//基本门的数组调用
nand n_gate[3:0] (OUT, IN1, IN2);//上面一条语句相当于4条实例引用语句
nand n_gate0(OUT[0], IN1[0], IN2[0]);
nand n_gate1(OUT[1], IN1[1], IN2[1]);
nand n_gate2(OUT[2], IN1[2], IN2[2]);
nand n_gate3(OUT[3], IN1[3], IN2[3]);
5.1.4 门级建模举例
(1)门级多路选择器
引脚信息表及功能真值表
输入输出信号描述 | |||
信号 | 位宽 | 类型 | 功能描述 |
i0 | 1bit | input | 输入信号0 |
i1 | 1bit | input | 输入信号1 |
i2 | 1bit | input | 输入信号2 |
i3 | 1bit | input | 输入信号3 |
s0 | 1bit | input | 地址输入信号 |
s1 | 1bit | input | 地址输入信号 |
out | 1bit | output | 输出信号 |
mux_4_1数据选择器真值表 | |||
输入信号 | 地址输入信号 | 输出 | |
s0 | s1 | out | |
i0 | 0 | 0 | i0 |
i1 | 0 | 1 | i1 |
i2 | 1 | 0 | i2 |
i3 | 1 | 1 | i3 |
程序块
module mux_4_1(out, i0, i1, i2, i3, s1, s0);
//模块的输入输出端口声明output out; input i0, i1, i2, i3;input s1, s0;//模块内部线网连接变量声明wire s1n, s0n;wire y0, y1, y2, y3;//非门(not)实例引用not n1(s1n, s1);not n0(s0n, s0);
//与门(and)实例引用and a0(y0, i0, s1n, s0n);and a1(y1, i1, s1n, s0);and a2(y2, i2, s1, s0n);and a3(y3, i3, s1, s0);
//或门(or)实例化引用or (out, y0, y1, y2, y3);
endmodule
程序块逻辑综合后的RTL逻辑图:
由于RTL中并没有三线的与门和四线的或门。因此用两个两线与门代替三线的一个与门;用三个两线或门代替一个四线与门,同时这里的非门直接加在了与门和或门的引脚上。有上图通过逻辑综合出来的RTL逻辑图与原本的逻辑选择器进行对比发现逻辑并无错误。
激励块
module tb_mux_4_1();
//声明激励块中与代码块中的连接变量wire OUT;reg IN0, IN1, IN2, IN3;reg S1, S0;
//实例引用代码块并进行变量连接mux_4_1 mux_4_1_stim(OUT, IN0, IN1, IN2, IN3, S1, S0);initial beginIN0 = 1'b1; IN1 = 1'b0; IN2 = 1'b1; IN3 = 1'b0;#30 $display("IN0=%b, IN1=%b, IN2=%b, IN3=#b\n", IN0, IN1, IN2, IN3);//选择IN0S1 = 0; S0 = 0;#30 $display("s1=%b, s0=%b, OUT=%b\n", S1, S0, OUT);//选择IN1S1 = 0; S0 = 1;#30 $display("s1=%b, s0=%b, OUT=%b\n", S1, S0, OUT);//选择IN2S1 = 1; S0 = 0;#30 $display("s1=%b, s0=%b, OUT=%b\n", S1, S0, OUT);//选择IN3S1 = 1; S0 = 1;#30 $display("s1=%b, s0=%b, OUT=%b\n", S1, S0, OUT); end
endmodule
通过逻辑仿真得出逻辑仿真结果,与真值表对比也并无错误。
(2)四位脉动进位全加器
四位脉动进位全加器可以使用四个一位全加器构成。
而一位全加器可由两个一位半加器,加上同或门构成。
一位全加器逻辑式:
代码块
//一位加法器
module full_add(sum, c_out, a, b, c_in);
//端口变量声明output sum, c_out;input a, b, c_in;
//内部网线变量声明wire s1, c1, s2;//门级实例化xor (s1, a, b);and (c1, a, b);xor (sum, s1, c_in);and (s2, s1, c_in);xor (c_out, s2, c1);
endmodule
对其进行综合,可以看到RTL逻辑视图,并与其逻辑原理图对比:
//四位脉动进位全加器,为顶层模块
module full_add4(sum, c_out, a, b, c_in);
//端口变量声明output [3:0] sum;output c_out;input [3:0] a, b;input c_in;
//内部线网变量声明 wire c1, c2, c3;
//实例化全加器,串联形成4位脉动全加器full_add fa0(sum[0], c1, a[0], b[0], c_in);full_add fa1(sum[1], c2, a[1], b[1], c1);full_add fa2(sum[2], c3, a[2], b[2], c2);full_add fa3(sum[3], c_out, a[3], b[3], c3);
endmodule
对其进行逻辑综合生成RTL逻辑视图,与其原理逻辑视图对比可知,并没有问题:
激励块:验证代码块的逻辑功能
//逻辑仿真激励块
//Company: 追逐者——桥的小作坊
module tb_full_add4();reg [3:0] A, B;reg C_IN;wire [3:0] SUM;wire C_OUT;//实例化full_add4 fadd4(SUM, C_OUT, A, B, C_IN);initial begin$monitor($time, "A=%b, B=%b, C_IN=%b, ----- C_OUT=%b, SUM=%b\n", A, B, C_IN, C_OUT, SUM); endinitial beginA = 4'd0; B = 4'd0; C_IN = 1'b0;#50 A = 4'd3; B = 4'd4; #50 A = 4'd2; B = 4'd5; #50 A = 4'd9; B = 4'd9; #50 A = 4'd10; B = 4'd15; #50 A = 4'd10; B = 4'd5; C_IN = 1'b1;end
endmodule
仿真结果如下图所示:
5.2 门延迟
在MOS管组成的电路中由于内部的等效电容与电阻形成的RC电路,故在0、1变化时,一定会出现变化延迟现象,如果不能理解这句话,请大家一定要重新学习CMOS门电路。关于延迟本章只是做了简单的介绍,更为详细的讲解,将在第十章进行讲解与学习。
5.2.1 上升、下降和关断延迟
在Verilog门级原语中,有三种从输入到输出的延迟。
上升延迟
在门的输入发生变化的情况下,门的输出从0,X,Z变化为1所需要的时间称为上升延迟。
下降延迟
下降延迟为门的输入从1,X,Z变化为0所需的时间
- 关断延迟
关断延迟指门的输出从0,1,X,变化为高阻抗Z所需的时间。
另外,如果值变化到不确定值X,则所需的时间可以看成是以上三种延迟值最小的那个。
在Verilog中,用户可以使用三种不同的方法来说明门的延迟。
- 当指定一个延迟值时,所有延迟类型都使用该值
- 当指定两个延迟值时,分别代表上升延迟和下降延迟
- 当指定三个延迟值时,分别代表升延迟、下降延迟和关断延迟
- 如果未指定延迟时间,那么默认延迟值为0
//门延迟值说明
//一个延迟值
and #(delay_time) a1(out, i1, i2);
and #(5) a11(out, i1, i2);
//两个延迟值
and #(rise_val, fall_val) a2(out, i1, i2);
and #(4, 6) a21(out, i1, i2);
//三个延迟值
bufif0 #(rise_val, fall_val, turnoff_val) b1(out, in, control);
bufif0 #(3, 4, 5) b11(out, in, cintrol);
5.2.2 最小、经典、最大延迟
在Verilog中,除了指定以上三种延迟外,对每种类型的延迟还可以指定其最小值、最大值和典型值延迟。可以在仿真一开始进行指定,也可以在仿真过程中指定。具体控制方法与使用的仿真器和操作系统有关,未指定则默认为典型延迟值。
Verilog用户可以灵活地对设计中的各种类型的延迟(上升、下降、典型)使用三个不同的具体数值,不必修改设计就可以使用的延迟值进行仿真。
//一个延迟
//最小延迟=4
//典型延迟=5
//最大延迟=6
and #(4:5:6) a1(out, i1, i2);//两个延迟
//最小延迟,上升延迟=3,下降延迟=5,关断延迟=min(3,5)
//典型延迟,上升延迟=4,下降延迟=6,关断延迟=min(4,6)
//最大延迟,上升延迟=5,下降延迟=7,关断延迟=min(5,7)
and #(3:4:5, 5:6:7) a2(out, i1, i2);//三个延迟
//最小延迟,上升延迟=3,下降延迟=5,关断延迟=7
//典型延迟,上升延迟=4,下降延迟=6,关断延迟=8
//最大延迟,上升延迟=5,下降延迟=7,关断延迟=9
and #(3:4:5, 5:6:7, 7:8:9) a3(out, i1, i2);//通过命令行可以启动行方式
> verilog test.v +maxdelays
5.2.3 延迟举例
module delay(out, a, b, c);output out;input a,b,c;wire e;and #(50) a1(e,a,b);or #(40) o1(out,e,c);
endmodule
module tb_delay();wire OUT;reg A,B,C;delay d1(OUT,A,B,C);initial beginA=1'b0; B=1'b0; C=1'b0;#100 A=1'b1; B=1'b1; C=1'b1;#100 A=1'b1; B=1'b0; C=1'b0;#200 $finish;end
endmodule
三、6【Verilog HDL】基础知识之门级建模相关推荐
- Verilog HDL基础知识---之数据类型
Verilog HDL基础知识之数据类型 数据类型 物理数据类型 连线型 寄存器型 连线型和寄存器型数据类型的声明 存储器型 抽象数据类型 整型 时间型 实型 参数型 kkkk我来啦 , 接上回写 数 ...
- Verilog HDL基础知识
Verilog HDL基础知识 Verilog HDL的语言要素 空白符 注释符 标识符和转义标识符 关键字 数值 1. 整数及其表示 2. 实数及其表示 3. 字符串及其表示 数据类型 Verilo ...
- 在Verilog语言中,使用门级建模设计一个由1位全加器组成的4位全加器
4位全加器的门级建模 Verilog语言的层级 在Verilog硬件描述语言中,我们可以分许多层次对电路进行描述,每一层都有自己的特点.层次分为开关级.门级.数据流级.行为级.我们不能说必须使用哪一种 ...
- 数字集成电路设计(二、Verilog HDL基础知识)
文章目录 1. 语言要素 1.1 空白符 1.2 注释符 1.3 标识符 1.3.1 转义标识符 1.4 关键字 1.5 数值 1.5.1 整数及其表示方式 1.5.2 实数及其表示方式 1.5.3 ...
- Verilog HDL 基础
Verilog HDL 基础 一.Verilog 的基本概念 1. 硬件描述语言HDL 1.1 特点: 描述电路的连接.描述电路的功能.在不同抽象级上描述电路. 描述电路的时序.表达具有并行性 1.2 ...
- Verilog的基础知识
Verilog的基本介绍: 硬件描述语言发展至今已有二十多年历史,当今业界的标准中( IEEE标准)主要有VHDL和Verilog HDL 这两种硬件描述语言. 一个设计往往从系统级设计开始,把系统划 ...
- 数字集成电路设计(三、Verilog HDL程序设计语句和描述方式)(一)
文章目录 1. 数据流建模 1.1 连续赋值语句 2. 行为级建模 2.1 过程语句 2.2 语句块 2.3 过程赋值语句 **!!!小结** 2.4 过程连续赋值语句 2.5 条件分支语句 2.5. ...
- 【Verilog HDL】从逻辑电路图到门级建模——人工翻译的方法论
从左到右,从上到下 先搞定缓冲/非门,再写与/或门 1. 实例解读 先以四选一数据选择器进行说明 对于数字逻辑的部分不再说明,直接进行逻辑电路图到Verilog门级建模的人工翻译过程的描述. 1.1 ...
- Verilog语法基础知识
目录 1.模块的结构 1.1 模块的端口定义 1.2 模块内容 1.2.1 I/O说明的格式 1.2.2 内部信号说明 1.3 功能定义 2.数据类型及其常量和变量 2.1 常量 2.1.1 数字 2 ...
最新文章
- 序列处理工具|Seqkit
- C 将长型整数转换为字符串
- GeoServer+MySQL安装及配置过程
- Lesson 4.34.4 梯度下降(Gradient Descent)基本原理与手动实现随机梯度下降与小批量梯度下降
- Smart Link
- git 为什么不能断点_跟我一起学docker(九)--持续系统集成了解下git
- 局域网抢答器_基于童芯派的抢答器V1.0
- python打印输出12星座,怎么利用python输出星座
- GOOGLE卫星地图贴图错误一例
- vlfeat各种版本下载链接:
- 【网络工程师配置篇】华三交换机基本配置大全(文末附下载链接),网络工程师必备手册
- 电信光猫获取超级管理员账号
- 小技巧(8):Word中自定义目录,并设置自动目录的格式
- iOS PDF 添加图片
- 跨站脚本攻击(XSS)及防范措施
- python语言常用的中文分词第三方库是_基于boost使用Python调用NLPIR(ICTCLAS2013)中文分词组件...
- 如何制作精美的PPT动画?快速学会这3步,开场效果简洁又生动!
- 教你百度网盘文件转阿里云
- C语言六位数字钟程序,单片机制作的6位数字钟
- CVTE 2021 春招面经
热门文章
- 物流批量查询,在电脑上查询最简单的方法推荐
- 【自定义轮播图】微信小程序自定义轮播图无缝滚动
- 注意力机制(四):多头注意力
- 奇技:使用钉钉进行视频会议时,在本地显示演讲者视图播放PPT
- Android常见App加固厂商脱壳方法的整理
- 奥鹏19春学期c语言作业答案,中石油(华东)《C语言》2013年春学期在线作业(三)...
- S3C2440驱动开发(七)
- Android版卡拉OK,歌词同步程序
- 【软件分析/静态程序分析学习笔记】2.中间表示(Intermediate Representation)
- MySQL + JSON = 王炸