第3章FPGA模块的结构数据类型变量和基本运算符号

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

模块的结构、数据类型、变量和基本运算符号2.数据类型及其常量、变量Verilog中总共有十九种数据类型,数据类型是用来表示数字电路硬件中的数据储存和传送元素的。在本课程中我们只介绍四个最基本的数据类型,它们是reg型、wire型、integer型、parameter型其它数据类型同学们可以查阅VerilogHDL语法参考书的有关章节逐步掌握。其它的类型如下:large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior型、trireg型、vectored型、wand型、wor型。这些数据类型除time型外都与基本逻辑单元建库有关,与系统设计没有很大的关系。在一般电路设计自动化的环境下,仿真用的基本部件库是由半导体厂家和EDA工具厂家共同提供的。系统设计工程师不必过多地关心门级和开关级的VerilogHDL语法现象。1.常量在程序运行过程中,其值不能被改变的量称为常量。一.数字整数:在VerilogHDL中,整型常量即整常数有以下四种进制表示形式:二进制整数(b或B)十进制整数(d或D)十六进制整数(h或H)八进制整数(o或O)数字表达方式有以下三种:位宽进制数字这是一种全面的描述方式。进制数字在这种描述方式中,数字的位宽采用缺省位宽(这由具体的机器系统决定,但至少32位)。数字在这种描述方式中,采用缺省进制十进制。在表达式中,位宽指明了数字的精确位数。例如:一个4位二进制数的数字的位宽为4,一个4位十六进制数的数字的位宽为16(因为每单个十六进制数就要用4位二进制数来表示)。见下例:8'b10101100//位宽为8的数的二进制表示,'b表示二进制8'ha2//位宽为8的数的十六进制,'h表示十六进制。x和z值:在数字电路中,x代表不定值,z代表高阻值。一个x可以用来定义十六进制数的四位二进制数的状态,八进制数的三位,二进制数的一位。z的表示方式同x类似。z还有一种表达方式是可以写作?。在使用case表达式时建议使用这种写法,以提高程序的可读性。见下例:4'b10x0//位宽为4的二进制数从低位数起第二位为不定值4'b101z//位宽为4的二进制数从低位数起第一位为高阻值12'dz//位宽为12的十进制数其值为高阻值(第一种表达方式)12'd?//位宽为12的十进制数其值为高阻值(第二种表达方式)8'h4x//位宽为8的十六进制数其低四位值为不定值负数:一个数字可以被定义为负数,只需在位宽表达式前加一个减号,减号必须写在数字定义表达式的最前面。注意减号不可以放在位宽和进制之间也不可以放在进制和具体的数之间。见下例:-8'd5//这个表达式代表5的补数(用八位二进制数表示)8'd-5//非法格式下划线:下划线可以用来分隔开数的表达以提高程序可读性。但不可以用在位宽和进制处,只能用在具体的数字之间。见下例:16'b1010_1011_1111_1010//合法格式8'b_0011_1010//非法格式当常量不说明位数时,默认值是32位。例:10=32’d10=32’b10101=32’d1=32’b1-1=-32’d1=32’hFFFFFFFF’bx=32’bx=32’bxxxx…xxxx二.参数型在VerilogHDL中用parameter来定义常量,即用parameter来定义一个标识符代表一个常量,称为符号常量,即标识符形式的常量,采用标识符代表一个常量可提高程序的可读性和可维护性。parameter型数据是一种常数型的数据,其说明格式如下:parameter参数名1=表达式,参数名2=表达式,…,参数名n=表达式;parameter是参数型数据的确认符,确认符后跟着一个用逗号分隔开的赋值语句表。在每一个赋值语句的右边必须是一个常数表达式。也就是说,该表达式只能包含数字或先前已定义过的参数。见下列:parametermsb=7;//定义参数msb为常量7parametere=25,f=29;//定义二个常数参数parameterr=5.7;//声明r为一个实型参数parameterbyte_size=8,byte_msb=byte_size-1;//用常数表达式赋值parameteraverage_delay=(r+f)/2;//用常数表达式赋值参数型常数经常用于定义延迟时间和变量宽度。在模块或实例引用时可通过参数传递改变在被引用模块或实例中已定义的参数。下面将通过一个例子说明在层次调用的电路中改变参数的用法。[例1]:在引用Decode实例时,D1,D2的Width将采用不同的值4和5,且D1的Polarity将为0。可用例子中所用的方法来改变参数,即用#(4,0)向D1中传递Width=4,Polarity=0;用#(5)向D2中传递Width=5,Polarity仍为1。moduleDecode(A,F);parameterWidth=1,Polarity=1;……………endmodulemoduleTop;wire[3:0]A4;wire[4:0]A5;wire[15:0]F16;wire[31:0]F32;Decode#(4,0)D1(A4,F16);Decode#(5)D2(A5,F32);endmodule2变量变量即在程序运行过程中其值可以改变的量。wire型:网络数据类型表示结构实体(例如门)之间的物理连接。网络类型的变量不能储存值,而且它必需受到驱动器(例如门或连续赋值语句,assign)的驱动。如果没有驱动器连接到网络类型的变量上,则该变量就是高阻的,即其值为z。常用的网络数据类型包括wire型和tri型。这两种变量都是用于连接器件单元,它们具有相同的语法格式和功能。之所以提供这两种名字来表达相同的概念是为了与模型中所使用的变量的实际情况相一致。wire型变量通常是用来表示单个门驱动或连续赋值语句驱动的网络型数据,tri型变量则用来表示多驱动器驱动的网络型数据。如果wire型或tri型变量没有定义逻辑强度,在多驱动源的情况下,逻辑值会发生冲突从而产生不确定值。表为wire型和tri型变量的真值表(注意:这里假设两个驱动源的强度是一致的,关于逻辑强度建模请参阅附录:Verilog语言参考书)wire/tri01xz00xx01x1x1xxxxxz01xzVerilog程序模块中输入输出信号类型缺省时自动定义为wire型。wire型信号可以用作任何方程式的输入,也可以用作“assign”语句或实例元件的输出wire型信号的格式如下:wire[n-1:0]数据名1,数据名2,…数据名i;//共有i条总线,每条总线内有n条线路或wire[n:1]数据名1,数据名2,…数据名i;wire是wire型数据的确认符,[n-1:0]和[n:1]代表该数据的位宽,即该数据有几位。最后跟着的是数据的名字。如果一次定义多个数据,数据名之间用逗号隔开。声明语句的最后要用分号表示语句结束。看下面的几个例子:wirea;//定义了一个一位的wire型数据wire[7:0]b;//定义了一个八位的wire型数据wire[4:1]c,d;//定义了二个四位的wire型数据reg型:寄存器型是数据储存单元的抽象。寄存器数据类型的关键字是reg.通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当。reg类型数据的缺省初始值为不定值,x。reg型数据常用来表示用于“always”模块内的指定信号,常代表触发器。通常,在设计中要由“always”块通过使用行为描述语句来表达逻辑关系。在“always”块内被赋值的每一个信号都必须定义成reg型。reg型数据的格式如下reg[n-1:0]数据名1,数据名2,…数据名i;或reg[n:1]数据名1,数据名2,…数据名i;reg是reg型数据的确认标识符,[n-1:0]和[n:1]代表该数据的位宽,即该数据有几位(bit)。最后跟着的是数据的名字。如果一次定义多个数据,数据名之间用逗号隔开。声明语句的最后要用分号表示语句结束。看下面的几个例子:regrega;//定义了一个一位的名为rega的reg型//数据reg[3:0]regb;//定义了一个四位的名为regb//的reg型数据reg[4:1]regc,regd;//定义了两个四位的//名为regc和regd的reg型数据memory建模VerilogHDL通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器,ROM存储器和reg文件。数组中的每一个单元通过一个数组索引进行寻址。在Verilog语言中没有多维数组存在。memory型数据是通过扩展reg型数据的地址范围来生成的。其格式如下:reg[n-1:0]存储器名[m-1:0];或reg[n-1:0]存储器名[m:1];在这里,reg[n-1:0]定义了存储器中每一个存储单元的大小,即该存储单元是一个n位的寄存器。存储器名后的[m-1:0]或[m:1]则定义了该存储器中有多少个这样的寄存器。最后用分号结束定义语句。下面举例说明:reg[7:0]mema[255:0];这个例子定义了一个名为mema的存储器,该存储器有256个8位的存储器。该存储器的地址范围是0到255。一个n位的寄存器可以在一条赋值语句里进行赋值,而一个完整的存储器则不行。见下例rega=0;//合法赋值语句mema=0;//非法赋值语句如果想对memory中的存储单元进行读写操作,必须指定该单元在存储器中的地址。下面的写法是正确的。mema[3]=0;//给memory中的第3个存储单元赋值为0。2.3运算符及表达式VerilogHDL语言的运算符范围很广,其运算符按其功能可分为以下几类:1算术运算符(+,-,×,/,%)2赋值运算符(=,=)3关系运算符(,,=,=)4逻辑运算符(&&,||,!)5条件运算符(?:)6位运算符(~,|,^,&,^~)7移位运算符(,)8拼接运算符({})9其它在Verilog语言中运算符所带的操作数是不同的,按其所带操作数的个数运算符可分为三种:1)单目运算符(unaryoperator):可以带一个操作数,操作数放在运算符的右边。2)二目运算符(binaryoperator):可以带二个操作数,操作数放在运算符的两边。3)三目运算符(ternaryoperator):可以带三个操作,这三个操作数用三目运算符分隔开。见下例:clock=~clock;//~是一个单目取反运算符,clock是操作数。c=a|b;//是一个二目按位或运算符,a和b是操作数。r=s?t:u;//?:是一个三目条件运算符,s,t,u是操作数。1.基本的算术运算符在Verilog语言中,算术运算符又称为二进制运算符,共有下面几种:1)+(加法运算符,或正值运算符,如rega+regb,+3)2)-(减法运算符,或负值运算符,如rega-3,-3)3)×(乘法运算符,如rega*3)4)/(除法运算符,如5/3)5)%(模运算符,或称为求余运算符,要求%两侧均为整型数据。如7%3的值为1)在进行整数除法运算时,结果值要略去小数部分,只取整数部分。而进行取模运算时,结果值的符号位采用模运算式里第一个操作数的符号位。见下例。模运算表达式结果说明10%31余数为111%32余数为212%30余数为0即无余数-10%3-1结果取第一个操作数的符号位,所以余数为-111%32结果取第一个操作数的符号位,所以余数为2.注意:在进行算术运算操作时,如果某一个操作数有不确定的值x,则整个结果也为不定值x。2.位运算符Verilog作为一种硬件描述语言,是针对硬件电路而言的。在硬件电路中信号有四种状态值1,0,x,z.在电路中信号进行与或非时,反映在VerilogHDL中则是相应的操作数的位运算。VerilogHDL提供了以下五种位运算符:1)~//取反2)&//按位与3)|//按位或4)^//按位异或5)^~//按位同或(异或非)说明位运算符中除了~是单目运算符以外,均为二

1 / 26
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功