第2章 Verilog HDL门级建模_第1页
第2章 Verilog HDL门级建模_第2页
第2章 Verilog HDL门级建模_第3页
第2章 Verilog HDL门级建模_第4页
第2章 Verilog HDL门级建模_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

第2章VerilogHDL门级建模VerilogHDL数字系统设计及仿真本章内容门级范例基本语法MOS开关UDP层次化设计2门级范例——四选一选择器电路图3模块代码moduleMUX4x1(Y,A,B,C,D,S1,S0,En_);outputY;inputA,B,C,D;inputS1,S0;inputEn_;not(S1n,S1);not(S0n,S0);not(S1nn,S1n);not(S0nn,S0n);not(En_n,En_);and(and1,En_n,S1n,S0n,A);and(and2,En_n,S1n,S0nn,B);and(and3,En_n,S1nn,S0n,C);and(and4,En_n,S1nn,S0nn,D);or(Y,and1,and2,and3,and4);endmodule

门级语句4等价代码moduleMUX4x1(Y,A,B,C,D,S1,S0,En_);outputY;inputA,B,C,D;inputS1,S0;inputEn_;not(S1n,S1),(S0n,S0),(S1nn,S1n),(S0nn,S0n),(En_n,En_);and(and1,En_n,S1n,S0n,A),(and2,En_n,S1n,S0nn,B),(and3,En_n,S1nn,S0n,C),(and4,En_n,S1nn,S0nn,D);or(Y,and1,and2,and3,and4);endmodule

5门级建模结构模块定义端口声明内部连线声明门级调用6模块定义语法要求

module模块名(端口名1,端口名2……);

……

endmodule

例如:

moduleMUX4x1(Y,A,B,C,D,S1,S0,En_);moduleabc(a,b,c);

moduleadder(a,b,cin,sum,cout);

moduletest;标识符,自己定义端口列表,只写名称7标识符的要求标识符由字母、数字、下划线(_)和美元符($)组成。标识符是区分大小写的。标识符的第一个字符必须是字母或下划线,不能以数字或美元符开始。还有一些VerilogHDL基本语法中使用到的关键字作为保留字,不能作为标识符使用,例如module8端口声明端口列表仅仅是列出了本模块具有哪些端口,但这些端口是输入还是输出并没有定义,这就需要在模块中声明outputY;inputA,B,C,D;inputS1,S0;inputEn_;9语法形式:端口类型[端口位宽左界:端口位宽右界]端口名;端口类型输入—input

输出—output

双向—inout

宽度input[2:0]cin;output[0:4]cout;inout[4:7]fast;cin[2]、cin[1]、cin[0]cout[0]、cout[1]、cout[2]、cout[3]、cout[4]fast[4]、fast[5]、fast[6]、fast[7]10定义一个2位宽度的输入信号a

建议形式input[1:0]a;input[0:1]a;input[3:4]a;input[2:1]a;☜端口类型[端口宽度-1:0]端口名;11端口连接规则输入输出必须遵循12门级调用语法形式逻辑门类型<实例名称(可选)>(端口连接);

例如not(S0nn,S0n);not(En_n,En_);and(and1,En_n,S1n,S0n,A);and(and2,En_n,S1n,S0nn,B);and(and3,En_n,S1nn,S0n,C);13基本逻辑门单输入逻辑门:缓冲器buf和非门not

buf

实例名称(out1,out2,…,outn,in);

not实例名称(out1,out2,…,outn,in);

例:notn2(out1,out2,in);门级调用也称为实例化顺序一致!notn1(out1,in);实例名称可以没有,但仿真器编译器时会自动分配14多输入逻辑门:与门and、与非门nand

或门or、或非门nor

异或门xor和同或门xnor

范例anda1(out1,in1,in2,in3);or(out1,in1,in2);xorx1(out1,in1,in2);nandn[3:0](Y,A,B);nandn3(Y3,A3,B3);nandn2(Y2,A2,B2);nandn1(Y1,A1,B1);nandn0(Y0,A0,B0);15三态门

bufif1、bufif0、notif1和notif0语法三态门类型实例名称(输出信号,输入信号,控制信号);范例bufif1b1(Y,A,ctrl);bufif0b2(Y,A,ctrl);notif1n1(Y,A,ctrl);notif0n2(Y,A,ctrl);16模块实例化语法形式模块名称实例名称(端口连接);两种连接方式按顺序连接按名称连接

17按顺序连接欲调用此模块moduleMUX4x1(Y,A,B,C,D,S1,S0,En_);outputY;inputA,B,C,D;inputS1,S0;inputEn_;……//模块功能部分//省略endmodule

moduleTest;reg

a,b,c,d,en_;//连接输入端regs1,s0;wirey;//连接输出端……MUX4x1mymux(y,a,b,c,d,s1,s0,en_);endmodule顺序一致!18实例化过程19按名称连接语法形式

