《Verilog HDL数字系统设计-原理、实例及仿真》课件第5章_第1页
《Verilog HDL数字系统设计-原理、实例及仿真》课件第5章_第2页
《Verilog HDL数字系统设计-原理、实例及仿真》课件第5章_第3页
《Verilog HDL数字系统设计-原理、实例及仿真》课件第5章_第4页
《Verilog HDL数字系统设计-原理、实例及仿真》课件第5章_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章结构级建模方法5.1VerilogHDL内置基元5.2用户定义原语(UDP)5.3模块的调用5.4行为描述和结构描述的混合使用

5.1VerilogHDL内置基元

VerilogHDL提供了26个内置基元,用于对数字系统实际的逻辑结构进行建模。这些基元包括基本门电路、上拉电阻、下拉电阻、MOS开关和双向开关。这26个基元可以再分类如下:

(1)多输入门:and、nand、or、nor、xor、xnor。

(2)多输出门:buf、not。

(3)三态门:bufif0、bufif1、notif0、notif1。

(4)上拉、下拉电阻:pullup、pulldown。

(5) MOS开关:cmos、nmos、pmos、rcmos、rnmos、rpmos。

(6)双向开关:tran、tranif0、tranif1、rtran、rtranif0、rtranif1。这些基元调用语句的语法格式如下:

<门的类型>[<驱动能力><延时>]<例化的门名字>(<端口列表>);

其中,“门的类型”是门声明语句所必需的,它可以是26个基元中的任意一种。“驱动能力”和“延时”是可选项,可根据不同的情况选不同的值或不选。“例化的门名字”是在本模块中引用的这种类型的门的实例名。<端口列表>按(输出,输入1,输入2,…)顺序列出。下面是门类型的引用:

nand#10nd1(a,data,clock,clear);

该语句中引用了一个名为nd1的与非门(nand),其输入为data、clock和clear,输出为a,输出与输入的延时为10个单位时间。5.1.1基本门

1.多输入门

多输入门具有1个或多个输入,但只有一个输出。内置的多输入门有6种:and(与门)、nand(与非门)、or(或门)、nor(或非门)、xor(异或门)、xnor(异或非门)。

多输入门实例化语句的语法格式如下:

gate_typeinstance_name(output,input1,…,inputN);图5.1多输入门的输入/输出关系

1)与门(and)

图5.2和表5.1所示为与门的逻辑符号和逻辑表。

例如:

andU1(out1,a,b,c,d);

/*与门U1,输出为out1,有4个输入a、b、c、d*/图5.2与门的逻辑符号

2)与非门(nand)

图5.3和表5.2所示为与非门的逻辑符号和逻辑表。

例如:

nandU2(sum,a,b,c);

/*与非门U2,输出为sum,带有3个输入a、b、c*/图5.3与非门的逻辑符号

3)或门(or)

图5.4和表5.3所示为或门的逻辑符号和逻辑表。

例如:

orU3(out,in1,in2),U4(out1,a,b,c);

/*或门U3、U4(同类门实例引用简化方式)*/图5.4或门的逻辑符号

4)或非门(nor)

图5.5和表5.4所示为或非门的逻辑符号和逻辑表。

例如:

norU5(out,in1,in2);

norU6(out1,out,b,c);

//U5输出out信号连接到U6的输入端口图5.5或非门的逻辑符号表5.4或非门的逻辑表

5)异或门(xor)

图5.6和表5.5所示为异或门的逻辑符号和逻辑表。

例如:

xorU7(out,in1,in2);

xorU8(out1,out,in1,c);

//in1信号连接到U7、U8的输入端口图5.6异或门的逻辑符号表5.5异或门的逻辑表

6)异或非门(xnor)

图5.7和表5.6所示为异或非门的逻辑符号和逻辑表。

例如:

xnorU11(out,in1,in2);

xnor(out1,out,b,c);//没有实例名图5.7异或非门的逻辑符号表5.6异或非门的逻辑表

2.多输出门

多输出门具有一个输入、一个或多个输出。内置的多输出门有两种:buf(缓冲门)和not(非门)。

多输出门实例语句的语法格式如下:

gate_typeinstance_name(output1,…,outputN,input);

其中,gate_type为门类型,是上述的两种多输出门之一;instance_name是这个实例门的名称;端口output1,…,outputN是输出端,最后一个端口input是输入端。多输出门的形式如图5.8所示。图5.8多输出门图5.9和表5.7为多输出门的逻辑符号和逻辑表。图5.9多输出门的逻辑符号

3.三态门

三态门用于对三态驱动器建模,共有3个端口:一个数据输入端、一个控制信号输入端和一个数据输出端。内置的三态门有4种:bufif1(高有效三态门)、bufif0(低有效三态门)、notif1(高有效三态非门)、notif0(低有效三态非门)。

