ch6VerilogHDL语法与要素_第1页
ch6VerilogHDL语法与要素_第2页
ch6VerilogHDL语法与要素_第3页
ch6VerilogHDL语法与要素_第4页
ch6VerilogHDL语法与要素_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

VerilogHDL语法与要素,延边大学工学院电子信息通信学科许一男,2,VerilogHDL的注释语句有两种形式:(1)单行注释。用符号“/”表示注释的开始,从这个符号开始到本行的结束都被认为是注释,而且它只能注释到本行结束。,6.1VerilogHDL语言要素(注释语句),3,(2)多行注释。以起始符“/*”开始,到终止符“*/”结束,可以跨越多行,在一对起始符与终止符之间的所有内容都被认为是注释。,注释语句,4,标识符是用户定义的各种名称,可以是模块、端口、寄存器、线网、实例和程序块等元素的名称,比如语句“moduleadder;”就定义了一个标识符adder,而语句“regabc;”则定义了标识符abc。标识符可以是字母、数字和下划线“_”等符号的任意组合序列,但首字符不能是数字,而且单个标识符的总字符数不能多于1024。关键词是语言的保留字,有其特定的和专有的语法作用,用户不能再对这些关键词做新的定义。VerilogHDL共有102个关键词。注意:关键词必须是小写的,如“module”是关键词,而“Module”不是。,标识符和关键词,5,VerilogHDL提供了丰富的数据类型,本章把VerilogHDL的数据分为常量和变量两类,并分别介绍其特点和使用方法。表达式是操作符、操作数和标点符号序列,其目的是用来说明一个计算过程。程序中的大部分语句是由表达式构成的,因此表达式是VerilogHDL的重要部分。,数据类型与表达式,6,在程序运行过程中,其值不能被改变的量称为常量。VerilogHDL有整型、实数型、字符串型3种常量。在整型或实数型常量的任意位置可以随意插入下划线“_”(但是不能当作首符号),这些下划线对数本身并没有意义,但是当数字很长时使用下划线可以提高可读性。,6.2常量(constants),7,VerilogHDL有4种基本值:0表示逻辑0或“假”;1表示逻辑1或“真”;x表示未知;z表示高阻。注意:x值和z值都是不分大小写的,也就是说,值0 x1z与值0X1Z相同。(尽量统一使用小写)VerilogHDL的常量是由以上这4种基本值组成的。,8,整型常量即整数,VerilogHDL的整数有两种书写格式:十进制数格式,基数格式。(1)十进制数格式是一个可以带正负号的数字序列,代表一个有符号数,如下例:32/十进制数32-15/十进制数-15,(1)整形常量,9,(2)基数格式的数通常是无符号数,形式如下:sizebasevaluesize定义常量的位数(长度),这是可选项;base是基数,规定这个数据的进制,可以是o或O(表示八进制),b或B(表示二进制),d或D(表示十进制),h或H(表示十六进制)之一;value是一个数字序列,其形式应与base定义的形式相符。这个数字序列中出现的值x和z以及十六进制中的af不区分大小写,“?”字符可以代替值z。,10,下面给出一些典型书写方法,有正确的也有错误的。5O37/5位八进制数4D2/4位十进制数4B1x_01/4位二进制数7Hx/7位x(扩展的x),即xxxxxxx4hZ/4位z(扩展的z),即zzzz2h1?/2位十六进制数,与2h1z相同8h2A/在位数和字符之间,以及基数和数值之间允许出现空格4d-4/非法:数值不能为负3b001/非法:和基数b之间不允许出现空格(2+3)b10/非法:位数不能够为表达式,11,如果没有定义常量的位数,那么这个数的长度就是相应值的位数,例如:o721/9位八进制数hAF/8位十六进制数如果定义的长度大于数字序列的实际长度,通常在数据序列的高位(左侧)补0。但是如果这个数字序列最左边一位为x或z,就用x或z在左边补位,例如:10b10/左边补0,000000001010bx0 x1/左边补x,xxxxxxx0 x1如果定义的长度小于数字序列的实际长度,这个数字序列最左边超出的位将被截断,例如:3b1001_0011/与3b011相等5H0FFF/与5H1F相等,12,在VerilogHDL中,实数就是浮点数,实数的定义方式有两种:(1)十进制格式,由数字和小数点组成(必须有小数点),例如:2.05.67811572.120.12./非法:小数点右侧必须有数字,(2)实数型常量,13,2)指数格式,由数字和字符e(E)组成,e(E)的前面必须要有数字而且后面必须为整数,例如:23_5.1e2/其值为23510.0,忽略下划线3.6E2/其值为360.0(e与E相同)5E4/其值为0.0005,14,字符串常量是由一对双引号括起来的字符序列。出现在双引号内的任何字符(包括空格和下划线)都将被作为字符串的一部分。如下例:INTERNALERROR“REACHEDHERE/空格出现在双引号内,所以是字符串的组成部分12345_6789_0/下划线出现在双引号内,所以是字符串的组成部分,(3)字符串型常量,15,实际上,字符都会被转换成二进制数,而且这种二进制数是按特定规则编码的。现在普遍都采用ASCII码,这种代码把每个字符用一个字节(8位)的二进制数表示。所以字符串实际就是若干个8位ASCII码的序列。例如字符串“INTERNALERROR”共有14个字符,存储这个字符串的变量就需要8*14位的存储空间,如下:reg1:8*14Message;/定义变量Message并分配存储空Message=INTERNALERROR/给变量Message赋值为字符串常量,16,VerilogHDL有线网和寄存器两种类型的变量,每种类型都有其在电路中的实际意义。1线网型变量线网表示元件之间的物理连线,它不能存储数据。线网是被“驱动”的,可以用连续赋值或把元件的输出连接到线网等方式给线网提供“驱动”,给线网提供驱动的赋值和元件就是“驱动源”,线网的值由驱动源决定。如果没有驱动源连接到线网,线网的缺省值为z。,6.3数据类型,17,VerilogHDL共有11种线网类型:wire、tri、wor、trior、wand、triand、trireg、tri1、tri0、supply0、supply1。线网的声明语法形式如下:net_kindmsb:lsbnet1,net2,.,netN;net_kind是线网类型;msb:lsb定义线网宽度的最高位和最低位,这一项是可选的,如果没有定义宽度,那么认为线网宽度是1位;net1,net2netN是线网变量的名称。,18,可以在同一个定义中声明多个变量,例如:wireRdy,Start;/Rdy和Start是2个1位的连线wand2:0Addr;/Addr是3位线与型线网线网可以有多个驱动源(多条语句对同一个线网进行赋值),每个驱动源都会给线网赋值,出现这种情况时,线网的取值由线网类型决定。,19,worRde;/定义Rde为线或类型的线网assignRde=Blt/第二个连续赋值语句是Rde的第2个驱动源本例中,Rde有两个驱动源,它们分别来自于两个连续赋值语句。由于Rde是“线或”类型的线网,所以Rde的有效值由驱动源的值(右边表达式的值)的线或表决定,具体做法是:把这两个驱动源赋给线网的两个值作为索引去线或表中查询,就可以得到线网真正的有效值。,20,在这11种线网中,经常用到的是前6种,下面给出其详细的(1)wire和tri线网wire连线。tri三态线。wire和tri型线网都是用于连接单元的连线,是最常见的线网类型。二者语法和语义一致,不同的是三态线可以用于描述多个驱动源驱动同一根线的线网类型。,21,下面是定义这两种线网的实例:wireReset;/1位连线Resetwire3:2Cla,Pla,Sla;/Cla,Pla和Sla都是2位连线triMSB1:LSB+1Art;/三态线Art,位宽由表达式确定,22,(1)wire(tri)真值表,如果多个驱动源驱动一个连线(或三态线网),这个线网的有效值由下列表决定,23,例子:assignCla=Pla/第2个驱动源在这个例子中,Cla有两个驱动源。两个驱动源的值用于在上表中进行索引,以便决定Cla的有效值。Cla是一个向量,在查表确定其有效值时应按位操作。例如,如果第1个驱动源的值为01x,第2个驱动源的值为11z,那么Cla的有效值是x1x(两个值的第一位0和1在表中索引到x,第2位1和1在表中索引到1,第3位x和z在表中索引到x)。,24,wor线或。trior三态线或。线或的含义是只要这类线网的某个驱动源值是1,那么线网的值就是1。线或和三态线或在语法和功能上是一致的。例如:worMSB:LSBArt;triorMAX1:MIN1Rdx,Sdx,Bdx;,(2)wor和trior线网,25,wor和trior真值表,如果多个驱动源驱动这类线网,其有效值由下列表决定,26,wand线与。triand三态线与。线与的含义是只要这类线网的某个驱动源值是0,那么线网的值就是0。线与和三态线与在语法和功能上是一致的。例如:wand-7:0Dbus;triandReset,Clk;,(3)wand和triand线网,27,wand和triand真值表,如果这类线网存在多个驱动源,线网的有效值由下列表决定,28,trireg三态寄存器。这种线网可以存储数值(类似于寄存器),可用于电容节点的建模。当没有驱动源时,三态寄存器线网的缺省初始值为x。当它的所有驱动源都处于高阻态(值都为z)时,三态寄存器保存的值是作用在该线网上的最后一个值。例如:,(4)trireg线网,29,tri0三态0。tri1三态1。这两类线网可以用于线逻辑的建模,即线网有多于一个驱动源。tri0(tri1)线网的特征是,若无驱动源驱动,它的值为0(tri0)或1(tri1)。例如:tri03:3GndBus;tri10:5OtBus,ItBus;,(5)tri0和tri1线网,30,tri0和tri1真值表,在有多个驱动源情况下,tri0和tri1的有效值有下列表得到,31,supply0用于对“地”建模,即低电平0。supply1用于对电源建模,即高电平1。例如:supply0Gnd,ClkGnd;supply12:0Vcc;,(6)supply0和supply1线网,32,在VerilogHDL中,可以不必声明某种线网的类型。在这样的情况下,缺省线网类型为1位连线(wire)。wire是VerilogHDL内置的默认线网类型,可以使用编译器指令default_nettype改变这一默认线网类型。使用方法如下:default_nettypenet_kind这里的net_kind就成为系统默认的线网类型,例如:default_nettypewand带有这条编译器指令的程序中,任何未被说明类型的线网都被设置为1位线与。,(7)未说明的线网,33,scalared标量线网。vectored向量线网。scalared和vectored是声明线网时的可选项。如果没有定义这一项,那么缺省值是标量线网(scalared),前面所有程序中的线网都是这样的。如果某个线网声明时使用了vectored,那么就不允许对该线网做位选择(只选择线网值中的1位)和部分选择(选择线网值中的部分位),必须对线网整体赋值。,(8)scalared线网和vectored线网,34,例如:wirevectored3:1Grb;/使用了vectored不允许位选择(如Grb2)和部分选择(如Grb3:2)worscalared4:0Best;/使用了scalared,效果与“wor4:0Best;”相同,允许位选择(如Best2)和部分选择(如Best3:1),35,程序中经常多次出现某些数字,如延迟时间或变量的宽度,有时(如调用任务或实例化模块时)可能要改变这些值,这种情况下经常要用到参数。参数一经声明,就视其为一个常量,在整个仿真过程中不再改变。其声明形式如下:parameter参数名1=表达式1,param2=const_expr2,.,paramN=const_exprN;parameter是用于声明参数的关键词;param1、param2paramN是标识符;const_expr1、const_expr2const_exprN分别是标识符要代表的数字,它们可以不仅仅是数字,也可以是计算表达式。,6.4参数(parameter),36,。下面是3条参数声明语句:parameterLINELENGTH=132,ALL_X_S=16bx;parameterBIT=1,BYTE=8,PI=3.14;parameterSTROBE_DELAY=(BYTE+BIT)/2;使用参数可以提高程序的可读性,也利于修改,尤其是延迟时间和变量宽度这些在调试中可能经常修改的值。,37,6.5向量,向量:线宽大于1位的变量MSB(MostSignificantBit):最高有效位LSB(LeaseSignificantBit):最底有效位msb:lsbreg3:0canos;wire5:0bus;,38,位选择和域选择,A:1位B:7位A=B4;assignc=a2域选择,6,5,4,3,2,1,0,39,表达式的操作数可以是线网或寄存器的某个位,即位选择。位选择是从线网(或寄存器)中选择特定的某个位。形式如下:net_or_reg_vectorbit_select_expr其中,net_or_reg_vector是向量线网或寄存器名,bit_select_expr是要选择位的编号。例如:State1/*定义了一个8位寄存器Ack和一个有64个8位寄存器组成的存储器*/.Ack=Dram60;/把存储器Dram的编号为60的存储单元的值赋给Ack注意,虽然存储器单元就是寄存器,但不允许对存储器单元做位选择或部分选择。例如:Dram602/位选择不允许Dram602:4/部分选择也不允许,45,如果想从存储器中读取一个位或部分位,可以先把存储器单元赋值给某个寄存器变量,然后对该寄存器变量进行位选择或部分选择操作。如在上例中做了Ack=Dram60之后,Ack2和Ack2:4就能够取出存储器单元Dram60的某个位或部分位。,46,VerilogHDL的操作符有如下9种类型:算术操作符关系操作符相等操作符逻辑操作符按位操作符归约操作符移位操作符条件操作符连接和复制操作符,6.6运算符,47,操作符的优先级和名称,48,其中,除条件操作符从右向左关联外,其余所有操作符均自左向右关联。如表达式:A+B-C等价于:(A+B)-C/自左向右而表达式:A?B:C?D:F等价于:A?B:(C?D:F)/从右向左通过使用圆扩号可以改变优先级的顺序,如下例:(A?B:C)?D:F/改变了条件操作符的优先级,49,算术操作符有如下5种:(加法操作符)(减法操作符)*(乘法操作符)/(除法操作符)%(模操作符,或称求余操作符,两侧都应为整型数据),1算术操作符,50,注意:整数除法将截断所有小数部分,如7/4结果为1;模操作符将求出与第一个操作数符号相同的余数,如7%4结果为3,而-7%4结果为-3;如果算术操作符的操作数中出现x或z,那么整个算术操作的运算结果为x。例如:b10 x1+b01111的结果为不确定数bxxxxx。,51,进行算术操作时,表达式中操作数的长度可能不一致,这时运算结果的长度由最长的操作数决定。在赋值语句中,算术操作结果的长度由操作符左端的赋值目标长度决定。例如:reg0:3Arc,Bar,Crt;reg0:5Frx;Arc=Bar+Crt;/长度由Bar,Crt和Arc长度决定,长度为4位Frx=Bar+Crt;/长度由Frx的长度决定(Frx、Bat和Crt中的最长长度),长度为6位,(1)算术操作结果的长度,52,在第一个赋值中,加法操作的溢出部分被丢弃;而在第二个赋值中,任何溢出的位存储在结果位Frx1中。在较大的表达式中,中间结果的长度应取最大操作数的长度(赋值时此规则也包括左端赋值目标)。例如:wire4:1Box,Drt;wire1:5Cfg;wire1:6Peg;wire1:8Adt;.assignAdt=(Box+Cfg)+(Drt+Peg);/赋值语句,53,赋制语句表达式右端的操作数最长为6(Peg),但是表达式左端操作数的长度为8(Adt),所以所有的加操作都使用8位,所以Box与Cfg相加的结果和Drt与Peg相加结果的长度都是8位。,54,执行算术操作和赋值时,要注意哪些操作数是无符号数、哪些操作数是有符号数。无符号数存储在线网、一般寄存器和基数格式表示形式的整数中。有符号数存储在整数寄存器和十进制形式的整数中。,(2)无符号数和有符号数,55,例如:reg0:5Bar;integerTab;.Bar=-4d12;/*Bar是普通寄存器类型变量,只能存储无符号数,而右端表达式的值为b110100(12的二进制补码),因此在赋值后,Bar存储十进制值52*/,56,在上面两种情况下,位向量存储内容相同,但是在Bar中,位向量被视为无符号数,而在Tab中,位向量被视为有符号数。下面再给出几组例子。Bar=-4d12/4;/Bar被赋于十进制值61(位向量为111101)Tab=-4d12/4;/Tab被赋于与十进制1073741821(位值为0011.11101)Bar=-12/4/Bar被赋予与第一个赋值相同的值,是因为Bar只存储无符号数Tab=-12/4/Bar被赋于十进制值3,57,Bar=4-6;/Bar被赋于十进制值62(2的二进制补码)Tab=4-6;/Tab被赋于十进制值2(位向量为111110)Bar=-2+(-4);/Bar被赋于十进制值58(位向量为111010)Tab=-2+(-4);/Tab被赋于十进制值6(位向量为111010),58,关系操作符是对两个操作数进行比较,如果比较结果为真则结果为1,如果比较结果为假则结果为0,关系操作符多用于条件判断。关系操作符有如下4种:(大于)=(不小于)45/结果为假(0)52=b01110/结果为假(0)操作时给左侧操作数高位添0,等价于:b01000=b01110/结果为假(0),60,与关系操作符类似,相等操作符也是对两个操作数进行比较,如果比较结果为假,则结果为0,否则结果为1。相等操作符有如下4种:=(逻辑相等)!=(逻辑不等)=(全等)!=(非全等),3相等操作符,61,其中,“=”和“!=”是把两个操作数的逻辑值做比较,由于操作数中某些位可能是x或z,所以比较结果也有可能是x。而“=”和“!=”是按位进行比较,即便在两个操作数中某些位出现了x或z,只要它们出现在相同的位,那么就认为二者是相同的,比较结果为1,否则为0,而不会出现结果为x的情况。,62,例如:Data=b11x0;Addr=b11x0;那么:Data=Addr/为真,也就是说值为1,因为全等操作严格按位比较Data=Addr/这是逻辑比较,操作数中出现了x,所以结果为x,63,如果操作符两端操作数的长度不相等,长度较小的操作数在高位添0补位,例如:2b10=4b0010/结果为真(1)与下面的表达式相同:4b0010=4b0010/结果为真(1),64,逻辑操作符是对操作数做与、或、非运算,操作结果为0或1。逻辑操作符有3种:/Crd是逻辑0Dgs=b1;/Dgs是逻辑1那么:Crd/A_Bus不是0向量,被当作逻辑1B_Bus=b0100;/B_Bus不是0向量,被当作逻辑1那么:A_Bus|B_Bus/结果为1A_BusB=b0100;那么:A|B/结果为0110AB=b0100;那么:|B/结果为1,因为B中有1MyReg/结果为x,说明操作数MyReg中包含x,71,移位操作符是把操作数向左或向右移位若干位。移位操作符有2种:(右移)移位操作符有两个操作数,左侧操作数是要被执行移位的数,右侧操作数表示要移位的次数。完成移位之后,因为移位而在操作数左端(右移)或右端(左移)出现的空位添0。如果右侧

温馨提示

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

评论

0/150

提交评论