.原模块中端口名称(新模块中连接信号名称)范例moduleTest;reg

a,b,c,d,e,f,g;wirey;……MUX4x1mymux(.Y(y),.A(a),.B(b),.C(c),.D(d),.En_(e),.S1(f),.S0(g));endmodule20如果有端口悬空MUX4x1mymux(y,a,b,c,d,s1,,en_);//两个逗号间表示没有连接的端口MUX4x1mymux(.Y(y),.A(a),.B(b),.C(c),.D(d),.En_(e));//没有出现的端口就没有连接

21内部连线声明语法形式

wire[线宽-1:0]线名称;范例

wirea;//定义一位线网awire[3:0]b;//定义四位线网b

未声明而直接使用时,默认为1位宽22MOS开关抽象程度更低

nmos

实例名(out,data,ctrl);

pmos

实例名(out,data,ctrl);源极(逻辑1)和地极(逻辑0)

supply1vdd;

supply0gnd;23非门modulemynot(Y,A);outputY;inputA;supply1vdd;supply0gnd;nmosn1(Y,vdd,A);pmosp1(Y,gnd,A);endmodule24与非门modulemynand(Y,A,B);outputY;inputA,B;wires;supply1vdd;supply0gnd;pmosn1(Y,vdd,A);pmosn2(Y,vdd,B);nmosp1(Y,s,A);nmosp2(s,gnd,B);endmodule25测试模块moduleTest;rega,b;wirey;mynandnand1(y,a,b);initialbegina<=0;b<=0;#10a<=0;b<=1;#10a<=1;b<=0;#10a<=1;b<=1;endendmodule26用户自定义原语UDPand、or、not等逻辑门是VerilogHDL自带的内建语法,对这些门的描述是以原语的形式在VerilogHDL中定义的,即VerilogHDL的内置原语。在实际设计中,设计者有时需要使用自己编写的原语,VerilogHDL也支持这种语法,这种原语就是用户自定义原语(User-DefinedPrimitive,UDP)。27UDP基本结构primitiveUDP名称(输出端口,输入端口1,……,输入端口n);output输出端口名;input输入端口名;reg

寄存器名;initial//初始化寄存器,这两行在时序UDP中使用table……//状态表信息endtableendprimitive28UDP基本规则1.UDP只能有一个1位的输出端口,输出端口必须在端口列表的第一个位置。不允许有多个输出端口或多位输出端口。如下声明均是违法的:

outputa,b;//多个输出违法

output[1:0]c;//多位输出违法2.UDP可以有多个输入端口,但每个输入端口仅能有1位信号。

input[3:0]d;//违法

inputd3,d2,d1,d0;//合法3.输出端口声明为output,输入端口声明为input29UDP基本规则4.时序电路的UDP需要保存状态,所以时序电路UDP的输出端口要声明为reg类型。5.时序电路的UDP中初始状态可以使用initial语句初始化,该语句可选。6.UDP与module同级别,所以模块内部不能定义UDP,但可以在模块内调用已定义的UDP,语法与门级调用完全相同。7.UDP的状态表项可以处理0、1、x值,不能处理z值。本身UDP不能输出z值,输入给UDP的z值会被当做x值来处理。8.UDP中不能使用inout端口。30组合电路UDP二输入与非门primitivenand_udp(Y,A,B);outputY;inputA,B;Table//AB:Y

00:1;01:1;10:1;11:0;endtableendprimitive//输入信号1输入信号2……输入信号n:输出信号;31注意事项1.输入信号的顺序一定要和UDP中端口列表中的输入信号顺序相同!2.输入和输出之间以冒号“:”隔开,每一行结束处以分号“;”结束。3.状态表中要包含所有有确定输出的输入情况,即最好做到每种可以得到确定输出值的输入都有对应的列表行与之相对应。32完整的二输入与非门UDPprimitivenand_udp(Y,A,B);outputY;inputA,B;table//AB:Y00:1;01:1;10:1;11:0;x0:1;0x:1;xx:x;endtableendprimitive这一行状态表的作用与不写一样,所以此行可以省略33引入无关项?primitivenand_udp(Y,A,B);outputY;inputA,B;table//AB:Y0?:1;?0:1;11:0;endtableendprimitive34四选一选择器的UDPprimitiveMUX4x1_udp(Y,A,B,C,D,S1,S0,En_);outputYinputA,B,C,D,S1,S0,En_;table//ABCDS1S0En_:Y??????1:0;0???000:0;1???000:1;?0??010:0;?1??010:1;??0?100:0;??1?100:1;???0110:0;???1110:1;endtable

endprimitive35UDP的实例化与门级一样moduleTest;reg

