Verilog HDL基本语法

上传人:门**** 文档编号:243749997 上传时间:2024-09-30 格式:PPT 页数:82 大小:528.50KB
返回 下载 相关 举报
Verilog HDL基本语法_第1页
第1页 / 共82页
Verilog HDL基本语法_第2页
第2页 / 共82页
Verilog HDL基本语法_第3页
第3页 / 共82页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第二部分,Verilog,HDL,基本语法,2.1,Verilog,HDL,程序模块结构,设,计,模,块,模块端口定义,I/O,说明,功能描述,模块内容,信号类型说明,2.1.1,模块端口定义,模块端口定义,用来声明设计电路模块的输入输出端口。端口定义,格式,如下,module,模块名(端口,1,,端口,2,,端口,3,,,);,在端口定义的,圆括弧,中,是设计电路模块与外界联系的,全部输入输出端口信号或引脚,,它是设计实体对外的一个通信界面,是外界可以看到的部分(不包含电源和接地端),多个端口名之间用“,”分隔。,例如,,module adder,(,sum,,,cont,,,ina,,,inb,,,cin,);,2.1.2,模块内容,模块内容,包括,I/O,说明、信号类型声明和功能描述。,1.,模块的,I/O,说明,模块的,I/O,说明,用来声明模块端口定义中各端口数据流动方向包括输入(,input,)、,输出(,output,),和双向(,inout,)。,I/O,说明格式如下,input,端口,1,,端口,2,,端口,3,,,;,output,端口,1,,端口,2,,端口,3,,,;,例如,input,ina,,,inb,,,cin,;,output sum,,,cont,;,2.,信号类型声明,信号类型声明,用来说明设计电路的功能描述中,所用的信号的数据类型以及函数声明。,信号的数据类型主要有,连线(,wire,),、,寄存器(,reg,),、,整型(,integer,),、,实型(,real,),和,时间(,time,),等类型。,3.,功能描述,功能描述,是,Verilog,HDL,程序设计中最主要的部分,用来描述设计模块的内部结构和模块端口间的逻辑关系,在电路上相当于,器件的内部电路结构,。,功能描述可以用,assign,语句,、,元件例化(,instantiate,),、,always,块语句,、,initial,块语句,等方法来实现,通常把确定这些设计模块描述的方法称为建模。,(,1,)用,assign,语句建模,用,assign,语句建模的方法很简单,只需要在“,assign”,后面再加一个表达式即可。,assign,语句一般适合对,组合逻辑,进行赋值,称为连续赋值方式。,【,例,2.1】1,位全加器的设计。,ina,inb,cin,adder1,sum,cout,Verilog,HDL,源程序如下,module adder1,(,sum,,,cout,,,ina,,,inb,,,cin,);,/,模块端口定义,input,ina,,,inb,,,cin,;,output sum,,,cout,;,/I/O,声明,assign ,cout,,,sum =,ina+inb+cin,;,/,功能描述语句,endmodule,/,endmodule,后不加分号,默认的数据类型为,wire,(,连线)型,, ,为拼接运算符,是将,cout,、,sum,这样两个,1,位操作数拼接为一个,2,位操作数。,(,2,)用元件例化(,instantiate,),方式建模,元件例化方式建模是利用,Verilog,HDL,提供的元件库实现的。,例如,用与门例化元件定义一个,3,输入端与门可以写为,andmyand3(y,a,b,c);,(,3,)用,always,块语句建模,always,块语句可以产生各种逻辑,常用于,时序逻辑,的功能描述。一个程序设计模块中,可以包含一个或多个,always,语句。,程序运行中,在某种条件满足时,就重复执行一遍,always,结构中的语句,。,【,例,2.2,】,8,位二进制加法计数器的设计。,module cnt8(out,cout,data,load,cin,clk,clr);,input 7:0 data;,input load,cin,clk,clr,;,output 7:0 out;,output,cout,;,reg,7:0 out;,/,寄存器型参量,具有寄存功能,always (,posedge,clk,),/,时钟上升沿,每次上升沿,执行,always,语句,begin,if (,clr,) out =8b0;,else if (load) out = data;,else out =,out+8b1,;,end,assign,cout,= &out &,cin,;,/”&out”,与缩减运算式,endmodule,(,4,)用,initial,块语句建模,initial,块语句与,always,语句类似,不过在程序中它,只执行,1,次,就结束了。,Verilog,HDL,程序设计模块的基本结构小结,:,Verilog,HDL,程序是由,模块,构成的。每个模块的内容都是嵌在,module,和,endmodule,两语句之间,每个模块实现特定的功能,模块是可以进行,层次嵌套,的。,每个模块首先要进行,端口定义,,并说明输入(,input,)、,输出(,output,),或双向(,inouts,),,然后对模块的,功能,进行逻辑,描述,。,Verilog,HDL,程序的,书写格式自由,,一行可以一条或多条语句,一条语句也可以分为多行写。,除了,endmodule,语句外,每条语句后必须要有分号,“;”,。,可以用,/*,*/,或,/,对,Verilog,HDL,程序的任何部分作,注释,。,一个完整的源程序都应当加上需要的注释,以加强程序的可读性。,2.2,Verilog,HDL,的词法,2.2.1,空白符和注释,Verilog,HDL,的空白符包括,空格,、,tab,符号,、,换行,和,换页,。,空白符如果不是出现在字符串中,编译源程序时将被忽略。,注释分为,行注释,和,块注释,两种方式。行注释用符号,/,(两个斜杠)开始,注释到本行结束。块注释用,/*,开始,用*,/,结束,。块注释可以跨越多行,但它们不能嵌套。,2.2.2,常数,Verilog,HDL,的常数包括,数字,、,未知,X,和,高阻,Z,三种。数字可以用二进制、十进制、八进制和十六进制等,4,种不同数制来表示,完整的,数字格式,为,其中,位宽表示数字对应的二进制数的位数宽度;进制符号包括,b,或,B,(,表示二进制数),,d,或,D,(,表示十进制数),,h,或,H,(,表示十六进制数),,o,或,O,(,表示八进制数)。,例如,8b10110001 /,表示位宽为,8,位的二进制数,8hf5 /,表示位宽为,8,位的十六进制数,十进制数的位宽和进制符号可以缺省,,例如,/,表示十进制数,125,X,和,Z,表示位数的特殊性,:,8b1111,xxxx,/,等价,8hf,x,8b1101,zzzz,/,等价,8hd,z,2.2.3,字符串,字符串是用,双引号,括起来的,可打印字符序列,,它必须包含在,同一行,中。,例如,,”,ABC”,,”,A BOY.”,,”,A”,,”,1234”,都是字符串。,2.2.4,标识符,标识符是用户编程时为常量、变量、模块、寄存器、端口、连线、示例和,begin-end,块等元素定义的名称。标识符可以是字母、数字和下划线“,_”,等符号组成的任意序列。定义标识符时应遵循如下,规则:,首字符不能是数字。,字符数不能多于,1024,个。,大小写字母是不同的。,不要与关键字同名。,2.2.5,关键字,关键字是,Verilog,HDL,预先定义的单词,它们在程序中有不同的使用目的。所有关键字都用小写,例如,,module,和,endmodule,来指出源程序模块的开始和结束;用,assign,来描述一个逻辑表达式等。,Verilog,HDL,的关键字有,97,个。,2.2.6,操作符,操作符也称为运算符,是,Verilog,HDL,预定义的函数名字,这些函数对被操作的对象(即操作数)进行规定的运算,得到一个结果。,操作符通常由,1,3,个字符组成,例如,,“,+,”,表示加操作,,“,= =,”,(两个,=,字符)表示逻辑等操作,,“,= = =,”,(,3,个,=,字符)表示全等操作。,有些操作符的操作数只有,1,个,称为,单目,操作;有些操作符的操作数有,2,个,称为,双目,操作;有些操作符的操作数有,3,个,称为,三目,操作。,1.,算术操作符(,Arithmetic operators,),常用的算术操作符:,+,(加)、,-,(减)、*(乘)、,/,(除)、,%,(求余)。,其中,%,是求余操作符,在两个整数相除的基础上,取出其余数。例如,,5 % 6,的值为,5,;,13 % 5,的值是,3,。,2.,逻辑操作符(,Logical operators,),逻辑操作符包括:,&,(逻辑与)、,|,(逻辑或)、!(逻辑非),3.,位运算(,Bitwise operators,),位运算是将两个操作数按对应位进行逻辑操作。,位运算操作符包括:,(按位取反)、,&,(按位与)、,|,(按位或)、,(按位异或)、,或,(按位同或)。,在进行位运算时,当两个操作数的位宽不同时,计算机会自动将两个操作数按右端对齐,位数少的操作数会在高位用,0,补齐。,4.,关系操作符(,Pelational,operators,),关系操作符有:,(小于)、,(大于)、,=,(大于等于)。,其中,,(右移)、, n,;,/,将操作数的内容右移,n,位,同时从左边开始,用,0,来填补,移出的位数。,操作数, 4,的结果是,A,= 8b00001101,;而,A, 4,的结果是,A,= 8b00010000,。,8.,条件操作符,(Conditional operators),条件操作符为:?:,条件操作符的,操作数有,3,个,,其使用格式为,操作数,=,条件 ? 表达式,1,:表达式,2,;,即当条件为真(条件结果值为,1,)时,操作数,=,表达式,1,;为假(条件结果值为,0,)时,操作数,=,表达式,2,。,源程序如下,moduleexample_2_3(out,a,b,c);,input,a,b,c,;,outputout;,assign out = a? b:c;,endmodule,【,例,2.3】,用,Verilog,HDL,语言描述下图所示的电路。,out,c,b,a,1,&,&,&,9.,位并接操作符(,Concatenation operators,),并接操作符为:,并接操作符的,使用格式,:,操作数,1,的某些位,操作数,2,的某些位,,,操作数,n,的某些位;,作用:,即将操作数,1,的某些位与操作数,2,的某些位与,与操作数,n,的某些位并接在一起。,例如,,将,1,位全加器进位,cont,与和,sum,并接在一起使用,它们的结果由两个加数,ina,、,inb,及低位进位,cin,相加决定的表达式为,cont,,,sum,=,ina+inb+cin,;,2.2.7,Verilog,HDL,数据对象,Verilog,HDL,数据对象是指用来存放各种类型数据的容器,包括,常量,和,变量,。,1.,常量,常量是一个恒定不变的值数,一般,在程序前部定义,。,常量定义,格式,为,parameter,常量名,1 =,表达式,常量名,2 =,表达式,,,,常量名,n =,表达式;,parameter,是常量定义关键字,常量名是用户定义的标识符,表达式是为常量赋的值。例如,parameter,vcc,= 5,,,fbus,= 8b11010001,;,2.,变量,变量是在程序运行时其值可以改变的量。,在,Verilog,HDL,中,变量分为,网络型(,nets type,),和,寄存器型(,register type,),两种。,(,1,)网络型变量(,nets type,),nets,型变量是输出值始终根据输入变化而更新的变量,它一般用来定义硬件电路中的,各种物理连线,。,类 型,功能说明,wire、tri,连线类型(两者功能完全相同),wor,、,trior,具有线或特性的连线(两者功能一致),wand,、,triand,具有线与特性的连线(两者功能一致),tri1、tri0,分别为上拉电阻和下拉电阻,supply1,、,supply0,分别为电源(逻辑,1,)和地(逻辑,0,),Verilog,HDL,提供的,nets,型变量如下,(,2,)寄存器型变量(,register type,),register,型变量是一种数值容器,不仅可以,容纳当前值,,也可以,保持历史值,,这一属性与,触发器或寄存器的记忆功能,有很好的对应关系。,register,型变量与,wire,型变量的根本区别:,register,型变量需要被明确地赋值,并且在被重新赋值前一直保持原值。,register,型变量是在,always,、,initial,等过程语句中定义,并通过过程语句赋值。,常用的,register,型变量及说明,类 型,功 能 说 明,reg,常用的寄存器型变量,integer,32,位带符号整数型变量,real,64,位带符号实数型变量,time,无符号时间型变量,integer,、,real,和,time,等,3,种寄存器型变量都是纯数学的抽象描述,不对应任何具体的硬件电路,但它们可以描述与模拟有关的计算。例如,可以利用,time,型变量控制经过特定的时间后关闭显示等。,reg,型变量是数字系统中存储设备的抽象,常用于具体的硬件描述,因此是最常用的寄存器型变量。,reg,型变量定义的关键字是,reg,,,定义,格式,如下,reg,位宽,变量,1,,变量,2,,,,变量,n,;,用,reg,定义的变量有一个范围选项(即位宽),,默认的位宽是,1,。位宽为,1,位的变量称为,标量,,位宽超过,1,位的变量称为,向量,。标量的定义不需要加位宽选项,例如,reg,a,,,b,;,/,定义两个,reg,型变量,a,,,b,向量定义时需要位宽选项,,例如,reg7,:,0data,;,/,定义,1,个,8,位寄存器型变量,最高有效位是,7,,最低有效位是,0,reg0,:,7data,;,/,定义,1,个,8,位寄存器型变量,最高有效位是,0,,最低有效位是,7,向量定义后可以采有多种使用形式(即赋值),data=8b00000000;,data5:3=3b111;,data7=1,;,(,3,)数组,若干个相同宽度的向量构成数组。,在数字系统中,,reg,型数组变量即为,memory,(,存储器)型变量,。,存储器型可以用如下语句定义,reg7,:,0mymemory1023,:,0,;,上述语句定义了一个,1024,个字存储器变量,mymemory,,,每个字的字长为,8,位。在表达式中可以用下面的语句来使用存储器:,mymemory7 = 75,;,/,存储器,mymemory,的第,7,个字被赋值,75,2.3,Verilog,HDL,的语句,语句是构成,Verilog,HDL,程序不可缺少的部分。,Verilog,HDL,的语句包括赋值语句、条件语句、循环语句、结构说明语句和编译预处理语句等类型,每一类语句又包括几种不同的语句。在这些语句中,有些语句属于顺序执行语句,有些语句属于并行执行语句。,2.3.1,赋值语句,1.,门基元赋值语句,格式:,基本逻辑门关键字,(门输出,门输入,1,,门输入,2,,,,门输入,n,);,基本逻辑门关键字是,Verilog,HDL,预定义的逻辑门,包括,and,、,or,、,not,、,xor,、,nand,、,nor,等;圆括弧中内容是被描述门的输出和输入信号。,例如,具有,a,、,b,、,c,、,d,四个输入和,y,为输出与非门的门基元赋值语句为,nand,(,y,,,a,,,b,,,c,,,d,);,该语句与,y = ,(,a & b & c & d,),等效,2.,连续赋值语句,格式,assign,赋值变量,=,表达式;,例如,assigny = ,(,a & b & c & d,);,在执行中,输出,y,的变化跟随输入,a,、,b,、,c,、,d,的变化而变化,,反映了信息传送的连续性,。,【,例,2.4,】,4,输入端与非门的,Verilog,HDL,源程序。,moduleexample_4_4(y,a,b,c,d);,outputy;,inputa,b,c,d;,assign #1 y = (a,endmodule,#1,表示该门的输出与输入信号之间具有,1,个单位的时间延迟。,3.,过程赋值语句,过程赋值语句出现在,initial,和,always,块语句中,赋值符号是,“,=,”,,格式为,赋值变量,=,表达式;,在过程赋值语句中,赋值号,“,=,”,左边的赋值变量必须是,reg,(,寄存器)型变量,其值在该语句结束即可得到,。如果一个块语句中包含若干条过程赋值语句,那么这些过程赋值语句是按照语句编写的,顺序,由上至下一条一条地,执行,,前面的语句没有完成,后面的语句就不能执行,就象被阻塞了一样。因此,过程赋值语句也称为阻塞赋值语句。,4.,非阻塞赋值语句,非阻塞赋值语句也是出现在,initial,和,always,块语句中,赋值符号是“,=,”,,,格式为,赋值变量,=,表达式;,在非阻塞赋值语句中,赋值号,“,=,”,左边的赋值变量也必须是,reg,型变量,,,其值,不象在过程赋值语句那样,语句结束时即刻得到,而,在该块语句结束才可得到,。,【,例,2.5,】,上升沿触发的,D,触发器的的源程序。,moduleD_FF(q,d,clock);,inputd,clock;,outputq;,reg,q;,always(,posedge,clock),q = d;,endmodule,q,是触发器的输出,属于,reg,型变量;,d,和,clock,是输入,属于,wire,型变量(由隐含规则定义)。,2.3.2,条件语句,条件语句包含,if,语句和,case,语句,它们都是顺序语句,应放在,always,块中。,1. if,语句,完整的,Verilog,HDL,的,if,语句结构如下:,if (,表达式,) begin,语句,; end,else if (,表达式,) begin,语句,; end,else begin,语句,; end,【,例,2.6,】,8,线,-3,线优先编码器的设计,输入,输出,a0 a1 a2 a3 a4 a5 a6 a7,y0 y1 y2,x x x x x x x 0,1 1 1,x x x x x x 0 1,0 1 1,x x x x x 0 1 1,1 0 1,x x x x 0 1 1 1,0 0 1,x x x 0 1 1 1 1,1 1 0,x x 0 1 1 1 1 1,0 1 0,x 0 1 1 1 1 1 1,1 0 0,0 1 1 1 1 1 1 1,0 0 0,Verilog,HDL,源代码如下,moduleexample_2_6(y,a);,input 7:0a;,output 2:0y;,reg,2:0y;,always (,a),begin,if(a7)y=3b111;,else if(a6)y=3b110;,else if(a5)y=3b101;,else if(a4)y=3b100;,else if(a3)y=3b011;,else if(a2)y=3b010;,else if(a1)y=3b001;,else y,=3b000,;,end,endmodule,2. case,语句,case,语句是一种多分支的条件语句,完整的,case,语句的,格式,为,case (,表达式,),选择值,1 :,语句,1;,选择值,2 :,语句,2;,选择值,n :,语句,n;,default :,语句,n+1;,endcase,【,例,2.7,】,用,case,语句描述,4,选,1,数据选择器。,moduleexample_4_7(z,a,b,c,d,s1,s2);,inputs1,s2;,inputa,b,c,d;,outputz;,reg,z;,always (s1 or s2 or a or b or c or d),begin,a,b,c,d,s1,s2,数据,选择,器,z,case (s1,s2),2b00:z=a;,2b01:z=b;,2b10:z=c;,2b11:z=d;,default: z=a;,endcase,end,endmodule,case,语句还有两种变体语句形式,即,casez,和,casex,语句。,casez,和,casex,语句与,case,语句的格式完全相同,它们的区别是:在,casez,语句中,如果分支表达式某些位的值为高阻,z,,,那么对这些位的比较就不予以考虑,只关注其他位的比较结果。 在,casex,语句中,把不予以考虑的位扩展到未知,x,,,即不考虑值为高阻,z,和未知,x,的那些位,只关注其他位的比较结果。,2.3.3,循环语句,循环语句包含,for,语句、,repeat,语句、,while,语句和,forever,语句,4,种。,1. for,语句,for,语句的语法格式为,for (,循环指针,=,初值,;,循环指针,终值,;,循环指针,=,循环指针,+,步长值,),begin,语句,;,end,【,例,2.8,】,8,位奇偶校验器的描述。,moduleexample_2_8(a, out);,input,7:0a;,outputout;,reg,out;,integern;,always(a),begin,out = 0;,for (n = 0; n =b) max=a;,elsemax=b;,end,endfunction,函数调用的格式如下,函数名(关联参数表);,函数调用一般是出现在模块、任务或函数语句中。通过函数的调用来完成某些数据的运算或转换。,例如,调用例,2.9,编制的求最大值的函数,peak=max(data,,,peak),;,其中,,data,和,peak,是与函数定义的两个参数,a,、,b,关联的关联参数。通过函数的调用,求出,data,和,peak,中的最大值,并用函数名,max,返回。,2.4,不同抽象级别的,Verilog,HDL,模型,Verilog,HDL,是一种用于逻辑电路设计的硬件描述语言。用,Verilog,HDL,描述的电路称为该设计电路的,Verilog,HDL,模型。,Verilog,HDL,具有,行为描述,和,结构描述,功能。,行为描述,是对设计电路的逻辑功能的描述,并不用关心设计电路使用那些元件以及这些元件之间的连接关系。,行为描述属于,高层次,的描述方法,在,Verilog,HDL,中,行为描述包括,系统级,(,System Level,)、,算法级,(,Algorithm Level,),和,寄存器传输级,(,RTL,:,Register Transfer Level,)等,3,种抽象级别。,结构描述,是对设计电路的结构进行描述,即描述设计电路使用的元件及这些元件之间的连接关系。,结构描述属于,低层次,的描述方法,在,Verilog,HDL,,,结构描述包括,门级,(,Gate Level,),和,开关级,(,Switch Level,),2,种抽象级别。,在,Verilog,HDL,的学习中,应重点掌握高层次描述方法,但门级描述在一些电路设计中也有一定的实际意义。,2.4.1,Verilog,HDL,门级描述,用于,门级描述,关键字包括:,not,(,非门)、,and,(,与门)、,nand,(,与非门)、,or,(,或门)、,nor,(,或非门)、,xor,(,异或门)、,xnor,(,异或非门)、,buf,(,缓冲器)以及,bufif1,、,bufif0,、,notif1,、,notif0,等各种三态门。,门级描述语句格式为,门类型关键字,(端口列表);,其中,,“,例化门的名称,”,是用户定义的标识符,属于可选项;端口列表按:,(输出,输入,使能控制端),的顺序列出。,例如,nand,nand2(y,a,b);/2,输入端与非门,xor,myxor(y,a,b,);/,异或门,bufif0,mybuf(y,a,en,);/,低电平使能的三态缓冲器,【,例,4.11,】,采用结构描述方式描述下图所示的硬件电路,。,S2,S3,S1,moduleexample_2_11(out,a,b,c);,inputa,b,c;,outputout;,wires1,s2,s3;,not (s1,a);,nand,(s2,c,s1);,nand,(s3,a,b);,nand,(out,s2,s3);,endmodule,2.4.2,Verilog,HDL,的行为级描述,Verilog,HDL,的,行为级描述,是最能体现,EDA,风格的硬件描述方式,它既可以描述简单的逻辑门,也可以描述复杂的数字系统乃至微处理器;既可以描述组合逻辑电路,也可以描述时序逻辑电路。,【,例,4.12,】,3,线,-8,线译码器的设计。,moduleexample_2_12(a,b,c,y,en);,inputa,b,c,en;,output 7:0 y;,reg,7:0 y;,always (en or a or b or c),begin,if (en) y = 8b11111111;,else,begin,case(c,b,a),3b000:y=8b11111110;,3b001:y=8b11111101;,3b010:y=8b11111011;,3b011:y=8b11110111;,3b100:y=8b11101111;,3b101:y=8b11011111;,3b110:y=8b10111111;,3b111:,y=8b01111111,;,endcase,end,end,endmodule,【,例,2.13,】,8D,锁存器的设计。,moduleexample_2_13(d,q,en);,inputen;,input 7:0d;,output 7:0q;,reg,7:0 q;,always (en or d),begin,if (en) q = 8bzzzzzzzz;,else,q,= d,;,end,endmodule,【,例,2.14,】,异步清除十进制加法计数器的设计。,moduleexample_2_14(clr,clk,cnt,out);,input,clr,clk,;,output3:0out;,output,cnt,;,reg,3:0out;,reg,cnt,;,always (,posedge,clk,or,posedge,clr,),begin,if (,clr,),begin out=4b0000;,cnt,=0; end,else if (out=4b1001),begin out=4b0000;,cnt,=1; end,else,begin out=out+1;,cnt,=0;,end,end,endmodule,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!