ImageVerifierCode 换一换
格式:DOCX , 页数:82 ,大小:261.81KB ,
资源ID:8237402      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8237402.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VerilogHDL的基本语法.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

VerilogHDL的基本语法.docx

1、VerilogHDL的基本语法第三章 Verilog HDL的基本语法前言Verilog HDL是一种用于数字逻辑电路设计的语言。用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。Verilog HDL既是一种行为描述的语言也是一种结构描述的语言。这也就是说,既可以用电路的功能描述也可以用元器件和它们之间的连接来建立所设计电路的Verilog HDL模型。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下五种: 系统级(system):用高级语言结构实现设计模块的外部性能的模型。 算法级(algorithm):用高级语言结构

2、实现设计算法的模型。 RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何处理这些数据的模型。 门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。 开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。 一个复杂电路系统的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描

3、述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。Verilog HDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。这种行为描述语言具有以下功能: 可描述顺序执行或并行执行的程序结构。 用延迟表达式或事件表达式来明确地控制过程的启动时间。 通过命名的事件来触发其它过程里的激活行为或停止行为。 提供了条件、if-else、case、循环程序结构。 提供了可带参数且非零延续时间的任务(task)程序结构。 提供了可定义新的操作符的函数结构(function)。 提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。 Verilog HDL语

4、言作为一种结构化的语言也非常适合于门级和开关级的模型设计。因其结构化的特点又使它具有以下功能:- 提供了完整的一套组合型原语(primitive);- 提供了双向通路和电阻器件的原语;- 可建立MOS器件的电荷分享和电荷衰减动态模型。 Verilog HDL的构造性语句可以精确地建立信号的模型。这是因为在Verilog HDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。 Verilog HDL作为一种高级的硬件描述编程语言,有着类似C语言的风格。其中有许多语句如:if语句、case语句等和C语言中的对应

5、语句十分相似。如果读者已经掌握C语言编程的基础,那么学习Verilog HDL并不困难,我们只要对Verilog HDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路。下面我们将对Verilog HDL中的基本语法逐一加以介绍。3.1.简单的Verilog HDL模块3.1.1.简单的Verilog HDL程序介绍下面先介绍几个简单的Verilog HDL程序,然后从中分析Verilog HDL程序的特性。例3.1.1:module adder ( count,sum,a,b,cin );input 2:0 a,b;input cin;ou

6、tput count;output 2:0 sum;assign count,sum = a + b + cin;endmodule这个例子通过连续赋值语句描述了一个名为adder的三位加法器可以根据两个三比特数a、b和进位(cin)计算出和(sum)和进位(count)。 从例子中可以看出整个Verilog HDL程序是嵌套在module和 endmodule 声明语句里的。例3.1.2:module compare ( equal,a,b );output equal; /声明输出信号equalinput 1:0 a,b; /声明输入信号a,b assign equal=(a=b)?1:0

7、; /*如果a、b 两个输入信号相等,输出为1。否则为0*/endmodule这个程序通过连续赋值语句描述了一个名为compare的比较器。对两比特数 a、b 进行比较,如a与b相等,则输出equal为高电平,否则为低电平。在这个程序中,/*.*/和/.表示注释部分,注释只是为了方便程序员理解程序,对编译是不起作用的。例3.1.3:module trist2(out,in,enable);output out;input in, enable; bufif1 mybuf(out,in,enable);endmodule这个程序描述了一个名为trist2的三态驱动器。程序通过调用一个在Veril

8、og语言库中现存的三态驱动器实例元件bufif1来实现其功能。例3.1.4: module trist1(out,in,enable);output out;input in, enable; mytri tri_inst(out,in,enable); /调用由mytri模块定义的实例元件tri_instendmodulemodule mytri(out,in,enable);output out;input in, enable; assign out = enable? in : bz;endmodule这个程序例子通过另一种方法描述了一个三态门。在这个例子中存在着两个模块。模块tris

9、t1调用由模块mytri定义的实例元件tri_inst。模块trist1是顶层模块。模块mytri则被称为子模块。 通过上面的例子可以看到: Verilog HDL程序是由模块构成的。每个模块的内容都是嵌在module和endmodule两个语句之间。每个模块实现特定的功能。模块是可以进行层次嵌套的。正因为如此,才可以将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能。 每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。 Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。 除了endmo

10、dule语句外,每个语句和数据定义的最后必须有分号。 可以用/*.*/和/.对Verilog HDL程序的任何部分作注释。一个好的,有使用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。3.1.2.模块的结构Verilog的基本设计单元是“模块”(block)。一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的。下面举例说明:请看上面的例子,程序模块旁边有一个电路图的符号。在许多方面,程序模块和电路图符号是一致的,这是因为电路图符号的引脚也就是程序模块的接口。而程序模块描述了电路图符号所实现的逻辑功能。上面的Verilog设计中,模块中的