三态门实例语句的语法格式如下:

gate_typeinstance_name(output,input,control);

其中,gate_type为门类型,是上述的4种三态门之一;instance_name是这个实例门的名称;第一个端口output是输出端,第二个端口input是输入端,第三个端口control是控制信号输入端。

图5.10所示为三态门的逻辑符号。图5.10三态门的逻辑符号表5.8~表5.11所示分别为四种三态门的逻辑表。表中的某些项是可选的。例如,0/z表明根据输入数据的信号强度和控制信号的值,输出既可以为0也可以为z。例如:5.1.2上拉、下拉电阻

上拉电阻和下拉电阻是一类只有一个端口(输出端)的器件模型,其作用是改变其输出端的值。上拉电阻将输出置为1,下拉电阻将输出置为0。

声明上拉电阻和下拉电阻的关键字是:pullup(上拉电阻)、pulldown(下拉电阻)。

上拉、下拉电阻的语法形式如下:

pull_type[instance_name](output);

其中,pull_type是pullup或pulldown;可选项instance_name是实例名;output是唯一的输出端口。5.1.3MOS开关

VerilogHDL具有对MOS晶体管级进行设计的能力。随着电路复杂性的增加(上百万的晶体管)及先进CAD工具的出现,以开关级为基础进行的设计正在逐渐萎缩。VerilogHDL目前仅提供用逻辑值0、1、x、z和与它们相关的驱动强度进行数字设计的能力,没有模拟设计能力。因此在VerilogHDL中,晶体管也仅被当作导通或者截止的开关。MOS模型在仿真时表现为两种状态:开或关,即导通或不导通。对于MOS来说,数据只能从输入端流向输出端,并且可以通过设置控制信号来关闭数据流,所以MOS是单向的。

Verilog提供了6种MOS晶体管开关:cmos、pmos、rcmos、rpmos、nmos、rnmos。

MOS晶体管开关的语法格式如下:

mos_type[instance_name](outputA,inputB,controlC);

其中,mos_type是nmos、rnmos、pmos和rpmos四种三端口MOS开关之一;可选项instance_name是这个MOS开关实例的名称;第一个端口outputA为输出端,第二个端口inputB是输入端,第三个端口controlC是控制信号输入端。pmos、nmos、rnmos和rpmos均为三端口MOS开关,包括一个数据输出端、一个数据输入端和一个控制信号输入端。nmos用于NMOS晶体管建模;pmos用于PMOS晶体管建模。NMOS和PMOS开关符号如图5.11所示。图5.11NMOS和PMOS开关符号

pmos、nmos、rnmos和rpmos这四种MOS开关的工作过程如下:

(1)对于nmos和rnmos开关,如果其控制信号为0,那么关闭这个开关,使输出为z;如果控制信号是1,则打开这个开关,把输入端的数据传输至输出端。

(2)对于pmos和rpmos开关,如果其控制信号为1,那么关闭这个开关,使输出为z;如果控制信号是0,则打开这个开关,把输入端的数据传输至输出端。

rnmos和rpmos与nmos和pmos相比,它们的输入端和输出端之间存在阻抗(电阻)。因此,对于rnmos和rpmos,当数据从输入端传输至输出端时,由于电阻带来的损耗,使得数据的信号强度减弱。例如:

nmosn1(out,data,control); //实例名为n1的nmos开关

pmosp1(out,data,control); //实例名为p1的pmos开关

输出out的值由输入data和control的值确定。nmos和pmos的逻辑表如表5.12所示。信号data和control不同的组合导致这两个开关输出1、0或者z、x逻辑值(如果不能确定输出为1或0,就有可能输出z、x值)。

cmos和rcmos(cmos的高阻态)有4个端口:一个数据输出端,一个数据输入端和两个控制信号输入端。其语法格式如下:

(r)cmos[instance_name](outputA,inputB,Ncontrol,Pcontrol);

其中,可选项instance_name是这个MOS开关实例的名称;第一个端口outputA为输出端,第二个端口inputB是输入端,第三个端口Ncontrol是N通道控制信号输入端,第四个端口Pcontrol是P通道控制信号输入端。cmos(rcmos)的开关行为与pmos(rpmos)和nmos(rnmos)的类似。可以这样认为,cmos(outputA,inputB,Ncontrol,Pcontrol)是一个nmos(output,input,Ncontrol)和一个pmos(output,input,Pcontrol)的组合。也就是可以用如图5.12所示nmos和pmos器件来建立一个cmos器件的模型。图5.12cmos开关在cmos开关中,存在着pmos和nmos两条数据通路,当Pcontrol为0时,上半部分的pmos开关打开,数据可以从输入端inputB传输到输出端outputA;当Ncontrol为1时,下半部分的nmos开关打开,数据可以从输入端inputB传输到输出端outputA;因此,cmos的真值表可以参考pmos和nmos的。例如:

