Verilog-HDL基本语法.ppt
- 文档编号:885392
- 上传时间:2023-04-30
- 格式:PPT
- 页数:82
- 大小:528.50KB
Verilog-HDL基本语法.ppt
《Verilog-HDL基本语法.ppt》由会员分享,可在线阅读,更多相关《Verilog-HDL基本语法.ppt(82页珍藏版)》请在冰点文库上搜索。
第二部分VerilogHDL基本语法,2.1VerilogHDL程序模块结构,2.1.1模块端口定义模块端口定义用来声明设计电路模块的输入输出端口。
端口定义格式如下module模块名(端口1,端口2,端口3,);在端口定义的圆括弧中,是设计电路模块与外界联系的全部输入输出端口信号或引脚,它是设计实体对外的一个通信界面,是外界可以看到的部分(不包含电源和接地端),多个端口名之间用“,”分隔。
例如,moduleadder(sum,cont,ina,inb,cin);,2.1.2模块内容模块内容包括I/O说明、信号类型声明和功能描述。
1.模块的I/O说明模块的I/O说明用来声明模块端口定义中各端口数据流动方向包括输入(input)、输出(output)和双向(inout)。
I/O说明格式如下input端口1,端口2,端口3,;output端口1,端口2,端口3,;例如inputina,inb,cin;outputsum,cont;,2.信号类型声明信号类型声明用来说明设计电路的功能描述中,所用的信号的数据类型以及函数声明。
信号的数据类型主要有连线(wire)、寄存器(reg)、整型(integer)、实型(real)和时间(time)等类型。
3.功能描述功能描述是VerilogHDL程序设计中最主要的部分,用来描述设计模块的内部结构和模块端口间的逻辑关系,在电路上相当于器件的内部电路结构。
功能描述可以用assign语句、元件例化(instantiate)、always块语句、initial块语句等方法来实现,通常把确定这些设计模块描述的方法称为建模。
(1)用assign语句建模用assign语句建模的方法很简单,只需要在“assign”后面再加一个表达式即可。
assign语句一般适合对组合逻辑进行赋值,称为连续赋值方式。
【例2.1】1位全加器的设计。
ina,inb,cin,adder1,sum,cout,VerilogHDL源程序如下moduleadder1(sum,cout,ina,inb,cin);/模块端口定义inputina,inb,cin;outputsum,cout;/I/O声明assigncout,sum=ina+inb+cin;/功能描述语句endmodule/endmodule后不加分号,默认的数据类型为wire(连线)型,为拼接运算符,是将cout、sum这样两个1位操作数拼接为一个2位操作数。
(2)用元件例化(instantiate)方式建模元件例化方式建模是利用VerilogHDL提供的元件库实现的。
例如,用与门例化元件定义一个3输入端与门可以写为andmyand3(y,a,b,c);,(3)用always块语句建模always块语句可以产生各种逻辑,常用于时序逻辑的功能描述。
一个程序设计模块中,可以包含一个或多个always语句。
程序运行中,在某种条件满足时,就重复执行一遍always结构中的语句。
【例2.2】8位二进制加法计数器的设计。
modulecnt8(out,cout,data,load,cin,clk,clr);input7:
0data;inputload,cin,clk,clr;output7:
0out;outputcout;reg7:
0out;/寄存器型参量,具有寄存功能,always(posedgeclk)/时钟上升沿,每次上升沿,执行always语句beginif(clr)out=8b0;elseif(load)out=data;elseout=out+8b1;endassigncout=/”&out”与缩减运算式endmodule,(4)用initial块语句建模initial块语句与always语句类似,不过在程序中它只执行1次就结束了。
VerilogHDL程序设计模块的基本结构小结:
VerilogHDL程序是由模块构成的。
每个模块的内容都是嵌在module和endmodule两语句之间,每个模块实现特定的功能,模块是可以进行层次嵌套的。
每个模块首先要进行端口定义,并说明输入(input)、输出(output)或双向(inouts),然后对模块的功能进行逻辑描述。
VerilogHDL程序的书写格式自由,一行可以一条或多条语句,一条语句也可以分为多行写。
除了endmodule语句外,每条语句后必须要有分号“;”。
可以用/*/或/对VerilogHDL程序的任何部分作注释。
一个完整的源程序都应当加上需要的注释,以加强程序的可读性。
2.2VerilogHDL的词法,2.2.1空白符和注释VerilogHDL的空白符包括空格、tab符号、换行和换页。
空白符如果不是出现在字符串中,编译源程序时将被忽略。
注释分为行注释和块注释两种方式。
行注释用符号/(两个斜杠)开始,注释到本行结束。
块注释用/*开始,用*/结束。
块注释可以跨越多行,但它们不能嵌套。
2.2.2常数VerilogHDL的常数包括数字、未知X和高阻Z三种。
数字可以用二进制、十进制、八进制和十六进制等4种不同数制来表示,完整的数字格式为其中,位宽表示数字对应的二进制数的位数宽度;进制符号包括b或B(表示二进制数),d或D(表示十进制数),h或H(表示十六进制数),o或O(表示八进制数)。
例如8b10110001/表示位宽为8位的二进制数8hf5/表示位宽为8位的十六进制数十进制数的位宽和进制符号可以缺省,例如/表示十进制数125X和Z表示位数的特殊性:
8b1111xxxx/等价8hfx8b1101zzzz/等价8hdz,2.2.3字符串字符串是用双引号括起来的可打印字符序列,它必须包含在同一行中。
例如,”ABC”,”ABOY.”,”A”,”1234”都是字符串。
2.2.4标识符标识符是用户编程时为常量、变量、模块、寄存器、端口、连线、示例和begin-end块等元素定义的名称。
标识符可以是字母、数字和下划线“_”等符号组成的任意序列。
定义标识符时应遵循如下规则:
首字符不能是数字。
字符数不能多于1024个。
大小写字母是不同的。
不要与关键字同名。
2.2.5关键字关键字是VerilogHDL预先定义的单词,它们在程序中有不同的使用目的。
所有关键字都用小写例如,module和endmodule来指出源程序模块的开始和结束;用assign来描述一个逻辑表达式等。
VerilogHDL的关键字有97个。
2.2.6操作符操作符也称为运算符,是VerilogHDL预定义的函数名字,这些函数对被操作的对象(即操作数)进行规定的运算,得到一个结果。
操作符通常由13个字符组成,例如,“+”表示加操作,“=”(两个=字符)表示逻辑等操作,“=”(3个=字符)表示全等操作。
有些操作符的操作数只有1个,称为单目操作;有些操作符的操作数有2个,称为双目操作;有些操作符的操作数有3个,称为三目操作。
1.算术操作符(Arithmeticoperators)常用的算术操作符:
+(加)、-(减)、*(乘)、/(除)、%(求余)。
其中%是求余操作符,在两个整数相除的基础上,取出其余数。
例如,5%6的值为5;13%5的值是3。
2.逻辑操作符(Logicaloperators)逻辑操作符包括:
&(逻辑与)、|(逻辑或)、!
(逻辑非),3.位运算(Bitwiseoperators)位运算是将两个操作数按对应位进行逻辑操作。
位运算操作符包括:
(按位取反)、&(按位与)、|(按位或)、(按位异或)、或(按位同或)。
在进行位运算时,当两个操作数的位宽不同时,计算机会自动将两个操作数按右端对齐,位数少的操作数会在高位用0补齐。
4.关系操作符(Pelationaloperators)关系操作符有:
(大于)、=(大于等于)。
其中,=也是赋值运算的赋值符号。
关系运算的结果是1位逻辑值。
在进行关系运算时,如果关系是真,则计算结果为1;如果关系是假,则计算结果为0;如果某个操作数的值不定,则计算结果不定(未知),表示结果是模糊的。
5.等式操作符(Equalityoperators)等值操作符包括:
=(等于)、!
=(不等于)、=(全等)、!
=(不全等)4种。
等值运算的结果也是1位逻辑值,当运算结果为真时,返回值1;为假则返回值0。
相等操作符(=)与全等操作符(=)的区别:
当进行相等运算时,两个操作数必须逐位相等,其比较结果的值才为1(真),如果某些位是不定或高阻状态,其相等比较的结果就会是不定值;而进行全等运算时,对不定或高阻状态位也进行比较,当两个操作数完全一致时,其结果的值才为1(真),否则结果为0(假)。
6.缩减操作符(Reductionoperators)缩减操作符包括:
&(与)、&(与非)、|(或)、|(或非)、(异或)、或(同或)。
缩减操作运算法则与逻辑运算操作相同,但操作的运算对象只有一个。
在进行缩减操作运算时,对操作数进行与、与非、或、或非、异或、同或等缩减操作运算,运算结果有1位1或0。
例如,设A=8b11010001,则&A=0(在与缩减运算中,只有A中的数字全为1时,结果才为1);|A=1(在或缩减运算中,只有A中的数字全为0时,结果才为0)。
7.转移操作符(Shiftoperators)转移操作符包括:
(右移)、n;/将操作数的内容右移n位,同时从左边开始用0来填补移出的位数。
操作数4的结果是A=8b00001101;而A4的结果是A=8b00010000。
8.条件操作符(Conditionaloperators)条件操作符为:
?
:
条件操作符的操作数有3个,其使用格式为操作数=条件?
表达式1:
表达式2;即当条件为真(条件结果值为1)时,操作数=表达式1;为假(条件结果值为0)时,操作数=表达式2。
源程序如下moduleexample_2_3(out,a,b,c);inputa,b,c;outputout;assignout=a?
b:
c;endmodule,【例2.3】用VerilogHDL语言描述下图所示的电路。
9.位并接操作符(Concatenationoperators)并接操作符为:
并接操作符的使用格式:
操作数1的某些位,操作数2的某些位,操作数n的某些位;作用:
即将操作数1的某些位与操作数2的某些位与与操作数n的某些位并接在一起。
例如,将1位全加器进位cont与和sum并接在一起使用,它们的结果由两个加数ina、inb及低位进位cin相加决定的表达式为cont,sum=ina+inb+cin;,2.2.7VerilogHDL数据对象VerilogHDL数据对象是指用来存放各种类型数据的容器,包括常量和变量。
1.常量常量是一个恒定不变的值数,一般在程序前部定义。
常量定义格式为parameter常量名1=表达式,常量名2=表达式,常量名n=表达式;parameter是常量定义关键字,常量名是用户定义的标识符,表达式是为常量赋的值。
例如parametervcc=5,fbus=8b11010001;,2.变量变量是在程序运行时其值可以改变的量。
在VerilogHDL中,变量分为网络型(netstype)和寄存器型(registertype)两种。
(1)网络型变量(netstype)nets型变量是输出值始终根据输入变化而更新的变量,它一般用来定义硬件电路中的各种物理连线。
VerilogHDL提供的nets型变量如下,
(2)寄存器型变量(registertype)register型变量是一种数值容器,不仅可以容纳当前值,也可以保持历史值,这一属性与触发器或寄存器的记忆功能有很好的对应关系。
register型变量与wire型变量的根本区别:
register型变量需要被明确地赋值,并且在被重新赋值前一直保持原值。
register型变量是在always、initial等过程语句中定义,并通过过程语句赋值。
常用的register型变量及说明,integer、real和time等3种寄存器型变量都是纯数学的抽象描述,不对应任何具体的硬件电路,但它们可以描述与模拟有关的计算。
例如,可以利用time型变量控制经过特定的时间后关闭显示等。
reg型变量是数字系统中存储设备的抽象,常用于具体的硬件描述,因此是最常用的寄存器型变量。
reg型变量定义的关键字是reg,定义格式如下reg位宽变量1,变量2,变量n;用reg定义的变量有一个范围选项(即位宽),默认的位宽是1。
位宽为1位的变量称为标量,位宽超过1位的变量称为向量。
标量的定义不需要加位宽选项,例如rega,b;/定义两个reg型变量a,b,向量定义时需要位宽选项,例如reg7:
0data;/定义1个8位寄存器型变量,最高有效位是7,最低有效位是0reg0:
7data;/定义1个8位寄存器型变量,最高有效位是0,最低有效位是7向量定义后可以采有多种使用形式(即赋值)data=8b00000000;data5:
3=3b111;data7=1;,(3)数组若干个相同宽度的向量构成数组。
在数字系统中,reg型数组变量即为memory(存储器)型变量。
存储器型可以用如下语句定义reg7:
0mymemory1023:
0;上述语句定义了一个1024个字存储器变量mymemory,每个字的字长为8位。
在表达式中可以用下面的语句来使用存储器:
mymemory7=75;/存储器mymemory的第7个字被赋值75,2.3VerilogHDL的语句,语句是构成VerilogHDL程序不可缺少的部分。
VerilogHDL的语句包括赋值语句、条件语句、循环语句、结构说明语句和编译预处理语句等类型,每一类语句又包括几种不同的语句。
在这些语句中,有些语句属于顺序执行语句,有些语句属于并行执行语句。
2.3.1赋值语句,1.门基元赋值语句格式:
基本逻辑门关键字(门输出,门输入1,门输入2,门输入n);基本逻辑门关键字是VerilogHDL预定义的逻辑门,包括and、or、not、xor、nand、nor等;圆括弧中内容是被描述门的输出和输入信号。
例如,具有a、b、c、d四个输入和y为输出与非门的门基元赋值语句为nand(y,a,b,c,d);该语句与y=(a&b&c&d)等效,2.连续赋值语句格式assign赋值变量=表达式;例如assigny=(a&b&c&d);在执行中,输出y的变化跟随输入a、b、c、d的变化而变化,反映了信息传送的连续性。
【例2.4】4输入端与非门的VerilogHDL源程序。
moduleexample_4_4(y,a,b,c,d);outputy;inputa,b,c,d;assign#1y=(aendmodule#1表示该门的输出与输入信号之间具有1个单位的时间延迟。
3.过程赋值语句过程赋值语句出现在initial和always块语句中,赋值符号是“=”,格式为赋值变量=表达式;在过程赋值语句中,赋值号“=”左边的赋值变量必须是reg(寄存器)型变量,其值在该语句结束即可得到。
如果一个块语句中包含若干条过程赋值语句,那么这些过程赋值语句是按照语句编写的顺序由上至下一条一条地执行,前面的语句没有完成,后面的语句就不能执行,就象被阻塞了一样。
因此,过程赋值语句也称为阻塞赋值语句。
4.非阻塞赋值语句非阻塞赋值语句也是出现在initial和always块语句中,赋值符号是“=”,格式为赋值变量=表达式;在非阻塞赋值语句中,赋值号“=”左边的赋值变量也必须是reg型变量,其值不象在过程赋值语句那样,语句结束时即刻得到,而在该块语句结束才可得到。
【例2.5】上升沿触发的D触发器的的源程序。
moduleD_FF(q,d,clock);inputd,clock;outputq;regq;always(posedgeclock)q=d;endmoduleq是触发器的输出,属于reg型变量;d和clock是输入,属于wire型变量(由隐含规则定义)。
2.3.2条件语句,条件语句包含if语句和case语句,它们都是顺序语句,应放在always块中。
1.if语句完整的VerilogHDL的if语句结构如下:
if(表达式)begin语句;endelseif(表达式)begin语句;endelsebegin语句;end,【例2.6】8线-3线优先编码器的设计,VerilogHDL源代码如下moduleexample_2_6(y,a);input7:
0a;output2:
0y;reg2:
0y;always(a)beginif(a7)y=3b111;elseif(a6)y=3b110;,elseif(a5)y=3b101;elseif(a4)y=3b100;elseif(a3)y=3b011;elseif(a2)y=3b010;elseif(a1)y=3b001;elsey=3b000;endendmodule,2.case语句case语句是一种多分支的条件语句,完整的case语句的格式为case(表达式)选择值1:
语句1;选择值2:
语句2;选择值n:
语句n;default:
语句n+1;endcase,【例2.7】用case语句描述4选1数据选择器。
moduleexample_4_7(z,a,b,c,d,s1,s2);inputs1,s2;inputa,b,c,d;outputz;regz;always(s1ors2oraorborcord)begin,case(s1,s2)2b00:
z=a;2b01:
z=b;2b10:
z=c;2b11:
z=d;default:
z=a;endcaseendendmodule,case语句还有两种变体语句形式,即casez和casex语句。
casez和casex语句与case语句的格式完全相同,它们的区别是:
在casez语句中,如果分支表达式某些位的值为高阻z,那么对这些位的比较就不予以考虑,只关注其他位的比较结果。
在casex语句中,把不予以考虑的位扩展到未知x,即不考虑值为高阻z和未知x的那些位,只关注其他位的比较结果。
2.3.3循环语句,循环语句包含for语句、repeat语句、while语句和forever语句4种。
1.for语句for语句的语法格式为for(循环指针=初值;循环指针终值;循环指针=循环指针+步长值)begin语句;end,【例2.8】8位奇偶校验器的描述。
moduleexample_2_8(a,out);input7:
0a;outputout;regout;integern;always(a)beginout=0;for(n=0;n8;n=n+1)out=outan;endendmodule,2.repeat语句语法格式repeat(循环次数表达式)语句;例:
用repeat语句实现8位奇偶校验器moduleexample_4_8_1(a,out);parametersize=8;input7:
0a;outputout;regout;integern;always(a),beginout=0;n=0;repeat(size)beginout=outan;n=n+1;endendendmodule,3、while语句语法格式:
while(循环执行条件表达式)begin重复执行语句;修改循环条件语句;end,while语句在执行时,首先判断循环执行条件表达式是否为真。
4、forever语句forever语句的语法格式:
foreverbegin语句;end,forever语句是一种无穷循环控制语句,常用来产生周期性的波形,作为仿真激励信号。
例:
应用forever产生时钟clk信号10forever#10clkclk;/生成一个周期为T=20个时间单位的时钟信号,VerilogHDL的任何过程模块都是放在结构声明语句中,结构声明语句包括always、initial、task和function等4种结构。
1.always块语句在一个VerilogHDL模块(module)中,always块语句的使用次数是不受限制的,块内的语句也是不断重复执行的。
2.3.4结构声明语句,always(敏感信号表达式)begin/过程赋值语句;/if语句,case语句;/for语句,while语句,repeat语句;/task语句、function语句;end,always块语句的语法结构为,例如:
always#5clk=clk;/产生时钟周期为10个时间单位的波形,强调:
alwaysclk=clk;/语句中没有时延控制,该语句将无限循环,在always块语句中,敏感信号表达式(event-expression)应该列出影响块内取值的所有信号(一般指设计电路的输入信号),多个信号之间用“or”连接。
当表达式中任何信号发生变化时,就会执行一遍块内的语句。
块内语句可以包括:
过程赋值、if、case、for、while、repeat、tast和function等语句。
敏感信号表达式中用“posedge”和“negedge”这两个关键字来声明事件是由时钟的上升沿或下降沿触发。
always(posedgeclk)表示事件由clk的上升沿触发;always(negedgeclk)表示事件由clk的下降沿触发。
2.initial语句initial语句的语法格式为initialbegin语句1;语句2;endinitial语句的使用次数也是不受限制的,但块内的语句仅执行一次,因此initial语句常用于仿真中的初始化。
3.task语句task语句用来定义任务。
任务类似高级语言中的子程序,用来单独完成某项具体任务,并可以被模块或其他任务调用。
利用任务可以把一个大的程序模块分解成为若干小的任务,使程序清晰易懂,而且便于调试。
可以被调用的任务必须事先用task语句定义,定义格式如下task任务名;端口声明语句;类型声明语句;begin语句;endendtask,例如,8位加法器任务的定义如下taskadder8;output7:
0sum;outputcout;input7:
0ina,inb;inputcin;assigncout,sum=ina+inb+cin;endtask,任务调用的格式如下任务名(端口名列表);例如,8位加法器任务调用adder8(tsum,tcout,tina,tinb,tcin);,4.function语句function语句用来定义函数。
函数定义格式如下function最高有效位:
最低有效位函数名;端口声明语句;类型声明语句;begin语句;endendfunction,【例2.9】求最大值的函数。
function7:
0max;input7:
0a,b;beginif(a=b)max=a;elsemax=b;endendfunction,函数调用的格式如下函数名(关联参数表);函数调用一般是出现在模块、任务或函数语句中。
通过函数的调用来完成某些数据的运算或转换。
例如,调用例2.9编制的求最大值的函数peak=max(data,peak);其中,data和peak是与函数定义的两个参数a、b关联的关联参数。
通过函数的调用,求出data和peak中的最大值,并用函数名max返回。
2.4不同抽象级别的VerilogHDL模型,VerilogHDL是一种用于逻辑电路设计的硬件描述语言。
用VerilogHDL描述的电路称为该设计电路的VerilogHDL模型。
VerilogHDL具有行为描述和结构描述功能。
行为描述是对设计电路的逻辑功能的描述,并不用关心设计电路使用那些元件以及这些元件之间的连接关系。
行为描述属于高层次的描述方法,在VerilogHDL中,行为描述包括系统级(SystemLevel)、算法级(AlgorithmLevel)和寄存器传输级(RTL:
RegisterTransfe
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Verilog HDL 基本 语法
![提示](https://static.bingdoc.com/images/bang_tan.gif)