11、第二、第三行说明接口的信号流向,第四、第五行说明了模块的逻辑功能。以上就是设计一个简单的Verilog程序模块所需的全部内容。从上面的例子可以看出,Verilog结构完全嵌在module和endmodule声明语句之间,每个Verilog程序包括四个主要部分:端口定义、I/O说明、内部信号声明、功能定义。3.1.3.模块的端口定义模块的端口声明了模块的输入输出口。其格式如下:module 模块名(口1,口2,口3,口4, );3.1.4.模块内容模块的内容包括I/O说明、内部信号声明、功能定义。 I/O说明的格式如下:输入口: input 端口名1,端口名2,,端口名i; /(共有i个输入口)

12、输出口: output 端口名1,端口名2,,端口名j; /(共有j个输出口)I/O说明也可以写在端口声明语句里。其格式如下:module module_name(input port1,input port2,output port1,output port2 ); 内部信号说明:在模块内用到的和与端口有关的wire 和 reg 变量的声明。如: reg width-1 : 0 R变量1,R变量2 。; wire width-1 : 0 W变量1,W变量2 。; . 功能定义: 模块中最重要的部分是逻辑功能定义部分。有三种方法可在模块中产生逻辑。1).用“assign”声明语句如: assi

13、gn a = b & c;这种方法的句法很简单,只需写一个“assign”,后面再加一个方程式即可。例子中的方程式描述了一个有两个输入的与门。2).用实例元件如: and and_inst( q, a, b );采用实例元件的方法象在电路图输入方式下,调入库元件一样。键入元件的名字和相连的引脚即可,表示在设计中用到一个跟与门(and)一样的名为and_inst的与门,其输入端为a, b,输出为q。要求每个实例元件的名字必须是唯一的,以避免与其他调用与门(and)的实例混淆。3).用“always”块如:always (posedge clk or posedge clr)beginif(clr

14、) q = 0;else if(en) q = d;end采用“assign”语句是描述组合逻辑最常用的方法之一。而“always”块既可用于描述组合逻辑也可描述时序逻辑。上面的例子用“always”块生成了一个带有异步清除端的D触发器。“always”块可用很多种描述手段来表达逻辑,例如上例中就用了if.else语句来表达逻辑关系。如按一定的风格来编写“always”块,可以通过综合工具把源代码自动综合成用门级结构表示的组合或时序逻辑电路。注意:如果用Verilog模块实现一定的功能,首先应该清楚哪些是同时发生的,哪些是顺序发生的。上面三个例子分别采用了“assign”语句、实例元件和“al

15、ways”块。这三个例子描述的逻辑功能是同时执行的。也就是说,如果把这三项写到一个 VeriIog 模块文件中去,它们的次序不会影响逻辑实现的功能。这三项是同时执行的,也就是并发的。然而,在“always”模块内,逻辑是按照指定的顺序执行的。“always”块中的语句称为“顺序语句”,因为它们是顺序执行的。请注意,两个或更多的“always”模块也是同时执行的,但是模块内部的语句是顺序执行的。 看一下“always”内的语句,你就会明白它是如何实现功能的。 if.else if必须顺序执行,否则其功能就没有任何意义。如果else语句在if语句之前执行,功能就会不符合要求!为了能实现上述描述的功

16、能,“always”模块内部的语句将按照书写的顺序执行。3.2.数据类型及其常量、变量Verilog HDL中总共有十九种数据类型,数据类型是用来表示数字电路硬件中的数据储存和传送元素的。在本教材中我们先只介绍四个最基本的数据类型,它们是:reg型、wire型、integer型、parameter型其它数据类型在后面的章节里逐步介绍,同学们也可以查阅附录中Verilog HDL语法参考书的有关章节逐步掌握。其它的类型如下:large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior型、trireg型、vectored型

17、、wand型、wor型。这些数据类型除time型外都与基本逻辑单元建库有关,与系统设计没有很大的关系。在一般电路设计自动化的环境下,仿真用的基本部件库是由半导体厂家和EDA工具厂家共同提供的。系统设计工程师不必过多地关心门级和开关级的Verilog HDL语法现象。Verilog HDL语言中也有常量和变量之分。它们分别属于以上这些类型。下面就最常用的几种进行介绍。3.2.1.常量在程序运行过程中,其值不能被改变的量称为常量。下面首先对在Verilog HDL语言中使用的数字及其表示方式进行介绍。一数字 整数:在Verilog HDL中,整型常量即整常数有以下四种进制表示形式:1) 二进制整数