cmosc1(out,data,ncontrol,pcontrol);//实例名c1的cmos开关

rcmos是cmos的高阻态,其开关行为与cmos完全相同,只是在其输入端和输出端之间存在着阻抗,所以数据从输入传送到输出的过程中存在着损耗,使得其信号强度被减弱。5.1.4双向开关

NMOS、PMOS和CMOS管都是从漏极向源极导通的,是单向的。在数字电路中,双向导通的器件也很常用。对双向导通的器件而言,其两边的信号都可以是驱动信号。通过设计双向开关就可以实现双向导通的器件。VerilogHDL内置了6种双向开关,即数据可以在两个端口之间双向流动。这6种双向开关是tran、rtran、tranif0、rtranif0、tranif1、rtranif1。

其中,前两种开关tran和rtran(tran的高阻态)是不能关断的,始终处于打开状态,数据可以在两个端口之间自由流动。tran和rtran的语法形式如下:

(r)tran[instance_name](signalA,signalB);这两种开关只有两个端口signalA和signalB,数据可以在这两个端口之间流动,因为没有控制信号,这两个开关都不能被关断,所以这种双向的数据流动是无条件进行的。

后4种开关(tranif0、rtranif0、tranif1和rtranif1)可以通过控制信号关闭。其语法形式如下:

bidirection_type[instance_name](signalA,signalB,controlC);

其中,bidirection_type是上述4种双向开关之一,实例名instance_name是可选项,前两个端口(signalA、signalB)是双向端口,第三个端口controlC是控制信号输入端。对于tranif0和rtranif0,controlC为0时打开开关,允许数据双向流动,当controlC为1时关闭开关,禁止数据流动;对于tranif1和rtranif1,controlC为1时打开开关,允许数据双向流动,当controlC为0时关闭开关,禁止数据流动。在这6种双向开关中,tran、tranif0和tranif1内的数据流动时没有损耗,但rtran、rtranif0和rtranif1的输入端和输出端之间存在阻抗,当信号通过开关传输时,信号强度会减弱。

tran、tranif0和tranif1的逻辑符号如图5.13所示。图5.13双向开关的逻辑符号

tran开关作为两个信号inout1和inout2之间的缓存,inout1或inout2都可以是驱动信号。仅当control信号是逻辑0时,tranif0开关连接inout1和inout2两个信号;如果control信号是逻辑1,则没有驱动源的信号取高阻态值z,有驱动源的信号仍然从驱动源取值。如果control信号是逻辑1,则tranif1开关连接的inout1和inout2两个信号导通。5.1.5门级建模举例

下面通过几个例子学习门级结构建模的基本方法。

4选1多路选择器有4个数据输入端D0、D1、D2、D3,一个数据输出端Z和两个控制信号输入端S0、S1。选择器会根据S0和S1的值从4个数据输入端中选择其中的一个送到输出端。图5.14和表5.13所示分别为4选1多路选择器的电路结构和真值表。图5.144选1多路选择器的电路结构

5.2用户定义原语(UDP)

5.2.1UDP的定义

UDP的定义与模块无关,与模块属同一层次,所以UDP定义不能出现在模块之内。UDP定义可以单独出现在一个VerilogHDL文件中或与模块定义同时处于某个文件中。它的语法形式如下:注意:

(1)

UDP只能有一个输出端,而且必定是端口说明列表的第一项。

(2) UDP可以有多个输入端,最多允许有10个输入端。

(3) UDP所有的端口变量必须是标量,也就是必须是1位的。

(4)在UDP的真值表项中,只允许出现0、1、x三种逻辑值,高阻值状态z是不允许出现的。

(5)只有输出端才可以被定义为寄存器型变量。

(6) initial语句用于为时序电路内部的寄存器赋初值,只允许赋0、1、x三种逻辑值,缺省值为x。

在UDP中可以描述两类电路行为:组合电路和时序电路(边沿触发和电平触发)。5.2.2组合电路UDP

在组合电路UDP中,填写的功能列表类似真值表,即规定了不同的输入值组合相对应的输出值。没有指定的任意组合输出为x。表中output是输出端的值,input是输入端的值,它们的排列顺序必须和端口列表中的顺序相同。表中每一行的语法形式如下:

input1input2…:output

列表中给出多个这样的行就能对不同的输入值组合定义对应的输出值,如果某个输入值组合没有定义其输出,那么就把这种情况的输出置为x。

【例5.1】2-1数据选择器的UDP定义方法。

【例5.2】使用2-1数据选择器原语构建4-1多路选择器。在UDP实例中共可以指定2个时延,这是由于UDP的输出可以取值0、1或x(无截止时延)。使用6个输入端A、B、C、D、Sel[1]、Sel[2]和1个输出端Z以及2个线网TL、TP来实现3个UDP的连接,其内部结构如图5.15所示。图5.15使用UDP构造的4-1多路选择器5.2.3时序电路UDP

