《数字电子技术基础:第9章 Verilog HDL基本语法》由会员分享,可在线阅读,更多相关《数字电子技术基础:第9章 Verilog HDL基本语法(44页珍藏版)》请在金锄头文库上搜索。
1、Verilog基本语法入门基本语法入门第9章n硬件描述语言硬件描述语言HDL (Hardware Description Language)nVerilog HDL是在是在1983年,由年,由GDA (GateWay Design Automation)公司的)公司的Phil Moorby首创的。首创的。Moorby后来后来成为成为Verilog-XL的主要设计者和的主要设计者和Cadence公司的第一个合公司的第一个合伙人。伙人。n1989年,年,Cadence公司收购了公司收购了GDA公司,公司,Verilog HDL语语言成为言成为Cadence公司的私有财产。公司的私有财产。n1990
2、年,年,Cadence公司决定公开公司决定公开Verilog HDL语言,于是语言,于是成立了成立了OVI(Open Verilog International)组织来负责组织来负责Verilog HDL语言的发展。语言的发展。n基于基于Verilog HDL的优越性,的优越性,IEEE于于1995年制定了年制定了Verilog HDL的的IEEE标准,即标准,即Verilog HDL1364-1995。抽象级别抽象级别 n系统级系统级(system):用高级语言结构实现设计模块用高级语言结构实现设计模块的外部性能的模型。的外部性能的模型。n算法级算法级(algorithm):用高级语言结构实
3、现设计算用高级语言结构实现设计算法的模型。法的模型。nRTL级级(Register Transfer Level):描述数据在描述数据在寄存器之间流动和如何处理这些数据的模型。寄存器之间流动和如何处理这些数据的模型。n门级门级(gate-level):描述逻辑门以及逻辑门之间的描述逻辑门以及逻辑门之间的连接的模型。连接的模型。n开关级开关级(switch-level):描述器件中三极管和储存描述器件中三极管和储存节点以及它们之间连接的模型。节点以及它们之间连接的模型。 简单的简单的Verilog HDL程序程序1module adder ( count,sum,a,b,cin );input
4、2:0 a,b;input cin;output count;output 2:0 sum;assign count,sum = a + b + cin;endmodule n通过连续赋值语句描述一个名为通过连续赋值语句描述一个名为adder的三位加法器;可以根据两个三的三位加法器;可以根据两个三比特数比特数a、b和进位(和进位(cin)计算出和()计算出和(sum)和进位()和进位(count)。)。n整个整个Verilog HDL程序是嵌套在程序是嵌套在module和和 endmodule 声明语句里的。声明语句里的。 简单的简单的Verilog HDL程序程序2module compar
5、e ( equal,a,b );output equal; /声明输出信号声明输出信号equalinput 1:0 a,b; /声明输入信号声明输入信号a,bassign equal=(a=b)?)?1:0;/*如果如果a、b 两个输入信号相等两个输入信号相等,输出为输出为1。否则为。否则为0*/endmodule 简单的简单的Verilog HDL程序程序3module ts2(out,in,enable);output out;input in, enable;buf1 mybuf(out,in,enable);endmodule n这个程序描述了一个名为这个程序描述了一个名为ts2的三态
6、驱动器。的三态驱动器。n程序通过调用一个在程序通过调用一个在Verilog语言库中现存的三态语言库中现存的三态驱动器实例元件驱动器实例元件buf1来实现其功能。来实现其功能。简单的简单的Verilog HDL程序程序4module ts1(out,in,enable);output out;input in, enable; mytri tri_1(out,in,enable); /调用由调用由mytri模块定义的实例元件模块定义的实例元件tri_1endmodulemodule mytri(out,in,enable);output out;input in, enable; assign
7、out = enable? in : bz;endmodule 简单的简单的Verilog HDL程序程序4n这个程序例子通过另一种方法描述了一个三态门。这个程序例子通过另一种方法描述了一个三态门。n在这个例子中存在着两个模块。模块在这个例子中存在着两个模块。模块ts1调用由模调用由模块块mytri定义的实例元件定义的实例元件tri_1。模块。模块ts1是顶层模是顶层模块。模块块。模块mytri则被称为子模块。则被称为子模块。 简简单单的的Verilog HDL程程序序5/include D:verilogadderadder.vmodule adder16(co,s,a,b,ci);outp
8、ut co;output15:0 s;input15:0 a,b;input ci;adder my_adder(co,sum,a,b,ci);endmodulemodule adder(cout,sum,a,b,cin);parameter size=16;output cout;outputsize-1:0 sum;input cin;inputsize-1:0 a,b;assign cout,sum = a+b+cin;endmodule归纳归纳Verilog HDL的特点的特点nVerilog HDL程序是由程序是由模块模块构成的。每个模块的内容都是嵌构成的。每个模块的内容都是嵌在在m
9、odule和和endmodule两个语句之间。每个模块实现特两个语句之间。每个模块实现特定的功能。定的功能。n可以将大型的数字电路设计分割成不同的小模块,最后通可以将大型的数字电路设计分割成不同的小模块,最后通过顶层模块过顶层模块调用调用子模块来实现整体功能。子模块来实现整体功能。n每个模块要进行端口定义,并说明输入输出口,然后对模每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行逻辑描述。块的功能进行逻辑描述。nVerilog HDL程序的书写格式自由程序的书写格式自由,一行可以写几个语句一行可以写几个语句,一一个语句也可以分写多行。个语句也可以分写多行。n除了除了endmodu
10、le语句外,每个语句和数据定义的最后必须语句外,每个语句和数据定义的最后必须有分号。有分号。归纳归纳Verilog HDL的特点的特点n可以用可以用/*.*/和和/.对对Verilog HDL程序的程序的任何部分作注释。任何部分作注释。n一个好的、有使用价值的源程序,都应当一个好的、有使用价值的源程序,都应当加上必要的注释,以增强程序的可读性和加上必要的注释,以增强程序的可读性和可维护性。可维护性。模块的结构模块的结构nVerilog结构完全嵌在结构完全嵌在module和和endmodule声明语句之间,每个声明语句之间,每个Verilog程程序包括四个主要部分:序包括四个主要部分:n端口定义
11、、端口定义、I/O说明、内部信号声明、功能说明、内部信号声明、功能定义。定义。模块的端口定义模块的端口定义 n模块的端口声明了模块的输入、输出口。模块的端口声明了模块的输入、输出口。其格式如下:其格式如下:module 模块名模块名(口口1,口,口2,口,口3,口,口4, ); n一个模块是由两部分组成一个模块是由两部分组成一部分描述接口一部分描述接口另一部分描述逻辑功能,即定义输入是如何影另一部分描述逻辑功能,即定义输入是如何影响输出的响输出的模块内容模块内容 n模块的内容包括模块的内容包括I/O说明、内部信号声明、功能定说明、内部信号声明、功能定义。义。 nI/O说明的格式如下:说明的格式
12、如下:input 端口名端口名1,端口名,端口名2,, 端口名端口名i; /(共有共有i个输入口个输入口)output 端口名端口名1,端口名,端口名2,,端口名端口名j; /(共有共有j个输出口个输出口) nI/O说明也可以写在端口声明语句里。其格式如下:说明也可以写在端口声明语句里。其格式如下:module module_name ( input port1, input port2, output port1, output port2 ); 内部信号说明内部信号说明n在模块内用到的和与端口有关的在模块内用到的和与端口有关的wire 和和 reg 变量的声明。如:变量的声明。如:wire
13、 7 : 0 bus;reg 15 : 0 addr, cout; 功能定义功能定义 n模块中最重要的部分是逻辑功能定义部分。有三种方法可在模块中产生逻辑。nassign 声明语句声明语句n实例元件实例元件n“always (a or b or c) ”块块用“assign”声明语句 assign a = b & c;n这种方法的句法很简单,只需写一个这种方法的句法很简单,只需写一个“assign”,后面再加一个方程式即可。,后面再加一个方程式即可。n此例中的方程式描述了一个有两个输入的此例中的方程式描述了一个有两个输入的与门与门。 用实例元件用实例元件and and_1( q, a, b )
14、;n采用实例元件的方法象在电路图输入方式采用实例元件的方法象在电路图输入方式下,调入库元件一样。下,调入库元件一样。n键入元件的名字和引脚即可,表示在设计键入元件的名字和引脚即可,表示在设计中用到一个跟中用到一个跟与门(与门(and)一样的名为)一样的名为and_1的与门,其输入端为的与门,其输入端为a, b,输出为,输出为q。n每个实例元件的名字必须是唯一的,以避每个实例元件的名字必须是唯一的,以避免与其他调用免与其他调用与门(与门(and)的实例混淆。的实例混淆。 用“always”块 always (posedge clk or posedge clr)beginif(clr) q =
15、0;else if(en) q = d;end n用用“always”块生成了一个带有异步清除块生成了一个带有异步清除端的端的D触发器。触发器。n“always”块既可用于描述组合逻辑也可块既可用于描述组合逻辑也可描述时序逻辑。描述时序逻辑。 always语句语句nalways 的时间控制可以是沿触发也可以是电平触的时间控制可以是沿触发也可以是电平触发的,可以单个信号也可以多个信号,中间需要发的,可以单个信号也可以多个信号,中间需要用关键字用关键字 oror 连接,如:连接,如: always (posedge clock or posedge reset) /由两个沿触发的由两个沿触发的al
16、ways块块 begin end always ( a or b or c ) /由多个电平触发的always块 begin end数据类型及其常量、变量数据类型及其常量、变量 nVerilog HDL中总共有十九种数据类型,数据类型是用来表示数字电路硬件中的数据储存和传送元素的。 n四个最基本的数据类型,它们是:reg型、wire型、integer型、parameter型 large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior型、trireg型、vectored型、wand型、wor型。数字数字整数整数n在在V
17、erilog HDL中中,整型常量即整常数有以下整型常量即整常数有以下四种进制表示形式四种进制表示形式:二进制整数二进制整数(b或或B)十进制整数十进制整数(d或或D)十六进制整数十六进制整数(h或或H)八进制整数八进制整数(o或或O) n数字表达方式有以下三种数字表达方式有以下三种:这是一种全面的描述方式。这是一种全面的描述方式。在这种描述方式中在这种描述方式中,数字的位宽采用缺数字的位宽采用缺省位宽省位宽(这由具体的机器系统决定这由具体的机器系统决定,但至少但至少32位位)。在这种描述方式中在这种描述方式中,采用缺省进制十进制。采用缺省进制十进制。 数字数字整数整数n在表达式中在表达式中,
18、位宽位宽指明了数字的精确位数。指明了数字的精确位数。一个一个4位二进制数的数字的位二进制数的数字的位宽位宽为为4一个一个4位十六进制数的数字的位十六进制数的数字的位宽位宽为为16(因为每单个十因为每单个十六进制数就要用六进制数就要用4位二进制数来表示位二进制数来表示)。8b10101100 /位宽为位宽为8的数的二进制表示的数的二进制表示, b表示二进制表示二进制8ha2 /位宽为位宽为8的数的十六进制,的数的十六进制,h表示十六进制。表示十六进制。 数字数字 x和和z值值 n在数字电路中在数字电路中,x代表不定值代表不定值,z代表高阻值。代表高阻值。n一个一个x可以用来定义十六进制数的四位二
19、进可以用来定义十六进制数的四位二进制数的状态制数的状态,八进制数的三位八进制数的三位,二进制数的一二进制数的一位。位。nz的表示方式同的表示方式同x类似。类似。nz还有一种表达方式是可以写作还有一种表达方式是可以写作?。在使用。在使用case表达式时建议使用这种写法表达式时建议使用这种写法,以提高程以提高程序的可读性。序的可读性。 数字数字 x和和z值值n4b10x0 /位宽为位宽为4的二进制数,从低位数起第的二进制数,从低位数起第二位为不定值二位为不定值n4b101z /位宽为位宽为4的二进制数,从低位数起第的二进制数,从低位数起第一位为高阻值一位为高阻值n12dz /位宽为位宽为12的十进
20、制数,其值为高阻值的十进制数,其值为高阻值(第一种表达方式第一种表达方式)n12d? /位宽为位宽为12的十进制数,其值为高阻值的十进制数,其值为高阻值(第二种表达方式第二种表达方式)n8h4x /位宽为位宽为8的十六进制数,其低四位值的十六进制数,其低四位值为不定值为不定值数字数字负数负数 n一个数字可以被定义为负数一个数字可以被定义为负数,只需在位宽表只需在位宽表达式前加一个减号达式前加一个减号,减号必须写在数字定义减号必须写在数字定义表达式的最前面。表达式的最前面。n-8d5/这个表达式代表这个表达式代表5的补数(用八位的补数(用八位二进制数表示二进制数表示)n8d-5/非法格式非法格式
21、 数字数字下划线下划线(underscore_) n下划线可以用来分隔开数的表达以提高程下划线可以用来分隔开数的表达以提高程序可读性。序可读性。n但不可以用在位宽和进制处但不可以用在位宽和进制处,只能用在具体只能用在具体的数字之间。的数字之间。 n16b1010_1011_1111_1010 /合法格式合法格式n8b_0011_1010 /非法格式非法格式 数字数字下划线下划线(underscore_)n当常量不说明位数时,默认值是当常量不说明位数时,默认值是32位,每位,每个字母用个字母用8位的位的ASCII值表示。值表示。n1032d1032b1010n1=32d1=32b1n-1=-32
22、d1=32hFFFFFFFFnBX=32BX=32BXXXXXXXXn“AB”=16B01000001_01000010参数参数(Parameter)型型n在在Verilog中用中用parameter来定义常量来定义常量,即用即用parameter来定义一个标识符代表一个常量来定义一个标识符代表一个常量,称为符称为符号常量,即标识符形式的常量,采用标识符代表一号常量,即标识符形式的常量,采用标识符代表一个常量可提高程序的可读性和可维护性。个常量可提高程序的可读性和可维护性。nparameter型数据是一种常数型的数据,其格式:型数据是一种常数型的数据,其格式:parameter参数名参数名1表
23、达式,参数名表达式,参数名2表达式表达式, , 参数名参数名n表达式表达式; nparameter是参数型数据的确认符,确认符后跟着是参数型数据的确认符,确认符后跟着一个用逗号分隔开的赋值语句表。在每一个赋值语一个用逗号分隔开的赋值语句表。在每一个赋值语句的右边必须是一个常数表达式。句的右边必须是一个常数表达式。 参数参数(Parameter)型型n表达式只能包含数字或先前已定义过的参数。表达式只能包含数字或先前已定义过的参数。parameter msb=7; /定义参数定义参数msb为常量为常量7parameter e=25, f=29; /定义二个常数参数定义二个常数参数parameter
24、 r=5.7; /声明声明r为一个实型参数为一个实型参数parameter byte_size=8, byte_msb=byte_size-1; /用常数表达式赋值用常数表达式赋值parameter average_delay = (r+f)/2; /用常数表达式赋值用常数表达式赋值 n参数型常数经常用于定义延迟时间和变量宽度。参数型常数经常用于定义延迟时间和变量宽度。 条件语句条件语句 if_else语句语句 (1) if(表达式表达式)语句语句 (2) if(表达式表达式) 语句语句1 else 语句语句2(3) if(表达式表达式1) 语句语句1; else if(表达式表达式2) 语句
25、语句2; else if(表达式表达式3) 语句语句3; . else if(表达式表达式m) 语句语句m; else 语句语句n; case语句语句 ncase语句是一种多分支选择语句,语句是一种多分支选择语句,if语句只有两语句只有两个分支可供选择,而实际问题中常常需要用到多个分支可供选择,而实际问题中常常需要用到多分支选择,分支选择,case语句直接处理多分支选择。语句直接处理多分支选择。ncase语句通常用于微处理器的指令译码语句通常用于微处理器的指令译码,它的一般它的一般形式如下形式如下:case(表达式表达式)endcasecasez(表达式表达式)endcasecasex(表达式
26、表达式)endcasenreg 15:0 rega;nreg 9:0 result;ncase(rega)n16 d0: result = 10 b0111111111;n16 d1: result = 10 b1011111111;n16 d2: result = 10 b1101111111;n16 d3: result = 10 b1110111111;n16 d4: result = 10 b1111011111;n16 d5: result = 10 b1111101111;n16 d6: result = 10 b1111110111;n16 d7: result = 10 b11
27、11111011;n16 d8: result = 10 b1111111101;n16 d9: result = 10 b1111111110;ndefault: result = bx;nendcase用case描述的译码器用case实现4选1数据选择器module mux4_1_1(out,in1,in2,in3,in4,sel);output out;Input in1,in2,in3,in4;Input1:0 sel;reg out;always(in1 or in2 or in3 or in4 or sel )case( sel )2b00:out=in1;2b01:out=in2
28、;2b10:out=in3;2b11:out=in4;default: out=1bx;endcaseendmodule循环语句循环语句 n在在Verilog HDL中存在着四种类型的循环语句,用来控制中存在着四种类型的循环语句,用来控制执行语句的执行次数。执行语句的执行次数。nforever 连续的执行语句。连续的执行语句。nrepeat 连续执行一条语句连续执行一条语句 n 次。次。nwhile 执行一条语句直到某个条件不满足。如果一开执行一条语句直到某个条件不满足。如果一开始条件即不满足始条件即不满足(为假为假), 则语句一次也不能被执行。则语句一次也不能被执行。nfor 通过以下三个步
29、骤来决定语句的循环执行。通过以下三个步骤来决定语句的循环执行。先给控制循环次数的变量赋初值。先给控制循环次数的变量赋初值。判定控制循环的表达式的值,如为假则跳出循环语句,如为真则判定控制循环的表达式的值,如为假则跳出循环语句,如为真则执行指定的语句后,转到第三步。执行指定的语句后,转到第三步。执行一条赋值语句来修正控制循环变量次数的变量的值,然后返执行一条赋值语句来修正控制循环变量次数的变量的值,然后返回第二步。回第二步。 for语句语句 nfor语句的一般形式为:语句的一般形式为:for(表达式(表达式1;表达式;表达式2;表达式;表达式3) 语句语句执行过程如下:执行过程如下:1.先求解表
30、达式先求解表达式1;2.求解表求解表达式达式2, 若其值为若其值为真真(非非0),则执行,则执行for语句中语句中指定的内嵌指定的内嵌语句语句,然后执行下面的第,然后执行下面的第3步。若为步。若为假假(0),则结束循环,转到第,则结束循环,转到第5步。步。3.若表达式若表达式2为真,在执行指定语句后,求解为真,在执行指定语句后,求解表达式表达式34.转回上面的第转回上面的第2步骤继续执行。步骤继续执行。5.执行执行for语句下面的语句。语句下面的语句。n nforfor语句最简单的应用形式如下:语句最简单的应用形式如下:语句最简单的应用形式如下:语句最简单的应用形式如下:for(循环变量赋初值
31、;循环结束条件;循环变量增值循环变量赋初值;循环结束条件;循环变量增值)执行语句执行语句begin:init_memreg7:0 tempi;for(tempi=0; tempimemsize; tempi=tempi+1)memorytempi=0;end 用用for语句来初始化语句来初始化memory 7人人表表决决器器module voter7(pass, vote);output pass;input6:0 vote;reg2:0 sum;integer i;reg pass;always (vote)beginsum=0;for(i=0;i=6;i=i+1)if(votei) sum
32、=sum+1;if(sum2) pass=1;else pass=0;endendmodule用用for循环语句来实现乘法器循环语句来实现乘法器 parameter size = 8, longsize = 16;regsize:1 opa, opb;reglongsize:1 result;begin: multinteger bindex;result=0;for( bindex=1; bindex=size; index=bindex+1 )if(opbbindex) result = result + (opa(bindex-1);end module mux4_1 (out,in1,
33、in2,in3,in4,sel);output out;Input in1,in2,in3,in4;Input1:0 sel;reg out;always (in1 or in2 or in3 or in4 or sel ) beginif ( sel = = 2b00) out=in1;else if ( sel = = 2b01) out=in2;else if ( sel = = 2b10) out=in3;else if ( sel = = 2b11) out=in4; else out=1bx;endendmodule用用if-else实实现现4选选1数数据据选选择择器器module
34、 add_full (A,B,C,Carry,S);output Carry, S;input A, B, C;assign S = ABC;assign Carry = (A&B)|(B&C)|(A&C);endmodulemodule add_full4 (A, B, C, S);input3:0 A, B;output3:0 S;output4:0 C;assign C= 0;add_full u1(A0,B0,C0,C1,S0), u2(A1,B1,C1,C2,S1), u3(A2,B2,C2,C3,S2), u4(A3,B3,C3,C4,S3);endmodule全全加加器器实实例例调调用用module count15(out,cout,reset,clk);output3:0out;reg3:0 out;output cout;input clk,reset;always ( posedge clk )beginif ( reset ) out=0;elsebeginif(out=0) out=4b1110;elseout=out-1;endendassign cout=(out=4d14)?1:0;endmodule模模15减减法法计计数数器器