




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章Verilog语法与要素
本章介绍VerilogHDL的基本要素,包括数字、字符串、标识符、运算符、数据类型和关键字等。5.1Verilog语言要素1、空白符
包含空格符、Tab、换行、换页。每条Verilog语句以;结尾。教材P121中段两个书写格式具有相同效果。2、注释有两种形式的注释
单行注释:以//打头,直到本行结束,不允许续行。
多行注释:以/*开始,直到*/结束。30cout//非法:以数字为首out*//非法:
包含不允许字符*3、标识符VerilogHDL中的标识符(identifier)可以是任意一组字母、数字、$符号和_(下划线)符号的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。以下是标识符的几个例子:4、关键字Verilog系统内部使用的词,关键字用户不可用重定义其它含义。所有的关键字都是小写字母组成。例如always是关键字,但是ALWAYS不是关键字。5.2常量Verilog中常量主要有三种类型:整数、实数、字符串5.2.1整数。+/-<size>’<base><value>
+/-<二进制位宽>’<进制><数字序列>进制有以下4种形式:
二进制:b或B,不区别大写、小写字母;十进制:d或D或缺省,不区别大写、小写字母;十六进制:h或H,不区别大写、小写字母;
八进制:o或O,不区别大写、小写字母;8’b11011010//位宽为8位二进制数110110108’hd5//位宽为8位十六进制数d5(即二进制数11010101)5’o27//位宽为5位八进制数27(即二进制数10111)4’D2//位宽为4位十进制数2(即二进制数0010)4’B1x_01//位宽为4位二进制数1x015’Hx//位宽为5位十六进制数x(即二进制数xxxxx)4’hz//位宽为4位十六进制数z二进制数zzzz)8‘h2A//位宽为8位十六进制数2A即二进制数(00101010)合格的整数书写例子。不合格的整数书写例子。3’b001//’与基数b之间不允许出现空格4’d-4//数值不允许正、负符号(+或-)正、负符号只//允许出现在最左面(3+2)’b10//位宽为不可以是表达式在书写数字时需要注意:1)在较长数字之间可以因_分开,用来提高可读性,但第一个数字
之前不可以加下划线。2)无位宽说明时,默认为为32位(二进制)。3)x或z在二进制中代表一位x或z,在八进制中代表3位x或z,在十六
位进制中代表4为x或z.
例如:8’b1001xxxx与8’h9x相同8’b1010zzzz与8’haz相同4)如果没有定义一个整数的位宽,则其宽度为响应数所需的二进制位。
例如:’o721//9位二进制数111010001‘hAF//8位二进制数101011115)如果定义的位宽比实际的位数长,则通常左边添0补位,但如果数的
最左边为x或z,则左边添x或z。
例如:10’b10//左边添8位0,即000000001010’bx0x1//左边添6位x,即xxxxxxx0x1
如果定义的位宽比实际的位小,则左边(高位)的位数被截掉。
例如:3’b1001_0011同3’b0115’H0FFF同5’H1F6)?是高阻态z的另一种表示方法,在表示数字时完全等同替代。7)整数可以带正、负符号,正、负号必须写在最左面。负数通常用
二进制补码表示。
例如:-8’h72//-72H的8位二进制补码100011108)当位宽与进制缺省时表示是十进制数。
例如32//表示十进制数32-15//表示十进制数-159)在位宽与’之间,以及进制和数字之间允许出现空格但’与进制之间以
及数字之间不允许出现空格。
例如:6‘b110001//合法,表示6位二进制数1100016’b110001//不合法,在’与进制b之间出现空格6’b110001//不合法,在数字之间出现空格5.2.2实数
实数可以用下列两种形式定义:1)十进制计数法;例如2)科学计数法;这种形式的实数举例如下:5.2.3字符串
字符串是双引号内的字符序列。字符串不能分成多行书写。例如:字符符的作用主要是在仿真时,显示一些相关的信息,或者指定显示格式。字符串属于reg型变量,其宽度为此字符串中的字符个数乘以8.例如:reg[8*12:1]stringvar;/*tringvar是reg型变量,该变量可以存放包含12个字符的字符串,共96bit*/beginstringvar=“Helloword!”;//变量stringvar存放字符串(包含12个字符)end
转义标识符(escapedidentifier)可以在一条标识符中包含任何可打印字符。转义标识符以\(反斜线)符号开头,以空白结尾(空白可以是一个空格、一个制表字符或换行符)。下面例举了几个转义标识符:反斜线和结束空格并不是转义标识符的一部分。特殊字符说明\n换行\tTab键\\符号\\”符号“\ddd八进制数ddd对应的ASCII字符例如:\1238进制数123对应的ASCII字符是大写字母S5.3数据类型数据类型是用来表示数字电路中的物理连线、数据存储和传输单元等物理量。VerilogHDL有下列四种逻辑值状态:1)0:低电平、逻辑0或逻辑非(“假”)2)1:高电平、逻辑1或“真”3)x或X:不确定或未知的逻辑状态4)z或Z:高阻态VerilogHDL中的变量部分为如下两种类数据类型:net型和variable型1、
线网类型。net类型表示Verilog结构化元件间的物理连线。它的值由驱动元件的值决定,例如连续赋值或门的输出。如果没有驱动元件连接到线网,线网的缺省值为z。可综合的net型变量有:wire型、tri型、supply1和supply0。见教材P126表5.21)wire型
是最常用的net型数据变量,,VarilogHDL模块中的输入/输出信号未被明确指定数据类型时都被默认为wire型。可以取值0、1、X、Z,如果wire型变量没有被连接到驱动,其值为高阻态Z。wire型变量定义格式为:wire数据名1,数据名2,…数据名i;//变量位宽为一位。例如:wirea,b;//定义两个位宽一位的wire型变量a和b。或:wire[n-1:0]数据名1,数据名2,…数据名Ii;//变量位宽为n位。或:wire[n:1]数据名1,数据名2,…数据名Ii;//变量位宽为n位。例如:wire[7:0]databus;//定义位宽8位wire型变量databus。wire[19:0]addrbus;//定义位宽20位wire型变daddrbuswire[0:7]a;//定义位宽为8位的wire型变量2)tri型功能与使用方法与wire型相同,只是为了增加程序的可读性,可更清楚表示该信号综合后的电路具有三态的功能。3)supply0h和supply1型supply0用于对“地”建模,即低电平0;supply1网用于对电源建模,即高电平1;例如:2、variable类型。variable类型表示一个抽象的数据存储单元,它只能在always语句和initial语句中被赋值,在always、initial等模块内被赋值的信号必须定义为variable型。1)reg型是最常用的variable型变量。被定义为reg型变量在综合时,
综合器会根据本具体情况确定将其映射成寄存器还是连线。
定义格式如下:reg数据名1,数据名2,…数据名i;//变量位宽为一位。例如:rega,b;//定义两个位宽为一位的reg型变量a和b。或:reg[n-1:0]数据名1,数据名2,…数据名i;//变量位宽为n位。或:reg[n:1]数据名1,数据名2,…数据名i;//变量位宽为n位。例如:reg[7:0]qout;//定义位宽
为8位reg型变量qout。reg[8:1]qout;//定义位宽
为8位reg型变量qout。2)integer型多用于表示循环变量,表示循环次数。integer型变量只
能被整体使用,不能作为位向量使用。
定义格式变量同reg:integeri,j;//i、j被定为两个integer变量。5.4参数Verilog用参数parameter来定义符号常量。参数经常用于定义时延和变量的宽度。使用参数说明的参数只被赋值一次。参数说明形式如下:
参数名通常用大写字母表示,而标识名、变量采用小写字母表示。modulecompare_w(a,b,larger,equal,less);//六位数据比较器parameterSIZE=6;//参数定义,可以改变SIZE值input[SIZE-1:0]a,b;outputlarger,equal,less;wirelarger,equal,less;assignlarger=(a>b);assignequal=(a==b);assignless=(a<b);endmodulemoduleadd_w(a,b,sum);//十六位加法器parameterMSB=15;//参数定义,可以改变MSB值input[MSB:0]a,b;output[MSB+1:0]sum;assignsum=a+b;endmodulemodulecount_w(en,clk,reset,out);//八位二进制计数器inputclk,reset,,en;parameterWIDTH=8;//参数定义,可以改变SIZE值output[WIDTH-1:0]out;wire[WIDTH-1:0]out;always@(posedgeclkornegedgereset)if(!reset)out=0;elseif(en)out=out+1;endmodule ````` `modulejohnsont_w(clk,clr,qout);//八位约翰逊计数器inputclk,clr;parameterWIDTH=8;//参数定义,可以改变WIDTH值outputreg[WIDTH-1:0]qout;always@(posedgeclkorposedgeclr)beginif(clr)oqut<=0;elsebeginqout<=qout<<+1;qout[0]<=qout[WIDTH-1];endendendmodule ````` `1、向量与标量5.4向量标量:宽度为一位的变量。如果在变量声明中没有指定位宽,则默认
为标量。例如:wirea;//标量aregclr;//reg型标量clr向量(vector):宽度为大于一位的变量。向量的宽度定义形式为:[MSB:LSB]
方括号左边的数字表示向量的最高位,右边的数字表示最低位。例如:wire[3:0]bus;//
4位总线标量bus[3]bus[2]bus[1]bus[0]reg[0:7]rc;//8位寄存器rc[0]rc[1]rc[2]rc[3]…rc[7]2、位选择和域选择
有两类向量:标量类向量,未加特别说明定义的向量;
向量类向量,定义时用关键字vectored说明。例如:
wirevectored[7:0]databus;//8位向量类标量databusreg[31:0]rega;//32位标量类向量regaVerilogHDL只允许对标量类向量进行位选择和域选择。位选择:在表达式中选择向量中的某一位。域选择:表达式中选择向量中相邻几位。
在进行位选择、域选择时,必须等号左右两端的位宽一致。例如:
a=mybyte[6];//位选择,将mybyte[6]位的值赋给变量a,a是标量。b=mybate[5:2];//将mybyte的第5、4、3、2位的值赋给b,b是//4位向量。例如:
reg[7:0]a,b;reg[3:0]c;regd;d=a[7]&b[7];//位选择c=a[7:4]+b[3:0];//域选择3.存储器
存储器可以看作是二维向量。Verilog定义存储器时,必须指明存储器的容量:单元数和每个存储单元的字长。用如下方式存储器:
reg[7:0]mymem[63:0];/*定义存储器mymem,64个单元,字长8位*/reg[3:0]amem[63:0];//定义存储器amen,容量64,字长4位regbmem[5:1];//定义存储器bmen,容量5个单元,字长1位parameterWIDTH=8,MEMSISE=1024;
reg[WIDTH-1:0]mymem[MEMSISE-1:0];//定义字长8bit容量为1024个单元的存储器mymem,
例如:reg[7:0]mymem[63:0];//定义存储的存储器mymem,mymem[8]=8’b10001001;//mymem第8的单元存放10001001。mymem[25]=65;//mymem第25的单元存放十进制数65(01000001)。
对存储器赋值必须对一个单元整体赋值,不允许对
存储器进行位选择和域选择。Verilog将寄存器看作向量。如果需要对存储器进行位选择或域选择时,可以先将存储单元读入寄存器,然后对寄存器进行位选择或域选择。
例如:reg[7:0]rega;//定义寄存器8位的rega,reg[7:0]mymem[63:0];//定义存储的存储器mymem,mymem[8]=8’b10001001;//mymem第8的单元存放10001001。rega=mvmem[8];rega[3]=rega[3]&®a[2];mvmem=rega;//mymem第8单元的值是10000001
有一种存储器赋值的方法是分别对存储器中的每个字赋值。例如:为存储器赋值的另一种方法是使用系统任务:1)$readmemb(加载二进制值)2)$readmemh(加载十六进制值)
这些系统任务从指定的文本文件中读取数据并加载到存储器。文本文件必须包含相应的二进制或者十六进制数。例如:存储器文件中必须包含二进制值,也可以包含空白空间和注释VerilogHDL中的操作符可以分为下述类型:1)算术操作符2)关系操作符3)相等操作符4)逻辑操作符5)按位操作符6)归约操作符7)移位操作符8)条件操作符9)连接和复制操作符5.6运算符1算术运算符双目运算符算术操作符有:+加双目运算符-减双目运算符*乘双目运算符/除双目运算符%求模双目运算符2逻辑运算符
这些操作符在逻辑值0或1上操作。逻辑操作的结果为0或1。对于向量操作,将向量作整体处理,非0向量作为1处理。全0向量作0处理如果任意一个操作数包含x,结果也为x。!x结果为x&01x|01x^01x^~01x0000001x001x010X101X1111110x101Xx0xxxx1xxxxxxxxx位运算是对操作数按位对应进行逻辑运算。位运算包括:
~单目运算符,对操作数各位进行取反运算。&双目运算符,对两个操作数按位进行与逻辑运算。|双目运算符,对两个操作数按位进行或逻辑运算。^双目运算符,对两个操作数按位进行异或逻辑运算。^~双目运算符,对两个操作数按位进行同或逻辑运算。~01X10x3.位运算符
若a=5’b11001,b=5’b10101,则:~a的结果为5’b00110,a&b的结果为5’b10001,a|b的结果为5’b11101,a^b的结果为5’b01100.。两个不同长度的数据进行位操作时,自动按右端(最低位)对齐,位少的数高位自动补0.4.关系运算符双目运算符关系运算符有:>大于<小于>=不小于(大于等于)<=不大于(小于等于)
关系操作符的结果:关系成立为真(1);关系不成立为假(0)。如果操作数中有一位为X或Z,那么结果为X。例如:23>45结果为假(0),52<8'hxFF结果为x。
如果操作数长度不同,长度较短的操作数在高位(左方)添0补齐。例如:5.等式运算符双目运算符相等运算符(==)与全等运算符(===)的过程是参与比较运算的两个操作数必须逐位进行比较,如果两个操作数各位均是确定的逻辑值(0或1),则两个数各位对应相等,结果为1,否则为0。如果两个操作数中如果某位是不定态(x)或高阻值(z),则相等比较(==)的结果是不定值,而全等比较(===)则对这些不定态或高阻值的位也逐位比较,只有两个操作数完全逐位相等,其结果为1,否则为0。
如果操作数的长度不相等,长度较小的操作数在左侧添0补位,例如:==等于!=不等于===全等于!==全不等于等式运算结果是逻辑值:1或0.例:adata=‘b11x0bdata=‘b11x0则adata==bdata运算结果是x
而adata===bdata
运算结果是16缩位运算符单目运算符
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农村屋子交易合同样本
- 中介佣金合同样本简约样本
- 个人电机转让合同样本
- 【高三】【下学期期中】(高考前的“加速度”)家长会逐字稿
- 公司注销合同样本
- 出租房屋协议合同标准文本
- 乙方工地材料合同样本
- 养鸭子合同样本
- 买卖沙居间合同标准文本
- 提升企业员工忠诚度的工作思路计划
- 十六年前的回忆阅读及答案
- 煤矿电气试验规程
- 钢筋混凝土排水管一级管配筋设计图册
- 新版药品经营质量管理规范应知应会
- 初一下册生物期中考试复习提纲
- 站务一号线low培训
- APQP培训-经典案例(完整版)
- 最全的L13J1建筑工程做法(共170页)
- 钢筋混凝土检查井技术交底
- GH2-B组合型电气火灾监控探测器安装使用说明书
- 单位公章使用登记表
评论
0/150
提交评论