您好,欢迎访问三七文档
当前位置:首页 > 法律文献 > 理论/案例 > 96 Verilog语法规定及实例
VerilogHDL第九章硬件描述语言简介HDL的含义HardwareDescriptionLanguageVerilogHDL与其他HDL比较VerilogHDL—“告诉我你想要电路做什么,我给你提供能实现这个功能的硬件电路”VHDL—和VerilogHDL类似ABEL、AHDL—“告诉我你想要什么样的电路,我给你提供这样的电路”什么是VerilogHDL能够对数字逻辑电路的功能和结构进行描述的一种高级编程语言PLD/FPGA的设计开发语言编写程序描述数字电路的功能与结构描述电路的功能描述电路的结构表达具有并行性VerilogHDL特点符合C语言语法习惯简单,容易上手,缩短培训时间,如果有数字电子技术和C语言的基础,稍加学习即可编写能实现的电路。但也仅仅是语法上的相似而已并发执行,多条语句可能同时执行,在硬件上,实现不同功能的电路在同一时刻工作具有时序的概念,硬件电路输入到输出存在延迟。语法规则死,纠错仿真功能弱,错误信息不完整,较C语言更难发现错误VerilogHDL语言的描述风格VerilogHDL语言的描述风格,或者说描述方式,又可分为三类行为型描述指对行为与功能进行描述,它只描述行为特征,而没有涉及到用什么样的时序逻辑电路来实现,因此是一种使用高级语言的方法,具有很强的通用性和有效性。数据流型描述指通过assign连续赋值实现组合逻辑功能的描述。结构型描述指描述实体连接的结构方式,它通常通过实例进行描述,将Verilog已定义的基元实例嵌入到语言中。2选1数据选择器及仿真研究moduleMux21(a,b,s,y);//----------------inputa,b;inputs;outputy;assigny=(s==0)?a:b;//--------------endmodule//----------------1.assign语句2.表达式1?表达式2:表达式301y~0absy数据流描述moduleMux21(a,b,s,y);inputa,b;inputs;outputy;wired,e;//--------------1assignd=a&(~s);assigne=b&s;assigny=d|e;//--------------2endmodule&01xz00000101xxx0xxxz0xxx|01xz001xx11111xx1xxzx1xx^01xz001xx110xxxXxxxzXxxx~0110xxzx^~01xz010xx101xxxxxxxzxxxx行为级描述MUX的行为可以描述为:只要信号a或b或s发生变化,如果s为0则选择a输出;否则选择b输出。modulemux21(y,a,b,s);inputa,b,s;outputy;regy;always@(soraorb)if(!s)y=a;elsey=b;endmodule在行为级模型中,逻辑功能描述采用高级语言结构,如@,while,wait,if,case。absymux21Logicaloperators逻辑运算符&&(与)、||(或)、!(非)与逻辑优先级别高于或逻辑,但都低于关系和等式运算符。results——1(真)、0(假)andx(不确定值)。a=b&&c;b=a||c;ab-1&&b!=c||c!=d(ab-1)&&(b!=c)||(c!=d)if(!inword)if(inword==0)结构型描述结构级Verilog适合开发小规模元件,如ASIC和FPGA的单元Verilog内部带有描述基本逻辑功能的基本单元(primitive),如and门。综合产生的结果网表通常是结构级的。用户可以用结构级描述简单的组合或时序逻辑。下面是MUX的结构级描述,采用Verilog基本单元(门)描述。描述中含有传输延时。modulemux21(out,a,b,sl);inputa,b,sl;outputout;notu1(nsl,sl);and#1u2(sela,a,nsl);and#1u3(selb,b,sl);or#2u4(out,sela,selb);endmodule4选1数据选择器实例之一modulemux4_1(out,in0,in1,in2,in3,sel);outputout;inputin0,in1,in2,in3;input[1:0]sel;regout;always@(in0orin1orin2orin3orsel)case(sel)2'b00:out=in0;2'b01:out=in1;2'b10:out=in2;2'b11:out=in3;default:out=x;endcaseendmodulesel(1)sel(0)out00in001in110in211in3wire[7:0]bus;//8位矢量网表busreg[0:40]addr;//41位矢量寄存器addrreg[-1:4]b;//6位矢量寄存器bbus[0]//bus的第0位bus[2:0]//bus的三位最低有效位。注意不能用bus[0:2],应和定义中保持一致。addr[0:1]//addr的两位最高有效位数的表示方法整型常量decimal,hexadecimal,octalorbinaryformat.两种表达方法简单的十进制数.10,9,156.位宽(可选)'进制0-9andatof(hexadecimal)attention!必须在进制符号前加“'”号,并且“'”号和进制符号间不能存在空格进制符号:b或B(二进制),d或D(十进制),h或H(十六进制),o或O(八进制)659//Asigneddecimalnumber'h837FF//isahexadecimalnumber'b101//isa3-bitbinarynumber'o7460//isanoctalnumber4af//isillegal(hexadecimalformatrequires'h)数字与进制之间可以有空格5'D3数字电路中,x表示不定值,z表示高阻态。可在十六进制,八进制和二进制中使用x和z,十六进制中一个x表示有四位都是x,八进制中一个x表示三位都是x,二进制中则表示一位是x。z用法同理。unsizedconstants32bit10=32'd10=32'b10101=32'd1=32'b1当实际数据位数小于定义的位宽时,如果是无符号数,则在左边补零,如果无符号数最左边是“x”,则在左边补“x”,如果无符号数左边是“z”,则在左边补“z”12'h3x=12'h03x,12'hzx=12'hzzx在表示长数据时还可以用下划线“_”进行分割以增加程序的可读性,16‘b1001_0110_1111_zzzz//islegalsyntax8’b_1110_1101//isillegalsyntaxcase语句的语法结构case(表达式)选项值1:语句1;选项值2:语句2;选项值3:语句3;…default:缺省语句;endcaseSEL[1..0]DATA[3..0]OUTMUXMux0outin0in1in2in3sel[1..0]4选1数据选择器实例之二modulemux4_1(out,in0,in1,in2,in3,sel);outputout;inputin0,in1,in2,in3;input[1:0]sel;regout;always@(in0orin1orin2orin3orsel)beginif(sel==2'b00)out=in0;elseif(sel==2'b01)out=in1;elseif(sel==2'b10)out=in2;elseif(sel==2'b11)out=in3;elseout=2'bx;endendmoduleif(表达式1)语句1;elseif(表达式2)语句2;elseif…else语句n;if(a==0)if(b==0)c=1;elsec=0;begin语句1;语句2;......语句n;endif(a==0)beginif(b==0)C=1;endelsec=0;缺省项问题moduleex3reg(y,a,b,c);inputa,b,c;outputy;regy,rega;always@(aorborc)beginif(a&b)rega=c;else//有缺省项情况rega=0;y=rega;endendmodule010always0~0regayabcmoduleex4reg(y,a,b,c);inputa,b,c;outputy;regy,rega;always@(aorborc)beginif(a&b)rega=c;//缺省项省略y=rega;endendmoduleDENAPRECLRQalways0~0regayabcmoduleinccase(a,b,c,d,e);inputa,b,c,d;outpute;rege;always@(aorborcord)case({a,b})2’b11:e=d;2’b10:e=~c;endcaseendmodule4位加法器电路及仿真研究moduleadd_full(A,B,C,Carry,S);inputA,B,C;outputCarry,S;assignS=A^B^C;assignCarry=(A&B)|(B&C)|(A&C);endmodulemoduleadd_full4(A,B,C,S);input[3:0]A,B;output[3:0]S;output[4:0]C;assignC[0]=0;add_fullu1(A[0],B[0],C[0],C[1],S[0]),u2(A[1],B[1],C[1],C[2],S[1]),u3(A[2],B[2],C[2],C[3],S[2]),u4(A[3],B[3],C[3],C[4],S[3]);endmodule实例(Instances),例化(instantiation)设计中我们可能需要调用一些已经定义好的模块,作为我们电路中的单元,调用这些模块的过程,称为实例化(instantiation),调用完之后,这些电路中的模块单元称为实例(Instance)。实例的使用格式为:模块名实例名端口列表;模块的定义只是说明该模块的功能与接口,它只提供了一个模板,它要在电路中获得实际应用与实现需要被调用(实例化)。Verilog中不允许嵌套定义模块,即一对module和endmodule之间只能定义一个模块。但一个模块内可以通过实例的方式多次调用其他模块。add_fullu1(.A(A[0]),.B(B[0]),.C(C[0]),.Carry(C[1]),.S(S[0])),u2(.A(A[1]),.B(B[1]),.C(C[1]),.Carry(C[2]),.S(S[1])),u3(.A(A[2]),.B(B[2]),.C(C[2]),.Carry(C[3]),.S(S[2])),u4(.A(A[3]),.B(B[3]),.C(C[3]),.Carry(C[4]),.S(S[3]));moduledecode47(a,b,c,d,e,f,g,D3,D2,D1,D0);outputa,b,c,d,e,f,g;inputD3,D2,D1,D0;//输入4位BCD码rega,b,c,d,e,f,g;//输出驱动7个笔划段always@(D3orD2orD1orD0)begincase({D3,D2,D1,D0})//用case语句进行译码4'd0:{a,b,c,d,e,f,g}=7'b1111110;4'd1:{a,b,c,d,e,f,g}=7'b0110000;4'd2:{a,b,c,d,e,f,g}=7'b1101101;4'd3:{a,b,c,d,e,
本文标题:96 Verilog语法规定及实例
链接地址:https://www.777doc.com/doc-386894 .html