《数字电子技术基础PPT第9章VerilogHDL语言.ppt》由会员分享,可在线阅读,更多相关《数字电子技术基础PPT第9章VerilogHDL语言.ppt(54页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第9章章VerilogHDL语言语言VerilogHDL是使用广泛的硬件描述语言,该语言的特点是是使用广泛的硬件描述语言,该语言的特点是语言能力强,代码简单,有大量支持仿真的语句与可综合语句。语言能力强,代码简单,有大量支持仿真的语句与可综合语句。本章介绍该语言中的可综合语句描述数字电路与系统,重点介绍本章介绍该语言中的可综合语句描述数字电路与系统,重点介绍该语言的基本语法、组合电路与时序电路的描述与实际描述举例。该语言的基本语法、组合电路与时序电路的描述与实际描述举例。9.1VerilogHDL语言基础语言基础VerilogHDL语言以模块(语言以模块(module)的形式来描述数字电路,
2、模块接口部分用来描)的形式来描述数字电路,模块接口部分用来描述与其他模块之间的连接,一般一个文件就是一个模块。模块的定义从关键词述与其他模块之间的连接,一般一个文件就是一个模块。模块的定义从关键词module开始,到关键词开始,到关键词endmodule结束,每条结束,每条VerilogHDL语句以分号语句以分号“;”作作为结束(块语句、为结束(块语句、endmodule等少数语句除外)。注释语句单行以等少数语句除外)。注释语句单行以“/”开头,多开头,多行以行以“/*”开始、以开始、以“*/”结束。该语言很多规定与结束。该语言很多规定与C语言相似。语言相似。【例【例9-1】VerilogHD
3、L描述与非门。描述与非门。moduleNAND(in1,in2,out);/以以module开头,随后是模块名和括号内的端口名列表,最后以开头,随后是模块名和括号内的端口名列表,最后以分分/号结束号结束inputin1,in2;/定义端口类型,只有输入定义端口类型,只有输入(input)、输出、输出(output)和双向和双向(inout)三种三种outputout;/凡是在端口列表的端口,都必须经过定义凡是在端口列表的端口,都必须经过定义/wirein1,in2,out;/由于由于in1、in2和和out是是1位宽连线类型,所以可以采用默认定义,位宽连线类型,所以可以采用默认定义,此此/语句
4、可省略语句可省略assignout=(in1&in2);/连续赋值语句连续赋值语句assign描述组合电路描述组合电路/在在Verilog中,还有中,还有initial叙述、叙述、always叙述、模块调用、门调用等叙述、模块调用、门调用等endmodule/关键字关键字endmodule用于结束行,注意其后没有分号用于结束行,注意其后没有分号9.1.1VerilogHDL中的基本约定中的基本约定1可用在描述语句中的逻辑状态可用在描述语句中的逻辑状态0表示逻辑表示逻辑0、逻辑非、低电平、假;、逻辑非、低电平、假;1表示逻辑表示逻辑1、逻辑真、高电平、真。、逻辑真、高电平、真。x或或X表示不确定
5、的逻辑状态;表示不确定的逻辑状态;z或或Z表示高阻态。表示高阻态。2整数及其表示整数及其表示整数可以按照简单十进制数格式或基数格式书写。整数可以按照简单十进制数格式或基数格式书写。(1)简单十进制数格式)简单十进制数格式简单十进制数的整数表示与普通十进制数表示相同,例如,简单十进制数的整数表示与普通十进制数表示相同,例如,35、-46。(2)基数格式)基数格式表示格式:表示格式:+/-其中:其中:+/-是符号位;位宽就是数的等效二进制数的位数(是符号位;位宽就是数的等效二进制数的位数(bit),位宽用十进制数表),位宽用十进制数表示;二进制的基数符号位示;二进制的基数符号位b或或B;八进制的基
6、数符号是;八进制的基数符号是o或或O;十进制的基数符号是;十进制的基数符号是d或或D,可默认不写基数符号;十六进制的基数符号是,可默认不写基数符号;十六进制的基数符号是h或或H。一些规定:一些规定:数值中,左边是数值最高位(数值中,左边是数值最高位(MSB),右边是最低有效位(),右边是最低有效位(LSB););在二进制中,在二进制中,x、z只代表相应位的逻辑状态,只代表相应位的逻辑状态,x表示不定,表示不定,z表示高阻;表示高阻;当位宽默认时,位宽为当位宽默认时,位宽为32位。位。例如:例如:3b000是位宽为是位宽为3的二进制数;的二进制数;res=8b11111110是是8位二进制数;位
7、二进制数;9o671是位宽为是位宽为9的八进制数;的八进制数;8h3f是位宽为是位宽为8的十六进制数。的十六进制数。3标志符取名标志符取名标志符取名的规定:标志符必须是字母或下画线开头,长度小于标志符取名的规定:标志符必须是字母或下画线开头,长度小于1024;后续部分可以;后续部分可以是字母、数字或下画线;是字母、数字或下画线;VerilogHDL中的标志符区分大小写。中的标志符区分大小写。例如,例如,_bus,topp,BUS。4系统命令系统命令以以$开头的标志符代表开头的标志符代表VerilogHDL中的命令(系统任务与系统函数),普通的标志符中的命令(系统任务与系统函数),普通的标志符不
8、能以不能以$开头。开头。5保留字保留字VerilogHDL语言内部已经使用的保留字,在语言内部已经使用的保留字,在VerilogHDL语言编辑器中,保留字以语言编辑器中,保留字以醒目的颜色表示。醒目的颜色表示。9.1.2数据类型数据类型VerilogHDL中的中的4种最基本数据类型是:整型(种最基本数据类型是:整型(integer)、参数)、参数(parameter)型、寄存器()型、寄存器(reg)类型和连线()类型和连线(wire)类型。)类型。1连线类型连线类型常用的连线类型关键字为常用的连线类型关键字为wire。连线类型的逻辑状态为连线类型的逻辑状态为0、1、x(任意)、(任意)、z(
9、高阻),连线类型主要用在模块的结(高阻),连线类型主要用在模块的结构描述中,对应硬件的物理信号连线,当用数字表示其逻辑值时,不存在符号位。构描述中,对应硬件的物理信号连线,当用数字表示其逻辑值时,不存在符号位。在用连线类型的信号时,必须用连线类型定义语句对信号进行类型说明,当说明被在用连线类型的信号时,必须用连线类型定义语句对信号进行类型说明,当说明被省略时,表示位宽为省略时,表示位宽为1bit的的wire型连线信号。型连线信号。wire是基本的、不附带其他功能的连是基本的、不附带其他功能的连线,也是最常用的连线类型。线,也是最常用的连线类型。对于对于input,output和和inout端口
10、,若未指明数据类型,默认为连线类型。端口,若未指明数据类型,默认为连线类型。连线类型定义格式:连线类型定义格式:矢量范围矢量范围,连线名连线名;矢量范围以矢量范围以MSB:LSB格式描述。格式描述。例如:例如:wire0:31w1,w2;/w1和和w2是是32位连线类型,高位位连线类型,高位MSB为为bit0wir5e7:0tmp;/tmp为为8位连线,高位位连线,高位MSB为为bit7,低位,低位LSB是位是位02寄存器类型寄存器类型常用的寄存器类型的关键字为常用的寄存器类型的关键字为reg。寄存器类型的信号,必须通过过程赋值语句进行赋值,只能出现在寄存器类型的信号,必须通过过程赋值语句进行
11、赋值,只能出现在always后后面的过程语句中。面的过程语句中。寄存器变量的定义格式:寄存器变量的定义格式:矢量范围矢量范围,寄存器名,寄存器名;矢量范围以矢量范围以MSB:LSB格式描述。格式描述。例如:例如:rega;/a为寄存器类型为寄存器类型reg3:0v;/v为为4位寄存器类型位寄存器类型reg7:0m,n;/m和和n为为8位寄存器类型位寄存器类型在在VerilogHDL中,线宽为一位的连线和只有一位的寄存器变量称为标量;线宽中,线宽为一位的连线和只有一位的寄存器变量称为标量;线宽大于一位的连线和位宽大于一位的寄存器变量为矢量。大于一位的连线和位宽大于一位的寄存器变量为矢量。按位或部
12、分位赋值的矢量称为标量类矢量,相当于多个一位标量的集合,标量类按位或部分位赋值的矢量称为标量类矢量,相当于多个一位标量的集合,标量类矢量进行类型说明时,需要关键字矢量进行类型说明时,需要关键字scalared(可以默认)。(可以默认)。例如,例如,regscalared7:0reg_a;/reg_a被定义成标量类矢量被定义成标量类矢量该说明可以默认关键字该说明可以默认关键字scalared,因此可以写成:,因此可以写成:reg7:0reg_a;3端口信号与内部信号端口信号与内部信号信号可以分为端口信号和内部信号。出现在端口列表中的信号是端口信号,其信号可以分为端口信号和内部信号。出现在端口列表
13、中的信号是端口信号,其他的信号为内部信号。对于端口信号,输入端口只能是连线类型。输出端口可以是他的信号为内部信号。对于端口信号,输入端口只能是连线类型。输出端口可以是连线(连线(wire)类型,也可以是寄存器()类型,也可以是寄存器(register)类型。若输出端口在过程块中赋)类型。若输出端口在过程块中赋值则为值则为register类型;若在过程块外赋值,则为类型;若在过程块外赋值,则为wire类型。类型。内部信号类型与输出端口相同,可以是连线(内部信号类型与输出端口相同,可以是连线(wire)类型或寄存器)类型或寄存器(register)类型。若在过程块()类型。若在过程块(always
14、叙述)中赋值,则为叙述)中赋值,则为register类型;若在类型;若在过程块外赋值,则为过程块外赋值,则为wire类型。类型。端口类型只有输入(端口类型只有输入(input)、输出()、输出(output)和双向()和双向(inout)三种,凡是在)三种,凡是在端口列表中的端口,都必须定义端口类型。例如,端口列表中的端口,都必须定义端口类型。例如,“output6:0ag;”定义端口定义端口ag为输出端口,为输出端口,“input3:0hex;”定义端口定义端口hex为输入端口。为输入端口。4其他定义语句其他定义语句(1)参数定义语句)参数定义语句参数定义语句经常用于对时延、线宽、寄存器位数
15、等物理量的定义,其方法是用参数定义语句经常用于对时延、线宽、寄存器位数等物理量的定义,其方法是用一个文字参数来代替一个数字量,从而增加描述语句的可修改性。一个文字参数来代替一个数字量,从而增加描述语句的可修改性。参数定义的格式:参数定义的格式:parameter其中参数定义部分给出具体的各个参数与数字之间的关系,各个关系之间用逗号其中参数定义部分给出具体的各个参数与数字之间的关系,各个关系之间用逗号隔开。隔开。例如:例如:modulemodule_name();parametermsb=7,lsb=0;/定义参数定义参数regmsb:lsbreg_a;/使用参数使用参数.endmodule9.
16、1.3运算符运算符1算术运算符算术运算符算术运算符包括加法、减法与乘法,例如算术运算符包括加法、减法与乘法,例如a+b,a-b,a*b。有些综合工具不支持乘。有些综合工具不支持乘法。法。2位运算符位运算符按位运算的运算符是位运算符,原来的操作数有几位,结果就有几位。若两个操作按位运算的运算符是位运算符,原来的操作数有几位,结果就有几位。若两个操作数位数不同,则短的操作数左端会自动补数位数不同,则短的操作数左端会自动补0处理。位运算符为:按位取反处理。位运算符为:按位取反、按位与、按位与&、按位或、按位或|、按位异或、按位异或、按位同或、按位同或或或。例如,例如,a=b0110,b=b0100则
17、则a|b=0110,a&b=0100。3缩位(归约)运算符缩位(归约)运算符缩位运算符是单目运算符,也是按位进行逻辑运算,但结果是一位逻辑值。例如,缩位运算符是单目运算符,也是按位进行逻辑运算,但结果是一位逻辑值。例如,对对a3,a2,a1,a0进行缩位运算时,先对进行缩位运算时,先对a3和和a2进行缩位运算符指定的运进行缩位运算符指定的运算,产生一位结果,再将这个结果与算,产生一位结果,再将这个结果与a1进行缩位运算,然后再将产生的结果与进行缩位运算,然后再将产生的结果与a0缩位运算,产生最后的结果。缩位运算,产生最后的结果。缩位运算符包括:与缩位缩位运算符包括:与缩位&、或缩位、或缩位|、
18、异或缩位、异或缩位,以及与、或、异或缩位运算符和,以及与、或、异或缩位运算符和非操作运算符组成的复合运算符非操作运算符组成的复合运算符&、|、。例如,例如,a=b0110,b=b0100则则|b=1,&b=0,|a=0。4逻辑运算符逻辑运算符逻辑运算符包括:逻辑与逻辑运算符包括:逻辑与&、逻辑或、逻辑或|、逻辑非运算符!。、逻辑非运算符!。逻辑与和逻辑或为双目运算符,逻辑非为单目运算符。逻辑与和逻辑或为双目运算符,逻辑非为单目运算符。如果操作数是一位的,则如果操作数是一位的,则1代表真值,代表真值,0代表逻辑假。如果操作数是多位的,则将代表逻辑假。如果操作数是多位的,则将操作数看做整体。如果操
19、作数中每一位都是操作数看做整体。如果操作数中每一位都是0,则具有逻辑,则具有逻辑0值。若其中有一位为值。若其中有一位为1,就把这个操作数看做逻辑,就把这个操作数看做逻辑1值。因此可以把逻辑运算符看做是字逻辑运算符。值。因此可以把逻辑运算符看做是字逻辑运算符。5关系运算符关系运算符关系运算符包含:小于关系运算符包含:小于、小于等于、小于等于=。关系运算符都是双目运算符,用于比较两个操作数的大小,比较结果是关系运算符都是双目运算符,用于比较两个操作数的大小,比较结果是1位逻辑值,位逻辑值,值值1代表关系成立,值代表关系成立,值0代表比较关系不成立。代表比较关系不成立。6相等与全等运算符相等与全等运
20、算符相等与全等运算符包括:相等相等与全等运算符包括:相等=、不等!、不等!=、全等、全等=、不全等!、不全等!=。这四个运算符都是双目运算符,结果是一位的逻辑值。这四个运算符都是双目运算符,结果是一位的逻辑值。7逻辑移位运算符逻辑移位运算符逻辑移位运算符包括:逻辑左移逻辑移位运算符包括:逻辑左移。若设若设a是操作对象,是操作对象,n是移位位数,则是移位位数,则an表示将表示将a左移左移n位。进行移位操作时,用位。进行移位操作时,用0填补移出的空位。填补移出的空位。8连接运算符连接运算符该运算符可以将两组信号用大括号括起来,拼接成一个新的信号。例如,该运算符可以将两组信号用大括号括起来,拼接成一
21、个新的信号。例如,a,b,c,b101,若,若a、b、c都是一位信号,则该连接运算的结果是都是一位信号,则该连接运算的结果是6位宽信号。位宽信号。对于一些重复信号,连接运算符有简化表示方法对于一些重复信号,连接运算符有简化表示方法na,这里,这里n是重复数。是重复数。例如:例如:4w表示表示w,w,w,w。【例【例9-3】使用使用VerilogHDL连接运算符描述全加器。连接运算符描述全加器。moduleaddr(sum,co,ci,ina,inb);output3:0sum;/4位宽的和位宽的和input3:0ina,inb;/4位宽的加数与被加数位宽的加数与被加数outputco;/1位宽
22、的进位输出位宽的进位输出inputci;/1位宽的进位输入位宽的进位输入assignco,sum=ina+inb+ci;/连接运算连接运算Endmodule/*将将co和和sum拼接成一个新信号为拼接成一个新信号为co,sum3,sum2,sum1,sum0*/9条件运算符条件运算符条件运算符是三目运算符,它的格式是条件运算符是三目运算符,它的格式是条件表达式?条件为真时的表达式:条件为假时的表达式条件表达式?条件为真时的表达式:条件为假时的表达式例如,例如,assigntri_bus=(drv_enable)?data:16bz;【例【例9-4】VerilogHDL描述三态门。描述三态门。m
23、odulelikebufif(in,en,out);inputin;inputen;outputout;assignout=(en=1)?in:bz;/如果如果en=1,则输出,则输出out=in,否则输出,否则输出out=zendmodule9.2VerilogHDL语言中的描述语言中的描述1VerilogHDL数据流描述数据流描述VerilogHDL语言的数据流描述可以很好地描述组合电路。语言的数据流描述可以很好地描述组合电路。(1)连续赋值语句)连续赋值语句连续赋值语句将值赋给连线信号,格式为:连续赋值语句将值赋给连线信号,格式为:assign=例如:例如:wire3:0z,pre,cl
24、r;assignz=pre&clr;/将将pre&clr的值赋给的值赋给zassignco,sum=a+b+ci;assignmux=(s=0)?a:bz;(2)在定义连线类型时赋值)在定义连线类型时赋值连续赋值可作为连线说明的一部分,成为连线说明赋值。连续赋值可作为连线说明的一部分,成为连线说明赋值。wire3:0sum=4b0;/将将4b0赋给赋给sumwireclear=b1;/将将b1赋给赋给clear【例【例9-5】描述一个数值比较器。描述一个数值比较器。在在VerilogHDL中,描述组合逻辑时常使用中,描述组合逻辑时常使用assign结构。源代码如下:结构。源代码如下:modul
25、ecompare(equal,a,b);inputa,b;outputequal;assignequal=(a=b)?1:0;/a等于等于b时,时,equal输出为输出为1;a不等于不等于b时,时,equal输出为输出为0endmodule2VerilogHDL行为描述行为描述(1)过程块)过程块VerilogHDL对模块的行为描述以过程块为基本单位,一个模块的行为描述由对模块的行为描述以过程块为基本单位,一个模块的行为描述由一个或多个并行运行的过程块组成。过程块格式如下:一个或多个并行运行的过程块组成。过程块格式如下:过程语句过程语句(事件控制敏感表)(事件控制敏感表)块语句开始标志符:块名
26、块语句开始标志符:块名块内局部变量说明;块内局部变量说明;一条或多条过程赋值或其他程序语句;一条或多条过程赋值或其他程序语句;块语句结束标志符块语句结束标志符过程语句就是指关键字过程语句就是指关键字always开始的语句,事件控制敏感表中的信号用于激活开始的语句,事件控制敏感表中的信号用于激活过程语句的执行;块语句标志符为过程语句的执行;块语句标志符为begin-end,块名和块内局部变量说明均为可选,块名和块内局部变量说明均为可选项。项。(2)过程语句)过程语句always如图如图9-1所示,所示,always从时刻从时刻0开始执行,并循环重复执行后面的块语句。开始执行,并循环重复执行后面的
27、块语句。always语句常带有触发(激活或敏感)条件,只有当触发条件满足时,块中的语句常带有触发(激活或敏感)条件,只有当触发条件满足时,块中的语句才真正开始执行,若触发条件默认,则触发条件始终成立。语句才真正开始执行,若触发条件默认,则触发条件始终成立。一个模块的行为描述中可以有多个一个模块的行为描述中可以有多个always语句,这些语句之间相互独立,并行语句,这些语句之间相互独立,并行运行。运行。3块语句块语句(1)串行块)串行块串行块的标志符是串行块的标志符是begin-end,位于串行块中的语句按串行方式顺序执行。综合工具,位于串行块中的语句按串行方式顺序执行。综合工具支持串行块描述。
28、支持串行块描述。(2)串行块的行为描述可以形象地理解为硬件电路中,数据在时钟与控制信号的作)串行块的行为描述可以形象地理解为硬件电路中,数据在时钟与控制信号的作用下,沿数据通道的各级寄存器之间的传送过程。用下,沿数据通道的各级寄存器之间的传送过程。例如,例如,beginreg_a=reg_b;reg_c=reg_a;end4过程赋值语句过程赋值语句VerilogHDL对模块的行为描述由一个或多个并行运行的过程块构成,而位于过程块对模块的行为描述由一个或多个并行运行的过程块构成,而位于过程块中赋值语句称为过程赋值语句。在过程赋值语句中表达式左边的信号必须是寄存器类中赋值语句称为过程赋值语句。在过
29、程赋值语句中表达式左边的信号必须是寄存器类型(如型(如reg类型);在过程赋值语句等式右边可以是任何有效的表达式,数据类型也类型);在过程赋值语句等式右边可以是任何有效的表达式,数据类型也没有限制。如果一个信号没有声明则默认为没有限制。如果一个信号没有声明则默认为wire类型,使用过程赋值语句给类型,使用过程赋值语句给wire赋值赋值会产生错误。会产生错误。过程赋值的基本格式是:过程赋值的基本格式是:=例如:如果例如:如果sum定义为寄存器信号,而定义为寄存器信号,而carry为连线信号,则在为连线信号,则在always过程块中有:过程块中有:sum=abcin;/正确正确carry=a&b|
30、a&!b&cin|!a&b&cin;/错误错误(1)事件控制)事件控制事件控制以事件控制以“”开头,后面紧跟的是事件敏感表开头,后面紧跟的是事件敏感表a)(信号名)。(信号名)。其中信号名通常是一位标量,也可以是多位矢量,数据类型没有限制,其含义是只其中信号名通常是一位标量,也可以是多位矢量,数据类型没有限制,其含义是只有检测到信号名所确定的信号发生变化时,后面的赋值语句才能执行。有检测到信号名所确定的信号发生变化时,后面的赋值语句才能执行。例如,例如,(clock)reg_a=reg_b;/当时钟信号当时钟信号clock发生变化的时候,执行发生变化的时候,执行reg_a=reg_bb)(po
31、sedge信号名信号名)。与前一情况相比,只关心信号上升沿(与前一情况相比,只关心信号上升沿(posedge)跳变的情况。)跳变的情况。例如,例如,(posedgeclock)reg_a=reg_b;/当时钟上升沿到来的时候,执行当时钟上升沿到来的时候,执行reg_a=reg_bc)(negedge信号名信号名)。只关心信号下降沿(只关心信号下降沿(negedge)跳变的情况。)跳变的情况。例如,例如,(negedgeclock)reg_a=reg_b;/当时钟下降沿到来的时候,执行当时钟下降沿到来的时候,执行reg_a=reg_bd)(敏感事件敏感事件1or敏感事件敏感事件2or敏感事件敏感
32、事件3)。在这个表达式中,敏感事件可以是上面在这个表达式中,敏感事件可以是上面、三类事件控制中的任一种,只要三类事件控制中的任一种,只要所列举的任意一种情况发生,都将激活事件控制,各个敏感事件之间是所列举的任意一种情况发生,都将激活事件控制,各个敏感事件之间是“或或”的关的关系。系。例如,例如,(posedgeresetornegedgeclear)reg_out=0;always语句的敏感信号表中,注意敏感信号的动作类型应该一致,语句的敏感信号表中,注意敏感信号的动作类型应该一致,例如:例如:always(posedgeclkornegedgerst_n)/正确,都是边沿动作。负沿可以代替低
33、电平,正确,都是边沿动作。负沿可以代替低电平,/正沿可以代替高电平,这里正沿可以代替高电平,这里rst_n为低电平有效为低电平有效always(stateorgoorws)/正确,都是电平动作正确,都是电平动作always(posedgeclkorgoorws)/不正确,有边沿和电平两类,动作类型不一致不正确,有边沿和电平两类,动作类型不一致(2)阻塞型过程赋值与非阻塞型过程赋值)阻塞型过程赋值与非阻塞型过程赋值等号赋值符等号赋值符“=”,在,在VerilogHDL中称为阻塞(中称为阻塞(blocking)型过程赋值符,该赋值)型过程赋值符,该赋值符的特点是它在串行块的执行过程中,前一条语句没
34、有完成赋值过程之前,后面的符的特点是它在串行块的执行过程中,前一条语句没有完成赋值过程之前,后面的语句不能执行,阻塞的意义就是前一条语句阻塞了后面语句的执行。语句不能执行,阻塞的意义就是前一条语句阻塞了后面语句的执行。非阻塞(非阻塞(non_blocking)赋值符)赋值符“=”可以改变阻塞的情况,在串行块中,非阻可以改变阻塞的情况,在串行块中,非阻塞赋值符是并行执行的。塞赋值符是并行执行的。例如:例如:阻塞赋值:阻塞赋值:a=1;b=a;c=b;结果是结果是a、b、c都等于都等于1,相当于图,相当于图9-2所示的组合逻辑电所示的组合逻辑电路。路。非阻塞赋值:非阻塞赋值:a=1;b=a;c=b
35、;则则a等于等于1,b是是a的老值,的老值,c是是b的老值,相当于图的老值,相当于图9-3所示的寄存器电路。所示的寄存器电路。图9-2 阻塞型赋值示意图 图9-3 非阻塞型示意图【例【例9-6】如果实现图如果实现图9-4所示的逻辑图,必须在过程块中使用阻塞型赋值语句,所示的逻辑图,必须在过程块中使用阻塞型赋值语句,程序如下:程序如下:moduleblocking(a,b,c,x,y);/a、b和和c是输入,是输入,x、y是输出是输出inputa,b,c;outputx,y;regx,y;always(aorborc)beginx=a&b;/阻塞赋值阻塞赋值y=x|c;endendmodule【
36、例【例9-7】对于图对于图9-5所示的电路,必须在过程块中使用非阻塞型赋值语句,所示的电路,必须在过程块中使用非阻塞型赋值语句,程序如下:程序如下:moduledemo1(reg_a,reg_b,d,clock);/该例相当于两个寄存该例相当于两个寄存器串联器串联inputd,clock;outputreg_a,reg_b;regreg_a,reg_b;always(posedgeclock)/时钟上升沿动作时钟上升沿动作beginreg_a=d;/reg_a的输入为的输入为dreg_b=reg_a;/reg_b的输出为的输出为reg_a的老值的老值endendmodule(3)连续赋值语句与
37、过程赋值语句的区别)连续赋值语句与过程赋值语句的区别VerilogHDL语言中的过程赋值语句与连续赋值语句之间的区别如下。语言中的过程赋值语句与连续赋值语句之间的区别如下。赋值对象不同:连续赋值语句用于连线类型信号,过程赋值语句用于寄存器赋值对象不同:连续赋值语句用于连线类型信号,过程赋值语句用于寄存器类型信号。类型信号。赋值语句的实现过程不同:连线信号一旦被连续赋值语句赋值后,赋值语句赋值语句的实现过程不同:连线信号一旦被连续赋值语句赋值后,赋值语句右端表达式中的信号有任何变化,都将反映到左端的连线变量中;过程赋值语右端表达式中的信号有任何变化,都将反映到左端的连线变量中;过程赋值语句只有在
38、执行时才有效。句只有在执行时才有效。语句的位置不同:连续赋值语句不能出现在过程块中;而过程赋值语句只能语句的位置不同:连续赋值语句不能出现在过程块中;而过程赋值语句只能出现在过程块中。出现在过程块中。语句结构不同:连续赋值语句以语句结构不同:连续赋值语句以assign开头;而过程赋值不需要先导字。开头;而过程赋值不需要先导字。9.3VerilogHDL语言中的分支语句语言中的分支语句1if-else语句语句(1)if(条件表达式)(条件表达式)块语句块语句当条件表达式成立时,执行后面的块语句,否则不执行。当条件表达式成立时,执行后面的块语句,否则不执行。(2)if(条件表达式)(条件表达式)块
39、语句块语句1else块语句块语句2当条件表达式成立时,执行块语句当条件表达式成立时,执行块语句1,否则执行块语句,否则执行块语句2。(3)if(条件表达式)(条件表达式)块语句块语句1elseif(条件表达式)(条件表达式)块语句块语句2elseif(条件表达式)(条件表达式)块语句块语句nelse(条件表达式)(条件表达式)块语句块语句n+1if-else语句可以嵌套使用,使用方法同语句可以嵌套使用,使用方法同C语言,注意语言,注意else与最近的与最近的if搭配。搭配。2case语句语句语句格式:语句格式:case(敏感表达式)(敏感表达式)值值1:块语句:块语句1值值2:块语句:块语句2
40、值值n:块语句:块语句ndefault:块语句块语句n+1Endcaseif语句、语句、case语句必须在语句必须在always块中使用,块中使用,assign语句不能在语句不能在always块中使用。块中使用。if语句中,关系表达式之间应该用逻辑运算符(语句中,关系表达式之间应该用逻辑运算符(&、|、!)连接。注意不要用赋、!)连接。注意不要用赋值语句代替关系运算符。值语句代替关系运算符。9.4VerilogHDL语言中的结构描述语言中的结构描述1结构描述方法结构描述方法VerilogHDL结构描述只是将逻辑图方式的连接关系转换成文字表达,若是已经结构描述只是将逻辑图方式的连接关系转换成文字
41、表达,若是已经有了模块的逻辑图,则可以按照如下步骤将逻辑图转换成有了模块的逻辑图,则可以按照如下步骤将逻辑图转换成VerilogHDL模块。模块。给逻辑电路图中的每个输入给逻辑电路图中的每个输入/输出端口命名端口名。输出端口命名端口名。给逻辑电路图中的内部连线命名连线信号名。给逻辑电路图中的内部连线命名连线信号名。给每个逻辑单元命名调用名。给每个逻辑单元命名调用名。命名模块名。命名模块名。书写模块名和输入书写模块名和输入/输出端口,进行端口的类型说明。输出端口,进行端口的类型说明。依据逻辑电路图,描述信号之间的连接关系。依据逻辑电路图,描述信号之间的连接关系。2模块调用模块调用模块调用是模块调
42、用是VerilogHDL结构描述的基本构成方式,一个模块可以调用其他模块,结构描述的基本构成方式,一个模块可以调用其他模块,则被调用的模块是底层模块,而调用底层模块的模块是顶层模块。则被调用的模块是底层模块,而调用底层模块的模块是顶层模块。模块调用分为两类:一类是调用基本门,另一类是调用用户自己写的模块。模块调用分为两类:一类是调用基本门,另一类是调用用户自己写的模块。模块调用的格式:模块调用的格式:模块名模块名调用名调用名(端口名列表)(端口名列表)调用时注意端口名列表中端口名的排列顺序、输入调用时注意端口名列表中端口名的排列顺序、输入/输出类型,它们都必须与被调输出类型,它们都必须与被调用
43、模块定义的顺序保持一致。用模块定义的顺序保持一致。(1)位置对应调用法)位置对应调用法将被调用模块定义时的端口名,对应地用与之相连的信号名代替。将被调用模块定义时的端口名,对应地用与之相连的信号名代替。(2)端口名对应调用法)端口名对应调用法调用格式:调用格式:定义时的端口名(调用时与之相连的信号名)。定义时的端口名(调用时与之相连的信号名)。9.5VerilogHDL语言描述组合逻辑电路语言描述组合逻辑电路组合逻辑电路是输出仅与当前输入信号有关的电路,描述组合电路可用组合逻辑电路是输出仅与当前输入信号有关的电路,描述组合电路可用always块块或连续赋值或连续赋值assign语句。语句。1a
44、lways块实现组合电路块实现组合电路在使用在使用always块实现组合电路时,需要将所有影响块实现组合电路时,需要将所有影响always块内赋值的信号都列入块内赋值的信号都列入always的敏感信号表中,同时注意在的敏感信号表中,同时注意在always块内部赋值一定要使用声明过的块内部赋值一定要使用声明过的reg型信号。型信号。在敏感信号表中不能有描述时钟边沿的在敏感信号表中不能有描述时钟边沿的posedge和和negedge关键字。关键字。【例【例9-8】VerilogHDL描述描述8线线-3线编码器例线编码器例1。moduleencoder1(none_on,out2,out1,out0
45、,h,g,f,e,d,c,b,a);inputh,g,f,e,d,c,b,a;/编码器输入信号,可以是按钮信号,编码器输入信号,可以是按钮信号,高电平有效高电平有效outputout2,out1,out0;/编码器输出信号编码器输出信号outputnone_on;/有编码输出信号有编码输出信号reg3:0out;assignnone_on,out2,out1,out0=out;/连接运算连接运算always(aorborcordoreorforgorh)/always过程块,敏感信号中没有边过程块,敏感信号中没有边沿描述关键字沿描述关键字beginif(h)outvec=4b0111;/使用如
46、果语句,如果使用如果语句,如果h为为1,则输出,则输出out等于等于4b0111elseif(g)out=4b0110;elseif(f)out=4b0101;elseif(e)out=4b0100;elseif(d)out=4b0011;elseif(c)out=4b0010;elseif(b)out=4b0001;elseif(a)out=4b0000;elseout=4b1000;endendmodule2连续赋值语句实现组合电路连续赋值语句实现组合电路使用连续赋值语句使用连续赋值语句assign需要注意:需要注意:连续赋值的信号型式一定是连线连续赋值的信号型式一定是连线wire型。型。
47、使用使用assign关键字,格式是关键字,格式是assign被赋值的连线变量被赋值的连线变量=表达式;表达式;只要等式右侧的值发生改变时,就会重新对左侧被赋值变量进行赋值。只要等式右侧的值发生改变时,就会重新对左侧被赋值变量进行赋值。所有输出(所有输出(output)和输入()和输入(input)端口都默认为连线类型,不需要特别)端口都默认为连线类型,不需要特别的连线类型声明。的连线类型声明。【例【例9-9】VerilogHDL描述描述8线线-3线编码器例线编码器例2。moduleencoder(none_on,out2,out1,out0,h,g,f,e,d,c,b,a);inputh,g,
48、f,e,d,c,b,a;outputnone_on,out2,out1,out0;wire3:0out;/定义定义out为内部为内部连线信号连线信号assignout=h?4b0111:g?4b0110:f?4b0101:e?4b0100:d?4b0011:c?4b0010:b?4b0001:a?4b0000:4b1000;/条件操作符条件操作符assignnone_on=out3;/正在编码信号,用于编码器级联正在编码信号,用于编码器级联assignout2=out2;assignout1=out1;assignout0=out0;endmodule9.6VerilogHDL语言描述时序电路
49、语言描述时序电路时序逻辑是具有状态记忆的电路,其输出不仅依赖于当前的输入,而且依赖于以前时序逻辑是具有状态记忆的电路,其输出不仅依赖于当前的输入,而且依赖于以前的状态。可以使用的状态。可以使用always块和连续赋值块和连续赋值assign语句实现时序电路。语句实现时序电路。1使用使用always块实现触发器块实现触发器只要在只要在always块敏感信号表中定义有效的时钟沿,然后使用非阻塞过程赋值语句块敏感信号表中定义有效的时钟沿,然后使用非阻塞过程赋值语句对信号赋值,就可以实现触发器或寄存器了。需要注意的是在对信号赋值,就可以实现触发器或寄存器了。需要注意的是在always块中的过程块中的过
50、程赋值语句只能对赋值语句只能对reg型的信号进行赋值。型的信号进行赋值。【例【例9-10】VerilogHDL描述描述D触发器。触发器。moduledff(q,a,b,clk);/q是输出,是输出,a、b是输入,是输入,clk是时钟信号是时钟信号outputq;inputa,b,clk;regq;always(posedgeclk)/时钟时钟clk的上升沿是敏感信号的上升沿是敏感信号beginq=a|b;/D触发器的驱动方程是触发器的驱动方程是a|b,这里使用非阻塞型赋值语,这里使用非阻塞型赋值语句句endendmodule2使用连续赋值语句实现电平敏感的触发器使用连续赋值语句实现电平敏感的触