18、(b或B)2) 十进制整数(d或D)3) 十六进制整数(h或H)4) 八进制整数(o或O)数字表达方式有以下三种:1) 这是一种全面的描述方式。2) 在这种描述方式中,数字的位宽采用缺省位宽(这由具体的机器系统决定,但至少32位)。3) 在这种描述方式中,采用缺省进制十进制。在表达式中,位宽指明了数字的精确位数。例如:一个4位二进制数的数字的位宽为4,一个4位十六进制数的数字的位宽为16(因为每单个十六进制数就要用4位二进制数来表示)。见下例:8b10101100 /位宽为8的数的二进制表示, b表示二进制8ha2 /位宽为8的数的十六进制,h表示十六进制。 x和z值:在数字电路中,x代表不定

19、值,z代表高阻值。一个x可以用来定义十六进制数的四位二进制数的状态,八进制数的三位,二进制数的一位。z的表示方式同x类似。z还有一种表达方式是可以写作?。在使用case表达式时建议使用这种写法,以提高程序的可读性。见下例:4b10x0 /位宽为4的二进制数从低位数起第二位为不定值4b101z /位宽为4的二进制数从低位数起第一位为高阻值12dz /位宽为12的十进制数其值为高阻值(第一种表达方式)12d? /位宽为12的十进制数其值为高阻值(第二种表达方式)8h4x /位宽为8的十六进制数其低四位值为不定值 负数:一个数字可以被定义为负数,只需在位宽表达式前加一个减号,减号必须写在数字定义表达

20、式的最前面。注意减号不可以放在位宽和进制之间也不可以放在进制和具体的数之间。见下例:-8d5 /这个表达式代表5的补数(用八位二进制数表示)8d-5 /非法格式 下划线(underscore_):下划线可以用来分隔开数的表达以提高程序可读性。但不可以用在位宽和进制处,只能用在具体的数字之间。见下例:16b1010_1011_1111_1010 /合法格式8b_0011_1010 /非法格式当常量不说明位数时,默认值是32位,每个字母用8位的ASCII值表示。例:1032d1032b10101=32d1=32b1-1=-32d1=32hFFFFFFFFBX=32BX=32BXXXXXXXX“AB

21、”=16B01000001_01000010二参数(Parameter)型在Verilog HDL中用parameter来定义常量,即用parameter来定义一个标识符代表一个常量,称为符号常量,即标识符形式的常量,采用标识符代表一个常量可提高程序的可读性和可维护性。parameter型数据是一种常数型的数据,其说明格式如下:parameter 参数名1表达式,参数名2表达式, , 参数名n表达式;parameter是参数型数据的确认符,确认符后跟着一个用逗号分隔开的赋值语句表。在每一个赋值语句的右边必须是一个常数表达式。也就是说,该表达式只能包含数字或先前已定义过的参数。见下列:param

22、eter msb=7; /定义参数msb为常量7parameter e=25, f=29; /定义二个常数参数parameter r=5.7; /声明r为一个实型参数parameter byte_size=8, byte_msb=byte_size-1; /用常数表达式赋值parameter average_delay = (r+f)/2; /用常数表达式赋值参数型常数经常用于定义延迟时间和变量宽度。在模块或实例引用时可通过参数传递改变在被引用模块或实例中已定义的参数。下面将通过两个例子进一步说明在层次调用的电路中改变参数常用的一些用法。例1:在引用Decode实例时,D1,D2的Width将

23、采用不同的值4和5,且D1的Polarity将为0。可用例子中所用的方法来改变参数,即用 #(4,0)向D1中传递 Width=4,Polarity=0; 用#(5)向D2中传递Width=5,Polarity仍为1。module Decode(A,F);parameter Width=1, Polarity=1;endmodulemodule Top;wire3:0 A4;wire4:0 A5;wire15:0 F16;wire31:0 F32;Decode #(4,0) D1(A4,F16);Decode #(5) D2(A5,F32);Endmodule例2:下面是一个多层次模块构成的电

24、路,在一个模块中改变另一个模块的参数时,需要使用defparam命令3.2.2 变量变量即在程序运行过程中其值可以改变的量,在Verilog HDL中变量的数据类型有很多种,这里只对常用的几种进行介绍。网络数据类型表示结构实体(例如门)之间的物理连接。网络类型的变量不能储存值,而且它必需受到驱动器(例如门或连续赋值语句,assign)的驱动。如果没有驱动器连接到网络类型的变量上,则该变量就是高阻的,即其值为z。常用的网络数据类型包括wire型和tri型。这两种变量都是用于连接器件单元,它们具有相同的语法格式和功能。之所以提供这两种名字来表达相同的概念是为了与模型中所使用的变量的实际情况相一致。

