1、数字系统设计与数字系统设计与Verilog HDLVerilog HDL 第第5章章 Verilog语言要素语言要素5.1 Verilog语言要素语言要素5.2 常量常量5.3 数据类型数据类型5.4 参数参数5.5 向量向量5.6 运算符运算符5.1 概概 述述Verilog 程序由符号流构成,符号包括程序由符号流构成,符号包括:空白符(空白符(White space)注释(注释(Comments)操作符(操作符(Operators)数字(数字(Numbers)字符串(字符串(Strings)标识符(标识符(Identifiers)关键字(关键字(Keywords)等)等空白符和注释空白符和
2、注释 空白符(空白符(White space)空白符包括:空格、空白符包括:空格、tab、换行和换页。空白符使代、换行和换页。空白符使代码错落有致,阅读起来更方便。在综合时空白符被码错落有致,阅读起来更方便。在综合时空白符被忽略。忽略。 注释(注释(Comment) 单行注释:以单行注释:以“/”开始到本行结束开始到本行结束 多行注释:多行注释以多行注释:多行注释以“/*”开始,到开始,到“*/”结束结束标识符(标识符(Identifiers) 标识符(标识符(Identifiers)Verilog中的标识符可以是任意一组字母、数字以及中的标识符可以是任意一组字母、数字以及符号符号“$”和和“
3、_”(下划线)的组合,但标识符的第一(下划线)的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区个字符必须是字母或者下划线。另外,标识符是区分大小写的。分大小写的。=count=COUNT /COUNT与count是不同的=_A1_d2 /以下划线开头=R56_68=FIVE关键字(关键字(Keywords) Verilog语言内部已经使用的词称为关键字或保语言内部已经使用的词称为关键字或保留字,这些保留字用户不能作为变量或节点名留字,这些保留字用户不能作为变量或节点名字使用。字使用。 关键字都是小写的。关键字都是小写的。 整数整数 实数实数 字符串字符串5.2 常量常量程序运
4、行中,值不能被改变的量称为常(程序运行中,值不能被改变的量称为常(constants)。Verilog中的常量主要有如下中的常量主要有如下3种类型:种类型: 整数按如下方式书写:整数按如下方式书写: +/- 即即 +/-size 为对应二进制数的宽度;为对应二进制数的宽度;base为进制;为进制;value是基于进制是基于进制的数字序列。的数字序列。进制有如下进制有如下4种表示形式:种表示形式: 二进制(二进制(b或或B) 十进制(十进制(d或或D或缺省)或缺省) 十六进制(十六进制(h或或H) 八进制(八进制(o或或O)整数(整数(integer)8b11000101 /位宽为八位的二进制数
5、位宽为八位的二进制数110001018hd5 /位宽为八位的十六进制数位宽为八位的十六进制数d5;5O27 /5位八进制数位八进制数4D2 /4位十进制数位十进制数24B1x_01 /4位二进制数位二进制数1x015Hx /5位位x(扩展的(扩展的x),即),即xxxxx4hZ /4位位z,即,即zzzz8h2A /*在位宽和在位宽和之间,以及进制和数值之间允许之间,以及进制和数值之间允许出现空格,但出现空格,但和进制之间,数值间是不允许出现空格的,和进制之间,数值间是不允许出现空格的,比如比如8h2A、8h2A等形式都是不合法的写法等形式都是不合法的写法 */整数(整数(integer)实数
6、(实数(Real)有下面两种表示法。)有下面两种表示法。 十进制表示法。例如:十进制表示法。例如:2.00.1 /以上以上2例是合法的实数表示形式例是合法的实数表示形式2. /非法:小数点两侧都必须有数字非法:小数点两侧都必须有数字 科学计数法。例如:科学计数法。例如:43_5.1e2 /其值为其值为43510.09.6E2 /960.0 (e与与E相同相同)5E-4 /0.0005实数(实数(Real)字符串(字符串(Strings)字符串是双引号内的字符序列。字符串是双引号内的字符序列。字符串不能分成多行书写。例如:字符串不能分成多行书写。例如: INTERNAL ERROR字符串的作用主
7、要是用于仿真时,显示一些相关的信字符串的作用主要是用于仿真时,显示一些相关的信息,或者指定显示的格式。息,或者指定显示的格式。5.3 数据类型数据类型 Verilog有下面四种基本的逻辑状态。有下面四种基本的逻辑状态。 0:低电平、逻辑:低电平、逻辑0或逻辑非或逻辑非 1:高电平、逻辑:高电平、逻辑1或或“真真” x或或X:不确定或未知的逻辑状态:不确定或未知的逻辑状态 z或或Z:高阻态:高阻态Verilog中的所有数据类型都在上述中的所有数据类型都在上述4类逻辑状态中取值,其中类逻辑状态中取值,其中x和和z都不区分大小写,也就是说,值都不区分大小写,也就是说,值0 x1z与值与值0X1Z是等
8、同的。是等同的。数据类型(数据类型(Data Type)是用来表示数字电路中的物)是用来表示数字电路中的物理连线、数据存储和传输单元等物理量的。理连线、数据存储和传输单元等物理量的。 数据类型数据类型 Verilog中的变量分为如下两种数据类型:中的变量分为如下两种数据类型: net型型 variable型型net型中常用的有型中常用的有wire、tri;variable型包括型包括reg、integer等。等。 注意:在注意:在Verilog-1995标准中,标准中,variable型变量称为型变量称为register型;在型;在Verilog-2001标准中将标准中将register一词一
9、词改为了改为了variable,以避免初学者将,以避免初学者将register和硬件中和硬件中的寄存器概念混淆起来。的寄存器概念混淆起来。5.3.1 net型型Net型数据相当于硬件电路中的各种物理连接,其特点型数据相当于硬件电路中的各种物理连接,其特点是输出的值紧跟输入值的变化而变化。对连线型有是输出的值紧跟输入值的变化而变化。对连线型有两种驱动方式,一种方式是在结构描述中将其连接两种驱动方式,一种方式是在结构描述中将其连接到一个门元件或模块的输出端;另一种方式是用持到一个门元件或模块的输出端;另一种方式是用持续赋值语句续赋值语句assign对其进行赋值。对其进行赋值。wire是最常用的是最
10、常用的Net型变量。型变量。wire型变量的定义格式如下:型变量的定义格式如下:wire 数据名数据名1,数据名,数据名2,数据名数据名n;例如:例如: wire a,b; /定义了两个定义了两个wire型变量型变量a和和b5.3.2 Variable型型variable型变量必须放在过程语句(如型变量必须放在过程语句(如initial、always)中,通过)中,通过过程赋值语句赋值;在过程赋值语句赋值;在always、initial等过程块内被赋值的信等过程块内被赋值的信号也必须定义成号也必须定义成variable型。型。注意:注意:variable型变量并不意味着一定对应着硬件上的一个触
11、发型变量并不意味着一定对应着硬件上的一个触发器或寄存器等存储元件,在综合器进行综合时,器或寄存器等存储元件,在综合器进行综合时,variable型变型变量会根据具体情况来确定是映射成连线还是映射为触发器或寄量会根据具体情况来确定是映射成连线还是映射为触发器或寄存器。存器。 reg型变量是最常用的一种型变量是最常用的一种variable型变量。型变量。 reg 数据名数据名1,数据名,数据名2,数据名数据名n; 例如:例如:reg a,b; /定义了两个定义了两个reg型变量型变量a,breg7:0 qout; /定义qout为8位宽的reg型向量reg8:1 qout; 5.4 参数参数(pa
12、rameter)在在Verilog语言中,用参数语言中,用参数parameter来定义符号常量,即用来定义符号常量,即用parameter来定义一个标志符代表一个常量。参数常用来定义来定义一个标志符代表一个常量。参数常用来定义时延和变量的宽度。时延和变量的宽度。其定义格式如下:其定义格式如下:parameter 参数名参数名1=表达式表达式1,参数名,参数名2=表达式表达式2,参数名,参数名3=表表达式达式3, ;例如:例如:parameter SEL=8,CODE=8ha3;【例5.3】 采用参数定义的数据比较器module compare_w(a,b,larger,equal,less);
13、parameter SIZE=6; /参数定义inputSIZE-1:0 a,b;output larger,equal,less;wire larger,equal,less;assign larger=(ab);assign equal=(a=b);assign less=(ab);endmodule【例5.4】 采用参数定义的二进制计数器module count_w(en,clk,reset,out);input clk,reset,en;parameter WIDTH=8; /参数声明Output regWIDTH-1:0 out;always (posedge clk or nege
14、dge reset)if(!reset) out=0;else if(en) out=out+1;endmodule【例5.5】 采用参数定义的加法器module add_w /模块声明采用Verilog-2001格式#(parameter MSB=15,LSB=0) /参数声明,注意没有分号;(inputMSB:LSB a,b, outputMSB+1:LSB sum);assign sum=a+b;endmoduleVerilog-2001中的参数声明中的参数声明【例5.7】 采用了局部参数localparam的加法器module add_localp#(parameter MSB=15,
15、LSB=0)/parameter参数定义(inputMSB:LSB a,b, outputHSB:LSB sum);localparam HSB=MSB+1;/localparam参数定义assign sum=a+b;endmodulelocalparam局部参数局部参数5.5 向量向量 n 1标量与向量标量与向量宽度为宽度为1位的变量称为标量,如果在变量声明中没有指定位的变量称为标量,如果在变量声明中没有指定位宽,则默认为标量(位宽,则默认为标量(1位)。举例如下:位)。举例如下: wire a; /a为标量为标量 reg clk; /clk为标量为标量reg型变量型变量n 线宽大于线宽大于
16、1位的变量(包括位的变量(包括net型和型和variable型)称为向型)称为向量(量(vector)。向量的宽度用下面的形式定义:)。向量的宽度用下面的形式定义: msb : lsbn 比如:比如: wire3:0 bus; /4位的总线位的总线n 2位选择和域选择位选择和域选择 在表达式中可任意选中向量中的一位或相邻几位,分别称为在表达式中可任意选中向量中的一位或相邻几位,分别称为位选择和域选择,例如:位选择和域选择,例如:A=mybyte6; /位选择位选择B=mybyte5:2; /域选择域选择n 再比如:再比如:reg7:0 a,b; reg3:0 c; reg d;d=a7&b7;
17、 /位选择位选择c=a7:4+b3:0; /域选择域选择5.6 运算符(运算符(Operators) 1算术运算符(算术运算符(Arithmetic operators)常用的算术运算符包括:常用的算术运算符包括:+加加-减减*乘乘/ 2逻辑运算符(逻辑运算符(Logical operators)&逻辑与逻辑与| 逻辑或逻辑或!逻辑非逻辑非3位运算符(位运算符(Bitwise operators)位运算,即将两个操作数按对应位分别进行逻辑位运算,即将两个操作数按对应位分别进行逻辑运算。运算。按位取反按位取反&按位与按位与|按位或按位或按位异或按位异或,按位同或(符号按位同或(符号与与是等价的)
18、是等价的)4关系运算符(关系运算符(Relational operators)小于小于大于大于=大于或等于大于或等于5等式运算符(等式运算符(Equality Operators)=等于等于!=不等于不等于=全等全等!=不全等不全等6缩减运算符(缩减运算符(Reduction operators)&与与&与非与非|或或| 或非或非异或异或, 同或同或7移位运算符(移位运算符(shift operators)右移右移左移左移8指数运算符指数运算符*n Verilog-2001标准中增加了指数运算符标准中增加了指数运算符“*”,执行,执行指数运算,一般使用更多的是底数为指数运算,一般使用更多的是底
19、数为2的指数运算的指数运算9条件运算符(条件运算符(conditional operators)?:n 三目运算符,其定义方式如下:三目运算符,其定义方式如下:signal=condition?true_expression:false_expression;n 即:信号即:信号=条件条件?表达式表达式1:表达式表达式2;当条件成立时,信号取表达式当条件成立时,信号取表达式1的值,反之取表达式的值,反之取表达式2的值。的值。10位拼接运算符(位拼接运算符(concatenation operators) 该运算符将两个或多个信号的某些位拼接起来。该运算符将两个或多个信号的某些位拼接起来。信号信
20、号1的某几位,信号的某几位,信号2的某几位,的某几位,信号,信号n的某几的某几位位运算符的优先级运算符的优先级在书写程序时建议用括号()来控制运算的优先级在书写程序时建议用括号()来控制运算的优先级 习习 题题 55.1 下列标识符哪些是合法的,哪些是错误的?下列标识符哪些是合法的,哪些是错误的?Cout, 8sum, a*b, _data, wait, initial, $latch5.2 下列数字的表示是否正确?下列数字的表示是否正确?6d18, Bx0, 5b0 x110, da30, 10d2, hzF5.3 reg型和型和wire型变量有什么本质的区别?型变量有什么本质的区别?5.4
21、 如果如果wire型变量没有被驱动,其值为多少?型变量没有被驱动,其值为多少?5.5 reg型变量的初始值一般是什么?型变量的初始值一般是什么?习习 题题 55.6 定义如下的变量和常量:定义如下的变量和常量:(1)定义一个名为)定义一个名为count的整数;的整数;(2)定义一个名为)定义一个名为ABUS的的8位位wire总线;总线;(3)定义一个名为)定义一个名为address的的16位位reg型变量,并将型变量,并将该变量的值赋为十进制数该变量的值赋为十进制数128;(4)定义参数)定义参数Delay_time, 参数值为参数值为8;(5)定义一个名为)定义一个名为DELAY的时间变量;
22、的时间变量;(6)定义一个)定义一个32位的寄存器位的寄存器MYREG;(7)定义一个容量为)定义一个容量为128,字长为,字长为32位的存储器位的存储器MYMEM;实验与设计实验与设计5-1 用用altpll锁相环宏模块实现倍频和分频锁相环宏模块实现倍频和分频实验要求实验要求:基于基于Quartus Prime软件,用软件,用altpll锁相环锁相环模块实现倍频和分频,将输入的模块实现倍频和分频,将输入的50 MHz参考时钟参考时钟信号经过锁相环,输出一路信号经过锁相环,输出一路9 MHz(占空比为(占空比为50%)的分频信号,一路有的分频信号,一路有5 ns相移的相移的100 MHz(占空
23、比(占空比为为40%)倍频信号,并进行仿真验证。)倍频信号,并进行仿真验证。n选择芯片和设置参考时钟选择芯片和设置参考时钟用用altpll锁相环宏模块实现倍频和分频锁相环宏模块实现倍频和分频n锁相环端口设置锁相环端口设置用用altpll锁相环宏模块实现倍频和分频锁相环宏模块实现倍频和分频n输出时钟输出时钟c0设置设置用用altpll锁相环宏模块实现倍频和分频锁相环宏模块实现倍频和分频n输出时钟输出时钟c1设置设置用用altpll锁相环宏模块实现倍频和分频锁相环宏模块实现倍频和分频n选择需要的输出文件格式选择需要的输出文件格式用用altpll锁相环宏模块实现倍频和分频锁相环宏模块实现倍频和分频n锁相环电路仿真波形(锁相环电路仿真波形(Modelsim)用用altpll锁相环宏模块实现倍频和分频锁相环宏模块实现倍频和分频