1.初始化状态寄存器

时序电路UDP的状态初始化可以使用一条过程赋值语句实现。其语法形式如下:

initialreg_name=0,1,orx;

其中,reg_name是状态寄存器,0、1、x是这个寄存器可以取的值。初始化语句在UDP定义中出现,但初始化状态寄存器不是必需的,若在UDP定义中没有状态寄存器初始化语句,那么状态寄存器的值为x。

2.电平触发的时序电路UDP

电平触发的时序电路UDP比组合型多了一个寄存器,主要用来保存当前的状态,也可以作为当前的输出。当前的状态和输入确定下一个状态和输出。

【例5.3】电平触发的D锁存器时序电路UDP,只要时钟(clk)为低电平0,数据就从输入传递到输出,否则输出值保持不变。

3.边沿触发的时序UDP

【例5.4】用边沿触发时序电路UDP为边沿触发的D触发器建模,初始化语句用于初始化触发器的状态。

【例5.5】假定d_edge为UDP定义,它现在就能够像基本门一样在模块中使用,如下面的4位寄存器所示。

4.电平触发和边沿触发混合的UDP

时序UDP包括电平触发和边沿触发两种,VerilogHDL允许这两种行为混合存在于同一个UDP中。在这种情况下,边沿变化在电平触发之前处理,即电平触发项覆盖边沿触发项。

【例5.6】带异步清零的D触发器的UDP描述。

5.3模 块 的 调 用

为了把所有模块连接成系统或者高层模块而调用低层子模块,需使用模块实例化语句。模块实例化语句和调用基元时使用的基元实例化语句形式上完全一致,也是使用结构级建模方法描述的。

调用低层模块的语法形式为:

低层模块名实例名(参数定义);

其中,“低层模块名”是要引用的模块名;“实例名”是模块的实例名;“参数定义”是端口关联声明。5.3.1端口的关联方式

端口有两种关联方式,即位置关联方式和名称关联方式,这两种关联方式不能够混合使用,其语法形式如下:

port_expr

//位置关联方式

.PortName(port_expr) //名称关联方式

其中,PortName是子模块在定义时给出的端口名称,port_expr是高层模块内定义的线网或寄存器变量,这个变量与子模块端口关联就实现了子模块与高层模块之间的连接。名称关联方式是用一个小数点“.”引导的表达式.PortName(port_expr),模块端口和端口表达式的关联被显式地指定,也就是子模块PortName端口在高层模块中与port_expr相关联。因此端口的关联顺序并不重要。

位置关联方式不需要给出子模块定义时给出的端口名称PortName,只要端口表达式按模块定义时的端口顺序与模块中的端口关联即可。port_expr可以是以下的任何类型:标识符(reg或net)、位选择、部分位选择、前三种类型的合并、表达式(只适用于输入端口)。例如:

MicroM1(UdIn[3:0],{WrN,RdN},Status[0],Status[1],

&UdOut[0:7],TxData);

【例5.7】使用两个半加器模块构造全加器,子模块是半加器HA,高层模块是全加器FA,在FA中引用了两个HA。逻辑图如图5.16所示,其中h1和h2分别是两个半加器。图5.16使用两个半加器模块构造的全加器子模块半加器的VerilogHDL描述:全加器的VerilogHDL描述:5.3.2端口悬空的处理

在实例化语句中,悬空端口可通过将端口表达式表示为空白来指定为悬空端口。

【例5.8】子模块的描述。高层模块调用子模块DFF,模块实例化语句是:

(1)DFFd1(.Q(QS),.Qbar(),.Data(D),.Preset(),.Clock(CK));/*名称关联方式。端口Qbar和Preset的括号里为空,表明这两个端口被悬空*/

(2)DFFd2(QS,,D,,CK);/*位置对应方式。输出端口Qbar和输入端口Preset的位置都被悬空*/

悬空的端口因为类型不同而意义不同。若模块的输出端口悬空,则表示该输出端口不用。若模块的输入端口悬空,则被置为高阻态z。5.3.3端口宽度匹配问题

在端口关联时,若端口和局部端口表达式的长度不同,则端口通过无符号数的右对齐或截断方式进行匹配。

【例5.9】模块调用时端口宽度匹配举例。

子模块的描述:顶层模块Top的描述:在子模块guan_lian的实例语句中:

(1) 2位的Bdl和6位的Pba相连,Bdl[2]连接到Pba[0],Bdl[1]连接到Pba[1],余下的输入端口Pba[5]、Pba[4]Pba[3]和Pba[2]被截断,处于悬空状态,因此为高阻态z。

(2) 5位的Mpr和3位的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论