25、wire型变量通常是用来表示单个门驱动或连续赋值语句驱动的网络型数据,tri型变量则用来表示多驱动器驱动的网络型数据。如果wire型或tri型变量没有定义逻辑强度(logic strength),在多驱动源的情况下,逻辑值会发生冲突从而产生不确定值。下表为wire型和tri型变量的真值表(注意:这里假设两个驱动源的强度是一致的,关于逻辑强度建模请参阅附录:Verilog语言参考书)。wire/tri01xz00xx01x1x1xxxxxz01xz一 wire型wire型数据常用来表示用于以assign关键字指定的组合逻辑信号。Verilog程序模块中输入输出信号类型缺省时自动定义为wire型。

26、wire型信号可以用作任何方程式的输入,也可以用作“assign”语句或实例元件的输出。wire型信号的格式同reg型信号的很类似。其格式如下:wire n-1:0 数据名1,数据名2,数据名i; /共有i条总线,每条总线内有n条线路 或 wire n:1 数据名1,数据名2,数据名i; wire是wire型数据的确认符,n-1:0和n:1代表该数据的位宽,即该数据有几位。最后跟着的是数据的名字。如果一次定义多个数据,数据名之间用逗号隔开。声明语句的最后要用分号表示语句结束。看下面的几个例子。wire a; /定义了一个一位的wire型数据wire 7:0 b; /定义了一个八位的wire型数

27、据wire 4:1 c, d; /定义了二个四位的wire型数据二 reg型寄存器是数据储存单元的抽象。寄存器数据类型的关键字是reg.通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当。Verilog HDL语言提供了功能强大的结构语句使设计者能有效地控制是否执行这些赋值语句。这些控制结构用来描述硬件触发条件,例如时钟的上升沿和多路器的选通信号。在行为模块介绍这一节中我们还要详细地介绍这些控制结构。reg类型数据的缺省初始值为不定值,x。reg型数据常用来表示用于“always”模块内的指定信号,常代表触发器。通常,在设计中要由“always”块通过使用行为描述语句来表达逻辑

28、关系。在“always”块内被赋值的每一个信号都必须定义成reg型。reg型数据的格式如下:reg n-1:0 数据名1,数据名2, 数据名i;或reg n:1 数据名1,数据名2, 数据名i;reg是reg型数据的确认标识符,n-1:0和n:1代表该数据的位宽,即该数据有几位(bit)。最后跟着的是数据的名字。如果一次定义多个数据,数据名之间用逗号隔开。声明语句的最后要用分号表示语句结束。看下面的几个例子:reg rega; /定义了一个一位的名为rega的reg型数据reg 3:0 regb; /定义了一个四位的名为regb的reg型数据reg 4:1 regc, regd; /定义了两个

29、四位的名为regc和regd的reg型数据对于reg型数据,其赋值语句的作用就象改变一组触发器的存储单元的值。在Verilog中有许多构造(construct)用来控制何时或是否执行这些赋值语句。这些控制构造可用来描述硬件触发器的各种具体情况,如触发条件用时钟的上升沿等,或用来描述具体判断逻辑的细节,如各种多路选择器。reg型数据的缺省初始值是不定值。reg型数据可以赋正值,也可以赋负值。但当一个reg型数据是一个表达式中的操作数时,它的值被当作是无符号值,即正值。例如:当一个四位的寄存器用作表达式中的操作数时,如果开始寄存器被赋以值-1,则在表达式中进行运算时,其值被认为是+15。注意:re

30、g型只表示被定义的信号将用在“always”块内,理解这一点很重要。并不是说reg型信号一定是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出,但并不一定总是这样。在本书中我们还会对这一点作更详细的解释。三 memory型Verilog HDL通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器,ROM存储器和reg文件。数组中的每一个单元通过一个数组索引进行寻址。在Verilog语言中没有多维数组存在。 memory型数据是通过扩展reg型数据的地址范围来生成的。其格式如下:reg n-1:0 存储器名m-1:0;或 reg n-1:0 存储器名m:1;在这里,regn-1:0定义了存储器中每一个存储单元的大小,即该存储单元是一个n位的寄存器。存储器名后的m-1:0或m:1则定义了该存储器中有多少个这样的寄存器。最后用分号结束定义语句。下面举例说明:reg 7:0 mema255:0; 这个例子定义了一个名为mema的存储器,该存储器有256个8位的存储器。该存储器的地址范围是0到255。注意:对存储器进行地址索引的表达式必须是常数表达式。另外,在同一个数据类型声明语句里,可以同时定义存储器型数据和reg型数据。见下例:parameter wo

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1