《chVerilogHDL语法与要素实用实用教案》由会员分享,可在线阅读,更多相关《chVerilogHDL语法与要素实用实用教案(80页珍藏版)》请在金锄头文库上搜索。
1、1(2)多行注释。以起始(qsh)符“/*”开始,到终止符“*/”结束,可以跨越多行,在一对起始(qsh)符与终止符之间的所有内容都被认为是注释。注 释 语 句 第1页/共79页第一页,共80页。2标识符是用户定义的各种名称,可以是模块、端口、寄存器、线网、实例和程序块等元素的名称,比如语句“moduleadder;”就定义了一个(y)标识符adder,而语句“regabc;”则定义了标识符abc。标识符可以是字母、数字和下划线“_”等符号的任意组合序列,但首字符不能是数字,而且单个标识符的总字符数不能多于1024。关键词是语言的保留字,有其特定的和专有的语法作用,用户不能再对这些关键词做新的
2、定义。VerilogHDL共有102个关键词。注意:关键词必须是小写的,如“module”是关键词,而“Module”不是。标识符和关键词第2页/共79页第二页,共80页。3VerilogHDL提供(tgng)了丰富的数据类型,本章把VerilogHDL的数据分为常量和变量两类,并分别介绍其特点和使用方法。表达式是操作符、操作数和标点符号序列,其目的是用来说明一个计算过程。程序中的大部分语句是由表达式构成的,因此表达式是VerilogHDL的重要部分。数据类型与表达式第3页/共79页第三页,共80页。4在程序运行过程中,其值不能被改变的量称为常量。VerilogHDL有整型、实数型、字符串型3
3、种常量。在整型或实数型常量的任意位置可以随意(suy)插入下划线“_”(但是不能当作首符号),这些下划线对数本身并没有意义,但是当数字很长时使用下划线可以提高可读性。6.2 常 量 (constants)第4页/共79页第四页,共80页。5VerilogHDL有4种基本值:0表示逻辑0或“假”;1表示逻辑1或“真”;x表示未知;z表示高阻。注意(zhy):x值和z值都是不分大小写的,也就是说,值0x1z与值0X1Z相同。(尽量统一使用小写)VerilogHDL的常量是由以上这4种基本值组成的。第5页/共79页第五页,共80页。6整型常量即整数,VerilogHDL的整数有两种书写(shxi)格
4、式:十进制数格式,基数格式。(1)十进制数格式是一个可以带正负号的数字序列,代表一个有符号数,如下例:32/十进制数32-15/十进制数-15(1) 整形(zhng xng)常量第6页/共79页第六页,共80页。7(2)基数(jsh)格式的数通常是无符号数,形式如下:sizebasevaluesize定义常量的位数(长度),这是可选项;base是基数(jsh),规定这个数据的进制,可以是o或O(表示八进制),b或B(表示二进制),d或D(表示十进制),h或H(表示十六进制)之一;value是一个数字序列,其形式应与base定义的形式相符。这个数字序列中出现的值x和z以及十六进制中的af不区分大
5、小写,“?”字符可以代替值z。第7页/共79页第七页,共80页。8下面给出一些典型书写方法(fngf),有正确的也有错误的。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/非法:位数不能够为表达式第8页/共79页第八页,共80页。9如果没有定义常量的位数,那么这个数的长度就是相应值的位数,例如:o721/9
6、位八进制数hAF/8位十六进制数如果定义的长度大于数字序列的实际(shj)长度,通常在数据序列的高位(左侧)补0。但是如果这个数字序列最左边一位为x或z,就用x或z在左边补位,例如:10b10/左边补0,000000001010bx0x1/左边补x,xxxxxxx0x1如果定义的长度小于数字序列的实际(shj)长度,这个数字序列最左边超出的位将被截断,例如:3b1001_0011/与3b011相等5H0FFF/与5H1F相等第9页/共79页第九页,共80页。10在VerilogHDL中,实数(shsh)就是浮点数,实数(shsh)的定义方式有两种:(1)十进制格式,由数字和小数点组成(必须有小
7、数点),例如:2.05.67811572.120.12./非法:小数点右侧必须有数字(2) 实数(shsh)型常量第10页/共79页第十页,共80页。112)指数格式,由数字和字符e(E)组成,e(E)的前面必须要有数字而且后面(humian)必须为整数,例如:23_5.1e2/其值为23510.0,忽略下划线3.6E2/其值为360.0(e与E相同)5E4/其值为0.0005第11页/共79页第十一页,共80页。12字符串常量是由一对双引号括起来的字符序列。出现在双引号内的任何(rnh)字符(包括空格和下划线)都将被作为字符串的一部分。如下例:INTERNALERROR“REACHEDHER
8、E/空格出现在双引号内,所以是字符串的组成部分12345_6789_0/下划线出现在双引号内,所以是字符串的组成部分(3) 字符串型常量(chngling)第12页/共79页第十二页,共80页。13实际上,字符都会被转换成二进制数,而且这种二进制数是按特定规则编码的。现在(xinzi)普遍都采用ASCII码,这种代码把每个字符用一个字节(8位)的二进制数表示。所以字符串实际就是若干个8位ASCII码的序列。例如字符串“INTERNALERROR”共有14个字符,存储这个字符串的变量就需要8*14位的存储空间,如下:reg1:8*14Message;/定义变量Message并分配存储空Messa
9、ge=INTERNALERROR/给变量Message赋值为字符串常量第13页/共79页第十三页,共80页。14VerilogHDL有线网和寄存器两种类型的变量,每种类型都有其在电路中的实际意义。1线网型变量线网表示元件之间的物理连线,它不能存储数据。线网是被“驱动”的,可以用连续赋值或把元件的输出连接到线网等方式(fngsh)给线网提供“驱动”,给线网提供驱动的赋值和元件就是“驱动源”,线网的值由驱动源决定。如果没有驱动源连接到线网,线网的缺省值为z。6.3 数 据 类 型第14页/共79页第十四页,共80页。15VerilogHDL共有11种线网类型:wire、tri、wor、trior、
10、wand、triand、trireg、tri1、tri0、supply0、supply1。线网的声明(shngmng)语法形式如下:net_kindmsb:lsbnet1,net2,.,netN;net_kind是线网类型;msb:lsb定义线网宽度的最高位和最低位,这一项是可选的,如果没有定义宽度,那么认为线网宽度是1位;net1,net2netN是线网变量的名称。第15页/共79页第十五页,共80页。16可以在同一个定义中声明多个变量(binling),例如:wireRdy,Start;/Rdy和Start是2个1位的连线wand2:0Addr;/Addr是3位线与型线网线网可以有多个驱动
11、源(多条语句对同一个线网进行赋值),每个驱动源都会给线网赋值,出现这种情况时,线网的取值由线网类型决定。第16页/共79页第十六页,共80页。17worRde;/定义(dngy)Rde为线或类型的线网assignRde=Blt&Wyl;/第一个连续赋值语句是Rde的第1个驱动源assignRde=Kbl|Kip;/第二个连续赋值语句是Rde的第2个驱动源本例中,Rde有两个驱动源,它们分别来自于两个连续赋值语句。由于Rde是“线或”类型的线网,所以Rde的有效值由驱动源的值(右边表达式的值)的线或表决定,具体做法是:把这两个驱动源赋给线网的两个值作为索引去线或表中查询,就可以得到线网真正的有效
12、值。第17页/共79页第十七页,共80页。18在这11种线网中,经常用到的是前6种,下面给出其详细的(1)wire和tri线网wire连线(linxin)。tri三态线。wire和tri型线网都是用于连接单元的连线(linxin),是最常见的线网类型。二者语法和语义一致,不同的是三态线可以用于描述多个驱动源驱动同一根线的线网类型。第18页/共79页第十八页,共80页。19下面是定义这两种线网的实例(shl):wireReset;/1位连线Resetwire3:2Cla,Pla,Sla;/Cla,Pla和Sla都是2位连线triMSB1:LSB+1Art;/三态线Art,位宽由表达式确定第19页
13、/共79页第十九页,共80页。20wire(或tri)01xz00xx01x1x1xxxxxz01xz(1)wire(tri) 真值表 如果多个驱动源驱动一个如果多个驱动源驱动一个(y )连线连线(或三态线网或三态线网), 这个线网的有效值由下列表决定这个线网的有效值由下列表决定 第20页/共79页第二十页,共80页。21例子:assignCla=Pla&Sla;/第1个驱动源.assignCla=PlaSla;/第2个驱动源在这个例子中,Cla有两个驱动源。两个驱动源的值用于在上表中进行索引,以便决定Cla的有效值。Cla是一个向量,在查表确定其有效值时应按位操作。例如,如果(rgu)第1个
14、驱动源的值为01x,第2个驱动源的值为11z,那么Cla的有效值是x1x(两个值的第一位0和1在表中索引到x,第2位1和1在表中索引到1,第3位x和z在表中索引到x)。第21页/共79页第二十一页,共80页。22wor线或。trior三态线或。线或的含义是只要这类线网的某个驱动源值是1,那么(nme)线网的值就是1。线或和三态线或在语法和功能上是一致的。例如:worMSB:LSBArt;triorMAX1:MIN1Rdx,Sdx,Bdx;(2)wor和和trior线网线网第22页/共79页第二十二页,共80页。23wor(或trior)01xz001x011111xx1xxz01xzwor和和
15、trior真值表真值表 如果多个如果多个(du )驱动源驱动这类线网驱动源驱动这类线网, 其有效值由下列表决定其有效值由下列表决定第23页/共79页第二十三页,共80页。24wand线与。triand三态线与。线与的含义是只要(zhyo)这类线网的某个驱动源值是0,那么线网的值就是0。线与和三态线与在语法和功能上是一致的。例如:wand-7:0Dbus;triandReset,Clk;(3)wand和triand线网第24页/共79页第二十四页,共80页。25wand和triand真值表wand(或triand)01xz00100101x1x0xxxz01xz 如果这类线网存在如果这类线网存在
16、(cnzi)多个驱动源多个驱动源, 线网的有效值由下列表决定线网的有效值由下列表决定第25页/共79页第二十五页,共80页。26trireg三态寄存器。这种线网可以存储数值(类似于寄存器),可用于电容节点(jidin)的建模。当没有驱动源时,三态寄存器线网的缺省初始值为x。当它的所有驱动源都处于高阻态(值都为z)时,三态寄存器保存的值是作用在该线网上的最后一个值。例如:(4)trireg线网第26页/共79页第二十六页,共80页。27tri0三态0。tri1三态1。这两类线网可以(ky)用于线逻辑的建模,即线网有多于一个驱动源。tri0(tri1)线网的特征是,若无驱动源驱动,它的值为0(tr
17、i0)或1(tri1)。例如:tri03:3GndBus;tri10:5OtBus,ItBus;(5)tri0和tri1线网第27页/共79页第二十七页,共80页。28tri0和tri1真值表tri0(或tri1)01xz00xx01x1x1xxxxxz01x0(1) 在有多个在有多个(du )驱动源情况下驱动源情况下, tri0和和tri1的有效值有下列表得到的有效值有下列表得到第28页/共79页第二十八页,共80页。29supply0用于对“地”建模,即低电平0。supply1用于对电源(dinyun)建模,即高电平1。例如:supply0Gnd,ClkGnd;supply12:0Vcc;
18、(6)supply0和supply1线网第29页/共79页第二十九页,共80页。30在VerilogHDL中,可以不必声明某种线网的类型。在这样的情况下,缺省线网类型为1位连线(linxin)(wire)。wire是VerilogHDL内置的默认线网类型,可以使用编译器指令default_nettype改变这一默认线网类型。使用方法如下:default_nettypenet_kind这里的net_kind就成为系统默认的线网类型,例如:default_nettypewand带有这条编译器指令的程序中,任何未被说明类型的线网都被设置为1位线与。(7)未说明的线网第30页/共79页第三十页,共80
19、页。31scalared标量线网。vectored向量线网。scalared和vectored是声明线网时的可选项。如果没有定义(dngy)这一项,那么缺省值是标量线网(scalared),前面所有程序中的线网都是这样的。如果某个线网声明时使用了vectored,那么就不允许对该线网做位选择(只选择线网值中的1位)和部分选择(选择线网值中的部分位),必须对线网整体赋值。(8)scalared线网和vectored线网第31页/共79页第三十一页,共80页。32例如(lr):wirevectored3:1Grb;/使用了vectored不允许位选择(如Grb2)和部分选择(如Grb3:2)wor
20、scalared4:0Best;/使用了scalared,效果与“wor4:0Best;”相同,允许位选择(如Best2)和部分选择(如Best3:1)第32页/共79页第三十二页,共80页。33程序中经常多次出现某些数字,如延迟时间或变量的宽度,有时(如调用任务或实例化模块时)可能要改变这些值,这种情况下经常要用到参数。参数一经声明,就视其为一个常量,在整个仿真过程中不再(bzi)改变。其声明形式如下:parameter参数名1=表达式1,param2=const_expr2,.,paramN=const_exprN;parameter是用于声明参数的关键词;param1、param2par
21、amN是标识符;const_expr1、const_expr2const_exprN分别是标识符要代表的数字,它们可以不仅仅是数字,也可以是计算表达式。6.4 参 数 (parameter)第33页/共79页第三十三页,共80页。34。下面是3条参数声明语句:parameterLINELENGTH=132,ALL_X_S=16bx;parameterBIT=1,BYTE=8,PI=3.14;parameterSTROBE_DELAY=(BYTE+BIT)/2;使用参数可以提高程序(chngx)的可读性,也利于修改,尤其是延迟时间和变量宽度这些在调试中可能经常修改的值。第34页/共79页第三十四
22、页,共80页。356.5 向 量向量: 线宽大(kund)于1位的变量MSB(Most Significant Bit):最高有效位LSB (Lease Significant Bit): 最底有效位msb :lsbreg 3:0 canos;wire 5:0 bus;第35页/共79页第三十五页,共80页。36位选择(xunz)和域选择(xunz)A : 1位B: 7位A = B4;assign c=a2&b3; 位选择(xunz)assign c=a7:4+b3:0; 域选择(xunz)6543210第36页/共79页第三十六页,共80页。37表达式的操作数可以是线网或寄存器的某个位,即位
23、(jwi)选择。位选择是从线网(或寄存器)中选择特定的某个位。形式如下:net_or_reg_vectorbit_select_expr其中,net_or_reg_vector是向量线网或寄存器名,bit_select_expr是要选择位的编号。例如:State1&State4/寄存器位选择,让State1和State4做逻辑与操作Prt0|Bbq/线网位选择,让Prt0和Bbq做位或操作第37页/共79页第三十七页,共80页。38上例中,State是多位寄存器,Prt多位线网,Bbq是1位线网,可见通过使用位选择可以对线网和寄存器中的某个位进行操作。注意(zhy),如果bit_select_
24、expr的值为x、z或越界,那么位选择得到的值为x,如Statex值为x。第38页/共79页第三十八页,共80页。39和位选择(xunz)类似,线网或寄存器的部分连续位也可以作为表达式中的操作数。部分选择(xunz)是在线网或寄存器中选择(xunz)某几个连续的位。形式如下:net_or_reg_vectormsb:lsb其中,net_or_reg_vector是向量线网或寄存器名,msb和lsb声明了要选择(xunz)的位的编号范围。部分部分(b fen)选择选择第39页/共79页第三十九页,共80页。40例如:State1:4/State是多位寄存器,寄存器部分选择,选择了State中编号
25、从1到4的4个位Prt1:3/Prt是多位线网,线网部分选择,选择了Prt中编号从1到3的3个位注意,在部分选择中若msb或lsb的值为x、z或它们(tmen)标定的范围超出了向量的实际范围时,部分选择的值为x。第40页/共79页第四十页,共80页。41存储器建模是使用reg声明寄存器组,不能在一条语句内就完成对存储器内所有寄存器单元的赋值,必须对其中(qzhng)的存储器单元(即单个寄存器)进行赋值。形式如下:memoryword_address其中(qzhng),memory是存储器名,word_address是要选择单元的编号(即某个寄存器的编号)。存储器存储器第41页/共79页第四十一
26、页,共80页。42例如:reg1:8Ack,Dram0:63;/*定义(dngy)了一个8位寄存器Ack和一个有64个8位寄存器组成的存储器*/.Ack=Dram60;/把存储器Dram的编号为60的存储单元的值赋给Ack注意,虽然存储器单元就是寄存器,但不允许对存储器单元做位选择或部分选择。例如:Dram602/位选择不允许Dram602:4/部分选择也不允许第42页/共79页第四十二页,共80页。43如果想从存储器中读取一个位或部分位,可以先把存储器单元赋值给某个寄存器变量,然后(rnhu)对该寄存器变量进行位选择或部分选择操作。如在上例中做了Ack=Dram60之后,Ack2和Ack2:
27、4就能够取出存储器单元Dram60的某个位或部分位。第43页/共79页第四十三页,共80页。44VerilogHDL的操作符有如下9种类型:算术操作符关系(gunx)操作符相等操作符逻辑操作符按位操作符归约操作符移位操作符条件操作符连接和复制操作符6.6 运算符运算符第44页/共79页第四十四页,共80页。45操作符的优先级和名称操作符的优先级和名称(mngchng)优先优先级别级别操作操作符符名称名称优先优先级别级别操作操作符符名称名称优先优先级别级别操作操作符符名称名称优先优先级别级别操作操作符符名称名称1+加加9|或或17右移右移25!=非全非全等等2-减减10|或非或非18小于小于26
28、&位与位与3!逻辑逻辑非非11*乘乘19大于大于28,异或异或非非5&与与13%取模取模21=大于大于等于等于29|位或位或6&与非与非14+二元二元加加22=相等相等30&逻辑逻辑与与7异或异或15-二元二元减减23!=不等不等31|逻辑逻辑或或8或或异或异或非非16(大于)=(不小于)45/结果为假(0)52=b01110/结果为假(0)操作时给左侧操作数高位添0,等价于:b01000=b01110/结果为假(0)第57页/共79页第五十七页,共80页。58与关系操作符类似,相等操作符也是对两个操作数进行比较,如果比较结果为假,则结果为0,否则(fuz)结果为1。相等操作符有如下4种:=(
29、逻辑相等)!=(逻辑不等)=(全等)!=(非全等)3相等相等(xingdng)操作符操作符第58页/共79页第五十八页,共80页。59其中,“=”和“!=”是把两个操作数的逻辑值做比较,由于操作数中某些位可能是x或z,所以比较结果( jigu)也有可能是x。而“=”和“!=”是按位进行比较,即便在两个操作数中某些位出现了x或z,只要它们出现在相同的位,那么就认为二者是相同的,比较结果( jigu)为1,否则为0,而不会出现结果( jigu)为x的情况。第59页/共79页第五十九页,共80页。60例如:Data=b11x0;Addr=b11x0;那么:Data=Addr/为真,也就是说值为1,因
30、为全等操作(cozu)严格按位比较Data=Addr/这是逻辑比较,操作(cozu)数中出现了x,所以结果为x第60页/共79页第六十页,共80页。61如果操作符两端(lindun)操作数的长度不相等,长度较小的操作数在高位添0补位,例如:2b10=4b0010/结果为真(1)与下面的表达式相同:4b0010=4b0010/结果为真(1)第61页/共79页第六十一页,共80页。62逻辑操作(cozu)符是对操作(cozu)数做与、或、非运算,操作(cozu)结果为0或1。逻辑操作(cozu)符有3种:&(逻辑与)|(逻辑或)!(逻辑非)4逻辑逻辑(lu j)操作符操作符第62页/共79页第六十
31、二页,共80页。63逻辑操作符的操作数只能是逻辑值0或1,例如(lr):Crd=b0;/Crd是逻辑0Dgs=b1;/Dgs是逻辑1那么:Crd&Dgs/结果为0(假)Crd|Dgs/结果为1(真)!Dgs/结果为0(假)第63页/共79页第六十三页,共80页。64如果操作数是向量,那么非0向量被当作(dnzu)逻辑1,例如:A_Bus=b0110;/A_Bus不是0向量,被当作(dnzu)逻辑1B_Bus=b0100;/B_Bus不是0向量,被当作(dnzu)逻辑1那么:A_Bus|B_Bus/结果为1A_Bus&B_Bus/结果为1!A_Bus/结果为0!B_Bus/结果为0在逻辑操作中,
32、如果任意一个操作数包含x,结果也为x,如!x的结果为x。第64页/共79页第六十四页,共80页。65位操作符是对操作数按位进行与、或、非等逻辑操作。位操作符有如下5种:(一元非,只有一个操作数位于右侧(yuc))&(二元与,有两个操作数位于左右两侧)|(二元或,有两个操作数位于左右两侧)(二元异或,有两个操作数位于左右两侧),(二元异或非,有两个操作数位于左右两侧)5位操作符位操作符第65页/共79页第六十五页,共80页。66例如:A=b0110;B=b0100;那么:A|B/结果为0110A&B/结果为0100如果(rgu)两个操作数长度不相等,长度较小的操作数在高位添0补位,例如:b011
33、0b10000/结果为b10110与下式相同:b00110b10000/结果为b10110第66页/共79页第六十六页,共80页。67归约操作符的操作数只有一个,并只产生1位结果。归约操作符有如下6种:&(归约与)如果操作数的某个(mu)位的值为0,那么结果为0;如果操作数的某个(mu)位的值为x或z,那么结果为x;否则结果为1。&(归约与非)与归约操作符&相反。6规约规约(guyu)操作符操作符第67页/共79页第六十七页,共80页。68例如:A=b0110;B=b0100;那么:|B/结果(jigu)为1,因为B中有1&B/结果(jigu)为0,因为B中有0A/结果(jigu)为0,因为A
34、中有偶数个1归约异或操作符“”可用于检查操作数中是否包含x,例如:MyReg=4b01x0;MyReg/结果(jigu)为x,说明操作数MyReg中包含x第68页/共79页第六十八页,共80页。69移位操作符是把操作数向左或向右移位若干位。移位操作符有2种:(右移)移位操作符有两个操作数,左侧操作数是要被执行移位的数,右侧操作数表示要移位的次数。完成移位之后,因为移位而在操作数左端(右移)或右端(左移)出现的空位添0。如果(rgu)右侧操作数的值为x或z,移位操作的结果为x。7移位移位(y wi)操作符操作符第69页/共79页第六十九页,共80页。70例如:reg0:7Qreg;/8位寄存器.
35、Qreg=4b0111;/Oreg的值是0000_0111那么:Qreg2/右移结果是8b0000_0001,因为(ynwi)右移而出现的左侧空位补0第70页/共79页第七十页,共80页。71二进制数左移1位相当于乘以2,右移(yuy)1位相当于除以2,所以建模时,可以使用移位操作符实现乘除。VerilogHDL中没有指数操作符,而移位操作符可用于支持部分指数操作。比如要计算2的N次方的值,可以使用移位操作实现,如下:32b1N/N必须小于32另外,可以使用移位操作给2-4解码器建模,如:wire0:3DecodeOut=4b118?Grade_A:Grade_C;计算表达式Marks18是否成立,如果为真,Grade_A被赋值给Student;如果为假(Marks。有符号数存储在整数寄存器和十进制形式的整数中。(2)无符号数和有符号数。位操作符是对操作数按位进行与、或、非等逻辑操作。 (左移)。由于非定长常数的长度未知,不允许连接非定长常数。感谢您的欣赏第八十页,共80页。