a,b,c,d,en_;regs1,s0;wirey;……//按顺序连接MUX4x1_udpmux_udp1(y,a,b,c,d,s1,s0,en_);//按名称连接,与门级建模完全一致MUX4x1_udpmux_udp2(.Y(y),.A(a),.B(b),.C(c),.D(d),.S1(s1),.S0(s0),.En_(en_));endmodule36时序电路UDP时序电路UDP的输出值必须声明为reg类型。时序电路UDP的输出可以使用initial语句进行初始化。状态表项格式为“输入信号:当前输出:下一个输出”。状态表的输入信号可以是电平值,也可以是边沿信号。要列出所有可能的变化,防止工作中突然出现x值。37电平敏感的D锁存器primitivelatch_udp(q,d,clock);outputq;inputd,clock;regq;initialq=0;table//dclock:q:q*?0:?:-;01:?:0;11:?:1;endtableendprimitive

38使用(xx)来表示信号的变化primitivedff_udp(q,d,clock);outputq;inputd,clock;regq;//输出也可以不指定初始值table//dclock:q:q*0(01):?:0;//第一行,正常输出

1(01):?:1;//第二行,正常输出

?(1?):?:-;//第三行,屏蔽下降沿

?(x0):?:-;//第四行,屏蔽下降沿

(??)?:?:-;//第五行,屏蔽clock非边沿时dendtableendprimitive39缩写项缩

式含

义解

释?0,1,x不能用于输出部分b0,1不能用于输出部分维持原值不变只能用在时序UDP的输出部分r(01)信号的上升沿f(10)信号的下降沿p(01),(0x)或(x1)可能是信号的上升沿n(10),(1x)或(x0)可能是信号的下降沿*(??)信号值的任意变化40缩写后的D触发器primitivedff_udp(q,d,clock);outputq;inputd,clock;regq;table//dclock:q:q*1r:?:1;0r:?:0;?n:?:-;?(0x):?:-;?(x1):?:-;*?:?:-;endtableendprimitive41层次化设计Top-Down流程42四位全加器的门级建模原理图四个一位全加器的拼接43一位全加器modulefulladd(S,Cout,Cin,A,B);outputS,Cout;inputCin,A,B;wireand1,and2,and3,and4;xor(S,Cin,A,B);and(and1,Cin,A);and(and2,A,B);and(and3,Cin,B);or(Cout,and1,and2,and3);endmodule

44整体模块moduleadd4(S3,S2,S1,S0,COUT,CIN,X3,X2,X1,X0,Y3,Y2,Y1,Y0);outputCOUT,S3,S2,S1,S0;inputCIN,X3,X2,X1,X0,Y3,Y2,Y1,Y0;wirec0,c1,c2;fulladdadd0(.S(S0),.Cout(c0),.Cin(CIN),.A(X0),.B(Y0));fulladdadd1(.S(S1),.Cout(c1),.Cin(c0),.A(X1),.B(Y1));fulladdadd2(.S(S2),.Cout(c2),.Cin(c1),.A(X2),.B(Y2));fulladdadd3(.S(S3),.Cout(COUT),.Cin(c2),.A(X3),.B(Y3));endmodule45合并线网后moduleadd4(S,COUT,CIN,X,Y);//四位全加器outputCOUT;output[3:0]S;inputCIN;input[3:0]X,Y;wirec0,c1,c2;fulladdadd0(.S(S[0]),.Cout(c0),.Cin(CIN),.A(X[0]),.B(Y[0]));fulladdadd1(.S(S[1]),.Cout(c1),.Cin(c0),.A(X[1]),.B(Y[1]));fulladdadd2(.S(S[2]),.Cout(c2),.Cin(c1),.A(X[2]),.B(Y[2]));fulladdadd3(.S(S[3]),.Cout(COUT),.Cin(c2),.A(X[3]),.B(Y[3]));endmodule46测试模块moduletadd4;reg[3:0]x,y;reg

cin;wire[3:0]s;wirecout;add4myadd4(.S(s),.COUT(cout),.CIN(cin),.X(x),.Y(y));initial//此段代码用于生成输入的数据begin

cin<=0;x<=11;y<=2;#10cin<=0;x<=9;y<=6;#10cin<=0;x<=9;y<=7;#10cin<=1;x<=11;y<=2;#10cin<=1;x<=9;y<=6;#10cin<=1;x<=9;y<=7;#10$stop;endendmodule47层次化调用以.隔开层次tadd4.stadd4.myadd4tadd4.myadd4.c0tadd4.myadd4.add0tadd4.myadd4.add0.and1482-4译码器的门级建模电路图49moduleDEC2x4(Z,A,B,Enable);output[3:0]Z;inputA,B,Enable;wireAbar,Bbar;notnot0(A

温馨提示

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

评论

0/150

提交评论