96 Verilog语法规定及实例_第1页
96 Verilog语法规定及实例_第2页
96 Verilog语法规定及实例_第3页
96 Verilog语法规定及实例_第4页
96 Verilog语法规定及实例_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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:表达式3数据流描述moduleMux21(a,b,s,y);

inputa,b;

inputs;

outputy;

wired,e; //--------------1

assignd=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。Logicaloperators逻辑运算符

&&(与)、||(或)、!(非)与逻辑优先级别高于或逻辑,但都低于关系和等式运算符。results——1(真)、0(假)andx(不确定值)。a=b&&c;b=a||c;a<b-1&&b!=c||c!=d(a<b-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:

缺省语句;endcase4选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;else

if(sel==2'b01)out=in1;else

if(sel==2'b10)out=in2;else

if(sel==2'b11)out=in3;elseout=2'bx;endendmodule

if(表达式1)

语句1;elseif(表达式2)

语句2;elseif…else

语句n;if(a==0) if(b==0) c=1; else c=0;

begin语句1;语句2;......语句n;endif(a==0) begin if(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;

endendmodulemoduleex4reg(y,a,b,c);inputa,b,c;outputy;regy,rega;

always

@(aorborc)begin

if(a&b)rega=c; //缺省项省略

y=rega;

endendmodule

moduleinccase(a,b,c,d,e);inputa,b,c,d;outpute;rege;always@(aorborcord)

case({a,b})2’b11:e=d;

2’b10:e=~c;

endcaseendmodule

4位加法器电路及仿真研究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,f,g}=7'b1111001;4'd4:{a,b,c,d,e,f,g}=7'b0110011;4'd5:{a,b,c,d,e,f,g}=7'b1011011;4'd6:{a,b,c,d,e,f,g}=7'b1011111;4'd7:{a,b,c,d,e,f,g}=7'b1110000;4'd8:{a,b,c,d,e,f,g}=7'b1111111;4'd9:{a,b,c,d,e,f,g}=7'b1111011;default:{a,b,c,d,e,f,g}=7'bz;endcaseendendmodule

七段数码管译码器及仿真研究D触发器及仿真研究例9.6.10

moduled_ff(q,d,clk); outputq;inputd,clk;regq; always

@(posedgeclk) q=d; endmoduleFrom\to01xz0noposedgeposedgeposedge1negedgeNonegedgenegedgexnegedgeposedgenoNoznegedgeposedgenoNomoduled_ff(q1,q2,d,clk); outputq1,q2;inputd,clk;regq1,q2; always

@(posedgeclk) begin

q1=d;q2=q1;

end

endmodule

例9.6.12

moduled_ff(q1,q2,d,clk); outputq1,q2;inputd,clk;regq1,q2; always@(posedgeclk)

begin

q1<=d;//-----------------------------------1

q2<=q1;//---------------------------2

endendmodule

计数器及仿真研究例9.6.13

4位加法计数器

modulecount4(out,reset,clk);output[3:0]out;inputreset,clk;reg[3:0]out;always@(posedgeclk)beginif(reset)out<=0;//同步复位elseout<=out+1;//计数endendmodule

同步置数同步清零加法计数器

modulecount(out,data,load,reset,clk);output[7:0]out;input[7:0]data;inputload,clk,reset;reg[7:0]out;always@(posedgeclk) //clk上升沿触发beginif(!reset)out=8'h00;//同步清0,低电平有效elseif(!load)out=data; //同步预置elseout=out+1; //计数endendmodule

异步清零计数器modulecount2(out,reset,clk);output[7:0]out;inputclk,reset;reg[7:0]out;always

@(posedgeclkor

negedgereset)beginif(!reset)out=0;elseout=out+1; //计数endendmodule环扭型计数器态序Q3Q2

Q1Q0F态序Q3Q2Q1Q0F000001000101110001110010211001201001311101310101411110411010501110501101600110610110700010701010modulejohnson(clk,clr,out);inputclk,clr;output[3:0]out;reg[3:0]out;always@(posedgeclk)beginif(clr)out<=4'h0;elsebeginout<=(out>>1);//右移运算out[3]<=~out[0];endendmoduleout<=(out>>1)

a>>n

或a<<n

a代表要进行移位的操作数,n代表要移几位。这两种移位运算都用0来填补移出的空位。例如:start=1;//start在初始时刻设为值0001result=(start<<2);//移位后,start的值为0100,然后赋给resultmodulejohnson(clk,clr,out);inputclk,clr;output[3:0]out;reg[3:0]out;always@(posedgeclkornegedgeclr)beginif(!clr)out<=4'h0;elsebeginout<=(out>>1);//右移运算out[3]<=~out[0];endendendmodule

modulelfsr4_1(clk,Q);inputclk;output[3:0]Q;wire[3:0]Q;wirenQ0;assignnQ0=~Q[0];DFFDFF_0(.CLK(clk),.Q(Q[0]),.D(Q[1]));DFFDFF_1(.CLK(clk),.Q(Q[1]),.D(Q[2]));DFFDFF_2(.CLK(clk),.Q(Q[2]),.D(Q[3]));DFFDFF_3(.CLK(clk),.Q(Q[3]),.D(nQ0));endmodule

有限状态机及其仿真研究控制电路的核心部分采用always和case语句.状态保存在寄存器中,根据寄存器不同的值(状态)执行不同的操作,case语句用于选择不同的状态和对应各种状态的输出逻辑。FSM是在时钟沿的同步控制作用下从一个状态转换成另一个状态。采用寄存器型变量(avariableofregdatatype)赋值。设计一个自动售货机的逻辑电路。它的投币口每次只能投入一枚五角或一元的硬币。投入一元五角钱硬币后机器自动给出一枚饮料;投入两元(两枚一元)硬币后,在给出饮料的同时找回一枚五角的硬币。逻辑抽象一元五角售出一瓶饮料找钱one_dollarhalf_dollardispense

half_out状态idle:未投币前初始状态状态half:投入五角状态one:投入一元(一元或两五角)一元五角售出一瓶饮料找钱one_dollarhalf_dollardispense

half_outAB/YZmodulemachine(one_dollar,half_dollar,collect,half_out,dispense,reset,clk);parameteridle=2'b00,half=2'b01,one=2'b10;inputone_dollar,half_dollar,reset,clk;outputcollect,half_out,dispense;regcollect,half_out,dispense;reg[2:0]state;always@(posedgeclk)begin

if(reset)begindispense=0;collect=0;half_out=0;state=idle;end

一元五角售出一瓶

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论