第三讲 verilog的基本语法_第1页
第三讲 verilog的基本语法_第2页
第三讲 verilog的基本语法_第3页
第三讲 verilog的基本语法_第4页
第三讲 verilog的基本语法_第5页
已阅读5页,还剩214页未读 继续免费阅读

下载本文档

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

文档简介

.,第三章verilog的基本语法,天津大学电子科学与技术系史再峰shizaifeng,.,3.1数据类型及其常量及变量,天津大学电子科学与技术系史再峰shizaifeng,.,0、低、伪、逻辑低、地、VSS、负插入,1、高、真、逻辑高、电源、VDD、正插入,X、不确定:逻辑冲突无法确定其逻辑值,HiZ、高阻抗、三态、无驱动源,Verilog的四种逻辑值,x和X、z和Z不区别大小写。Z有时候也用?代替,.,数据类型,VerilogHDL中共有19种数据类型,分成常量和变量最基本最常用的4种:寄存器型reg线网型wire整形integer参数型parameter其余的包括:largemediumscalaredtimesmalltritriotri1triandtriortriregvectoredwandwor型,主要与基本单元库有关,设计时很少使用,.,一、常量,在程序运行中,其值不能被改变的量叫常量两类最基本的常量:数字型常量和参数(parameter)数字型常量:整型数可以按如下两种方式书写简单的十进制数格式基数格式,.,基数表示法(一),格式:位宽进制值无符号数。位宽是按照二进制数来计算的。进制可以为b或B(二进制)、o或O(八进制)、d或D(十进制)、h或H(十六进制)。值是基于进制的数字序列。如:3b001,3B110三位二进制6o12,6O12六位八进制4d9,4D9十位十进制8hBF,8HBF八位十六进制,.,基数表示法(二),基数格式计数形式的数通常为无符号数。这种形式的整型数的长度定义是可选的。如果没有定义一个整数型的长度,数的长度为相应值中定义的位数。下面是两个例子:o7219位八进制数hAF8位十六进制数,.,基数表示法(三),如果定义的长度比为常量指定的长度长,通常在左边填0补位。但是如果数最左边一位为x或z,就相应地用x或z在左边补位。例如:10b10左边添0占位,000000001010bx0 x1左边添x占位,xxxxxxx0 x1如果长度定义得更小,那么最左边的位相应地被截断。例如:3b1001_0011与3b011相等5H0FFF与5H1F相等?字符在数中可以代替值z在值z被解释为不分大小写的情况下提高可读性,.,下划线,下划线可以用来分割数的表达式以提高程序的可读性,但不能用在位宽和进制处,只能用于具体的数字之间比如16b1010_1011_11111_000/合法格式8b_0011_1011/非法格式,.,负数,一个数字可以被定义成负数,只要在位宽表达式前加一个减号-8d5/合法格式8d-5/非法格式,.,简单的十进制格式,这种形式的整数定义为带有一个可选的“+”(一元)或“”(一元)运算符的数字序列。这种形式的整数值代表一个有符号的数。负数使用补码形式表示。例如15相当于二进制01111-15相当于二进制10001,.,实数类型,实数可以用下列两种形式定义十进制记数法,例如:2.0;-0.1等科学记数法,例如:235.1e2等于23510.0234_12e2等于2341200.0实数小数通过四舍五入被隐式地转换为最相近的整数。例如:42.446,42.45转换为整数4292.5,92.699转换为整数935.62转换为整数626.22转换为整数6,.,常量的位数,,x(或z)在十六进制值中代表4位x(或z),在八进制中代表3位x(或z),在二进制中代表1位x(或z)当常量不说明位数时候默认是32位,每个字母用8位ASCII码来表示10=32d10=32b10101=32d1=32b1-1=-32d1=32hFFFF_FFFFBX=32BX=32BXXXXXXXXXX.“AB”=16B010000001_01000010A的ASCII值是85,B的值是86,.,字符串,字符串是双引号内的字符串列。一个字符可用八位二进制表示。如:“INTEGER”需要8*7位。例:reg8*14:1Message;Message=“INTERNALERROR”;,.,课堂练习,下列表达式的位模式是什么?写出其具体的二进制表示值7o44,Bx0,5bx110,hA0,10d2,hzF,.,参数,参数是一个常量。用parameter定义一个标识符来代表一个常量。参数经常用于定义时延和变量的宽度。格式:parameterparam1=const_expr1,param2=const_expr2,paramN=const_exprN;如:parameterDelay=1;parameterA=32,B=4b0001;parameterstring=“exec_command”;,.,参数的传递,参数值也可以在编译时被改变。改变参数值可以使用参数定义语句或通过在模块初始化语句中定义参数值当某个模块在另一个模块内被引用时,高层模块能够改变低层模块的参数值。模块参数值的改变可采用下述两种方式:参数定义语句(defparam);带参数值的模块引用。,.,defparam举例,moduleTOP(NewA,NewB,NewS,NewC);inputNewA,NewB;outputNewS,NewC;defparamHa1.XOR_DELAY=5,/实例Ha1中的参数XOR_DELAY。Ha1.AND_DELAY=2;/实例Ha1中参数的AND_DELAY。HAHa1(NewA,NewB,NewS,NewC);endmodule,moduleHA(A,B,S,C);inputA,B;outputS,C;parameterAND_DELAY=1,XOR_DELAY=2;assign#XOR_DELAYS=AB;assign#AND_DELAYC=AinputNewA,NewB;outputNewS,NewC;HA#(5,2)Ha1(NewA,NewB,NewS,NewC);/第1个值5赋给参数AND_DELAY,该参数在模块HA中说明。/第2个值2赋给参数XOR_DELAY,该参数在模块HA中说明。endmodule,.,课堂练习-参数传递,假定一个模块为BK,内部两个参数P1,P2;另外一个模块为HA,内部参数P3,P4其在TOP模块中实例化调用的名称分别为U1,U2请尝试在top模块中用两种不同的方法改变其参数值p1-p4分别为1,2,3,4,.,二、变量,在Verilog中有两大主要数据类型:线网类型(wire)、寄存器类型(reg)。线网类型包含下述不同种类的线网子类型。wire,tri用于连线的最常见的线网类型wor,trior线或wand,triand线与trireg此线网存储数值,用于电容节点的建模tri1,tri0用于线逻辑的建模,上拉或下拉驱动supply0,supply1supply0用于对“地”建模,supply1对电源建模,.,nets(网络连线),nets(网络连线):由模块或门驱动的连线。驱动端信号的改变会立刻传递到输出的连线上。例如:右图上,selb的改变,会自动地立刻影响或门的输出。,nets,.,Nets(线网型),例:wireBpW;assignBpW=Error,BpW电路图,.,Nets(网络连线,线网类型),简单的线网类型定义说明语句为:net_kindmsb:lsbnet1,net2,.netN;当一个线形有两个或多个驱动时,线网的有效值按如下表确定。,.,补充:CMOSNOR,A+B,A,B,A,B,A,B,.,补充:CMOSNAND,A,B,AB,A,B,A,B,.,Nets(网络连线),.,补充知识:连续赋制值语句,连续赋制语句用于把值赋给线网型变量(不能为寄存器型变量赋值)语句形式为:assignA=B连续赋值语句在什么时候执行呢?只要在右端表达式的操作数上有事件(事件为值的变化)发生时,表达式即被计算;如果结果值有变化,新结果就赋给左边的线网。,.,连续赋值的目标类型,标量线网向量线网向量的常数型位选择,如a1向量的常数型部分选择如:a3:1上述类型的任意的拼接运算结果,.,连续赋值语句举例,moduleFA_Df(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;assignSum=ABCin;assignCout=(Aendmodule,在本例中,有两个连续赋值语句。这些赋值语句是并发的,与其书写的顺序无关,.,数据流描述方式,例:worBpW;wandBpR;assignBpW=Error,BpW和BpR电路图,.,寄存器(register)类型变量,寄存器(register)类型变量register型变量能保持其值,直到它被赋于新的值。register型变量常用于行为建模,产生测试的激励信号。常用行为语句结构来给寄存器类型的变量赋值。,.,reg型,寄存器是数据存储单元的抽象reg型数据常用来表示always块内的指定信号,常代表触发器reg型数据用initial或者always块中指定信号reg型数据的缺省值是x。可以被赋正值或者负值。当它作为一个表达式中的操作数时候,作为无符号数。reg数据类型定义格式为regn-1:0数据名1,.;或者regn:1数据名1,.;,.,寄存器阵列,Verilog语言支持寄存器阵列的声明:integerNUMS7:0;/8个整型变量的寄存器阵列timet_vals3:0;/4个时间变量的寄存器阵列数据类型为reg的阵列常称为存储器(即memory):reg15:0MEM0:1023;/1Kx16位的存储器reg7:0PREPhfffe:hffff;/2x8位的存储器可以用参数来表示存储器的大小:parameterwordsize=16;parametermemsize=1024;regwordsize-1:0MEM3memsize-1:0;只能一次选择一个字,不允许对存储器变量值部分进行部分选择或位选择.如dram602:4是错误的,.,存储器memory型变量,存储器memory型用一个寄存器数组来对存储器建模。格式:regmsb:lsb存储器名upper1:lower1;如:reg3:0MyMem63:0;/64个四位寄存器组,.,其他类型变量,integer整数寄存器有符号数。主要用来高层次建模。如:integerA;/整形寄存器,32位integerB1023:0;/10位time时间类型寄存器如:timeCurrentTime;/CurrentTime存储一个时间值CurrentTime=$time;,.,输入端口(input)可以由寄存器(reg)或线网(wire)连接驱动,但它本身只能驱动网络连接。输出端口(output)可以由寄存器或线网连接驱动,但它本身只能驱动线网连接。输入/输出端口(inout)只可以由线网连接驱动,但它本身只能驱动线网连接。如果信号变量是在过程块(initial块或always块)中被赋值的,必须把它声明为寄存器类型变量,如何选择正确的数据类型?,.,moduletop;wirey;rega,b;DUTu1(y,a,b);initialbegina=0;b=0;#10a=1;.endendmodule,moduleDUT(Y,A,B_);outputY;inputA,B:wireY,A,B;and(Y,A,B);endmodule,举例说明数据类型的选择,.,在过程块(alwaysinitial)中对变量赋值时,忘了把它定义为寄存器类型(reg)或已把它定义为连接类型了(wire)把实例的输出连接出去时,把它定义为寄存器类型把模块的输入信号定义为寄存器类型。这是经常犯的三个错误!,选择数据类型时常犯的错误,.,3.2运算符及表达式,天津大学电子科学与技术系史再峰shizaifeng,.,3.2运算符(操作符)及表达式,VerilogHDL中的运算符可以分为下述类型:算术运算符关系运算符相等运算符逻辑运算符按位运算符缩减(归约)运算符移位运算符条件运算符连接和复制运算符,.,按所带操作数的个数分类,单目运算符(unaryoperator)带一个操作数,操作数在运算符的右边如clock双目运算符(binaryoperator)带两个操作数,操作数分别在运算符的两边如a|b三目运算符(ternaryoperator)带三个操作数,用三目运算符隔开,.,3.2.1算术运算符,算术运算符有:+(一元加和二元加)-(一元减和二元减)*(乘)/(除)%(取模)整数除法截断任何小数部分。例如:7/4结果为1取模运算符求出与第一个运算符符号相同的余数。7%4结果为3而-7%4结果为-3,.,课堂练习,以下表达式在verilogHDL中的值是多少?(结果用16位hex表示表示)5/3(-9)/6(-9)%611%(-5)12/(-7),答案是5/3=16h0001(-9)/6=16hFFFF(-9)%6=16hFFFD11%(-5)=16h000112/(-7)=16hFFFF,.,3.2.2按位运算符,按位运算符有:(一元非)B=b0100;那么:A|B结果为0110Aassignb=8hff;assignc_out=ac_out2结果是0000_0001,.,课堂练习,以下表达式在verilogHDL中的值是多少?(结果用8位表示)assignd_0=4b11018h0a;assignd_1=4b11018h0a;assignd_2=4b1z01|8h0a;assignd_3=4b1101,答案是#hexd_0is07#hexd_1isF8#binaryd_2is0000_1x11#hexd_3is01#hexd_4is00#hexd_5is01,.,3.2.4关系运算符,关系运算符有:(大于)=(不小于)45结果为假(0)52=b01110等价于:b01000=b01110结果为假(0),.,3.2.5相等关系运算符,相等关系运算符有:=(逻辑相等)!=(逻辑不等)=(全等)!=(非全等)如果比较结果为假,则结果为0;否则结果为1。在全等比较中,值x和z严格按位比较。,.,相等关系运算举例,Data=b11x0;Addr=b11x0;那么(Data=Addr)不定,值为x,但:Data=Addr为真,值为1。如果操作数的长度不相等,长度较小的操作数在左侧添0补位,例如:2b10=4b0010与下面的表达式相同:4b0010=4b0010结果为真(1)。,.,关系及相等关系运算符练习,判断以下表达式中的d值是多少assignd_relation1=(4b1011=4b10 x1);assignd_relation2=(4b1011=4b10 x1);assignd_relation3=(4b10 x1=4b10 x1);assignd_relation4=(4b10z1=4b10 x1);assignd_relation5=(4b10 x1!=4b10 x1);assignd_relation6=(4b10 x1!=4b10 x1);,答案是:#bind_relation1is1bx#bind_relation2is1bx#bind_relation3is1bx#bind_relation4is1b0#bind_relation5is1b0#bind_relation6is1bx,.,3.2.6缩减(归约)运算符,归约运算符在单一操作数的所有位上操作,并产生1位结果。归约运算符有:那么:Qreg2是8b0000_0001,.,3.2.8条件运算符,条件运算符根据条件表达式的值选择表达式,形式如下:cond_expr?expr1:expr2如果cond_expr为真(即值为1),选择expr1;如果cond_expr为假(值为0),选择expr2。如果cond_expr为x或z,结果将是按以下逻辑expr1和expr2按位操作的值:0与0得0,1与1得1,其余情况为x。,.,条件运算符举例,wire0:2Student=Marks18?GA:GC;计算表达式Marks18;如果真,GA赋值给Student;如果MarksB,B_GT_A=BA;等价于wireclear;assignclear=b1;不允许在同一个线网上出现多个线网说明赋值。如果多个赋值是必需的,则必须使用连续赋值语句。,.,隐式线网,如果在VerilogHDL模型中一个线网没有被特别说明,那么它被缺省声明为1位线网。但是default_nettype编译指令能够用于取代缺省线网类型.例:default_nettypewand/根据此编译指令,所有后续未说明的线网都是wand类型再例:default_nettypewiremoduleAND4to1(Z,D0,D1,D2,D3,S0);outputZ;inputD0,D1,D2,D3,S0;assignZ=S0?(D0endmodule,.,数据流建模课堂练习,.,数据流建模参考答案,moduleMSDFF_DF(D,C,Q,Qbar);inputD,C;outputQ,Qbar;/wireNotC,NotD,NotY,Y,D1,D2,Ybar,Y1,;Y2assignNotD=D;assignNotC=C;assignNotY=Y;assignD1=(Dendmodule,.,三、时延说明,assign#6Ask=Quiet|Late;规定右边表达式结果的计算到其赋给左边目标需经过6个时间单位时延。例如,如果在时刻5,Late值发生变化,则赋值的右端表达式被计算,并且Ask在时刻11(=5+6)被赋于新值,.,时延,VerilogHDL模型中的所有时延都根据时间单位定义使用编译指令将时间单位与物理时间相关联。这样的编译器指令需在模块描述前定义,如下所示:timescale1ns/100ps此语句说明时延时间单位为1ns并且时间精度为100ps(时间精度是指所有的时延必须被限定在0.1ns内)。如果此编译器指令所在的模块包含上面的连续赋值语句,#2代表2ns。如果没有这样的编译器指令,VerilogHDL模拟器会指定一个缺省时间单位。IEEEVerilogHDL标准中没有规定缺省时间单位。,.,为什么会有延时?,以下两个最基本的电路单元,.,CMOSNAND,A,B,AB,A,B,A,B,.,CMOSNOR,A,B,.,MOSFET的结构,.,MOS电容,.,静态CMOS的开关模型,A,Req,A,NAND2,INV,NOR2,.,关于时延探讨,如果右端在传输给左端之前变化,右端发生在时延间隔内的变化被滤掉。例如:assign#4Cab=Drm;这也同样适用于惯性时延行为:即右端值变化在能够传播到左端前必须至少保持时延间隔;如果在时延间隔内右端值变化,则前面的值不能传输到输出。,.,三类时延值,对于每个时延定义,总共能够指定三类时延值:上升时延下降时延关闭时延assign#(rise,fall,turn-off)LHS=RHS_expr;如果右端从非0向量变化到0向量,那么就使用下降时延。如果右端值到达z,那么使用下降时延;否则使用上升时延。assign#4Ask=Quiet|Late;/Onedelayvalue.assign#(4,8)Ask=Quick;/Twodelayvalues.assign#(4,8,6)Arb=/Nodelayvalue.,.,带时延的译码器建模,timescale1ns/1nsmoduleDecoder2x4(A,B,EN,Z);inputA,B,EN;output0:3Z;wireAbar,Bbar;assign#1Abar=A;assign#1Bbar=B;assign#2Z0=(Abarendmodule,.,结果波形,.,3.3.3线网时延,时延也可以在线网说明中定义,如:wire#5Arb;线网时延效果如图,线网时延,Text,assign时延,assign时延,驱动2,驱动2,驱动1,RHS表达式,RHS表达式,线网目标,.,线网时延举例,wire#5Arb;assign#2Arb=Bod因为定义了线网时延,实际对Arb的赋值发生在时刻17(=10+2+5)。,.,课后作业,数据流建模以下的奇偶发生器,.,3.4门级结构建模,天津大学电子科学与技术系史再峰shizaifeng,.,3.4门级结构建模,moduleaddbit(a,b,ci,sum,co);inputa,b,ci;outputsum,co;wirea,b,ci,sum,co,n1,n2,n3;xor(n1,a,b,);xor(sum,n1,ci);and(n2,a,b);and(n3,n1,ci);or(co,n2,n3);endmodule,由一些Verilog原型,列出结构化的元件并按网表连接,.,3.4.1内置的基本门,VerilogHDL为门级电路建模的能力.提供下列内置基本门:多输入门:and,nand,or,nor,xor,xnor多输出门:buf,not三态门:bufif0,bufif1,notif0,notif1上拉、下拉电阻:pullup,pulldownMOS开关:cmos,nmos,pmos,rcmos,rnmos,rpmos双向开关:tran,tranif0,tranif1,rtran,rtranif0,rtranif1,.,门级结构建模语法,语句形式gate_typeinstance_name(term1,term2,.,termN);注意,instance_name是可选的;gate_type为前面列出的某种门类型。各term用于表示与门的输入/输出端口相连的线网或寄存器.同一门类型的多个实例能够在一个结构形式中定义gate_typeinstance_name1(term1,term2,.,termN),instance_name2(term1,term2,.,termN),instance_name3(term1,term2,.,termN),instance_name4(term1,term2,.,termN);,.,3.4.2多输入门,内置的多输入门包括:andnandnororxorxnor这些逻辑门只有单个输出,1个或多个输入。门实例语句的语法如:multi_input_gate_typeinstance_name(OutputA,Input1,Input2,.,InputN);第一个端口是输出,其它端口是输入,多输入门,input1,input2,inputN,OutputA,.,多输入门语法举例,andA1(Out1,In1,In2);andRBX(Sty,Rib,Bro,Qit,Fi)x;xor(Bar,Bud0,Bud1,Bud2),(Car,Cut0,Cut1),(Sar,Sut2,Sut1,Sut0,Sut3);,.,多输入门的真值表(一),.,多输入门的真值表(二),.,多输入门的真值表(三),.,3.4.3多输出门,多输出门有:bufnot这些门都只有单个输入,一个或多个输出。多输出门的实例语句的基本语法如:multi_output_gate_typeinstance_name(Out1,Out2,.OutN,InputA);,.,多输出门语法举例,bufB1(Fan0,Fan1,Fan2,Fan3,Clk);notN1(PhA,PhB,Ready);,.,3.4.4三态门,三态门有:bufif0bufif1notif0notif1这些门用于对三态驱动器建模。这些门有一个输出、一个数据输入和一个控制输入。三态门实例语句的基本语法如下:tristate_gateinstance_name(OutputA,InputB,ControlC);第一个端口OutputA是输出端口,第二个端口InputB是数据输入,ControlC是控制输入。,inputA,outputA,ControlC,三态门,.,三态门的真值表,.,门级结构建模例题,.,moduleflop(data,clock,clear,q,qb);inputdata,clock,clear;outputq,qb;nand#10nd1(a,data,clock,clear),nd2(b,ndata,clock),nd4(d,c,b,clear),nd5(e,c,nclock),nd6(f,d,nclock),nd8(qb,q,f,clear);nand#9nd3(c,a,d),nd7(q,e,qb);not#10iv1(ndata,data),iv2(nclock,clock);endmodule,.,课堂练习,用verilog的内置基本门结构建模以下电路,.,参考答案,moduleParity_9_Bit(D,Even,Odd);input0:8D;outputEven,Odd;xorXE0(E0,D0,D1),XE1(E1,D2,D3),XE2(E2,D4,D5),XE3(E3,D6,D7),XF0(F0,E0,E1),XF1(F1,E2,E3),XH0(H0,F0,F1),XEVEN(Even,D8,H0);notXODD(Odd,Even);endmodule,.,3.4.5其他门级模型,其他门级模型包括上拉、下拉电阻:pullup,pulldownMOS开关:cmos,nmos,pmos,rcmos,rnmos,rpmos双向开关:tran,tranif0,tranif1,rtran,rtranif0,rtranif1,.,上拉、下拉电阻,pullup,pulldown,这类门设备没有输入只有输出。上拉电阻将输出置为1。下拉电阻将输出置为0。门实例的端口表只包含1个输出。例如:pullupPUP(SCL);此上拉电阻实例名为PUP,输出Pwr置为高电平1。,.,MOS开关,这类门用来为单向开关建模。即数据从输入流向输出,并且可以通过设置合适的控制输入关闭数据流。pmos(p类型MOS管)、nmos(n类型MOS管),rnmos(r代表电阻)和rpmos开关有一个输出、一个输入和一个控制输入,例如:rnmosRN1(ControlBit,ReadyBit,Hold);cmos(mos互补)和rcmos(cmos的高阻态版本)开关有一个数据输出,一个数据输入和两个控制输入。例如:(r)cmosinstance_name(OutputA,InputB,NControl,PControl);,.,rnmos、rpmos、驱动强度,rnmos和pmos在输入引线和输出引线之间存在高阻抗(电阻)。因此当数据从输入传输至输出时,对于rpmos和rmos,存在数据信号强度衰减。值1强度supply1strong1pull1weak1highz1值0强度supply0strong0pull0weak0highz0,.,双向开关,双向开关:tran,tranif0,tranif1,rtran,rtranif0,rtranif1开关是双向的,即数据可以双向流动,并且当数据在开关中传播时没有延时。后4个开关能够通过设置合适的控制信号来关闭。tran和rtran(tran的高阻态版本)开关不能被关闭。gate_typeinstance_name(SignalA,SignalB,ControlC);前两个端口是双向端口,即数据从SignalA流向SignalB,反之亦然。第三个端口是控制信号。根据开关例化的选择有控制信号或者没有控制信号。,.,3.4.6门的延时,可以使用门时延定义门从任何输入到其输出的信号传输时延。门时延可以在门自身实例语句中定义。带有时延定义的门实例语句的语法如下:gate_typedelayinstance_name(terminal_list);时延规定了门时延,即从门的任意输入到输出的传输时延。当没有强调门时延时,缺省的时延值为0。门时延由三类时延值组成:上升时延下降时延截止时延,.,门时延定义个数,门时延由三类时延值组成:上升时延,下降时延,截止时延门时延定义可以包含0个、1个、2个或3个时延值。,.,门时延举例,notN1(Qbar,Q);/门时延为0nand#6(Out,In1,In2);/所有时延均为6,即上升和下降时延都是6and#(3,5)(Out,In1,In2,In3);notif1#(2,8,6)(Dout,Din1,Din2);/上升时延为2,下降时延为8,截止时延为6,转换到x的时延是2、8和6中的最小值,即2。,门延迟也可采用min:type:max形式定义。最小值、典型值和最大值必须是常数表达式。例如:and#(2:3:4,5:6:7)(Pout,Pin1,Pin2);如要更精确定义门延时,可用specify语句定义从特定的输入到输出端的各种延时.,.,矢量线网用于门结构描述,当需要重复性的实例时,在实例描述语句中能够有选择地定义范围说明wire3:0Out,InA,InB;nandGang3:0(Out,InA,InB);实例化时自动以相同的标号对齐。等价于nandGang3(Out3,InA3,InB3),Gang2(Out2,InA2,InB2),Gang1(Out1,InA1,InB1),Gang0(Out0,InA0,InB0);,.,门级结构建模例题,timescale1ns/1nsmoduleDEC2X4(A,B,Enable,Z);inputA,B,Enable;output0:3Z;wireAbar,Bbar;not#(1,2)V0(Abar,A),V1(Bbar,B);nand#(4,3)N0(Z3,Enable,A,B),N1(Z0,Enable,Abar,Bbar),N2(Z1,Enable,Abar,B),N3(Z2,Enable,A,Bbar);endmodule,.,门级结构建模练习题,.,参考解答,timescale1ns/1nsmoduleGateCircuit(Data,Encode,Valid)input3:0Data;output1:0Encode,Valid;notG1(NotData2,Data2);andG2(A,NotData2,Data1);orG3(B,Data1,Data0),G4(Encode0,Data3,A),G5(Encode1,Data3,Data2),G6(Valid,Data3,Data2,B);endmodule,.,作业题,先画出完整门级电路图,然后用门级结构描述以下电路,并试分析其功能,M1-E,M2-D,.,M3-CLA,.,3.5行为建模,.,3.5行为建模,行为描述方式设计的行为功能使用下述过程语句结构描述:initial语句:此语句只执行一次。always语句:此语句总是循环执行,或者说此语句重复执行。只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原有值不变。所有的initial语句和always语句在0时刻并发执行。一个模块中可包含任意多个initial和always语句,.,过程性赋值(过程结构),过程性赋值是在initial语句或always语句内的赋值,它只能对寄存器数据类型的变量赋值。表达式的右端可以是任何表达式。.reg1:4Enable,A,B;.#5Enable=AB;.Enable为寄存器。根据时延控制,赋值语句被延迟5个时间单位执行。右端表达式被计算,并赋值给Enable过程性赋值分两类:阻塞性过程赋值、非阻塞性过程赋值,.,initial过程结构语句,initial语句只执行一次。initial语句在仿真开始时执行,即在0时刻开始执行。initial语句的语法如下:initialbegin.end顺序过程(begin.end)最常使用在进程语句中。,.,initial的时序控制,时序控制可以是时延控制,即等待一个确定的时间;或事件控制,即等待确定的事件发生或某一特定的条件为真。initial语句的各个进程语句仅执行一次。在模拟的0时刻开始执行。initial语句根据进程语句中出现的时间控制在以后的某个时间完成执行。Initial语句主要用于初始化和波形生成,.,initial语句举例,parameterAPPLY_DELAY=5;reg0:7port_A;.initialbeginPort_A=8h20;#APPLY_DELAYPort_A=8hF2;#APPLY_DELAYPort_A=8h41;#APPLY_DELAYPort_A=8h0A;end,.,initial语句举例,timescale1ns/100psmodulet_s2();rega;initialbegina=1;#5a=0;#8a=1;#10;a=0;#11a=1;endendmodule,.,Initial语句练习,modulestimulus;regx,y,a,b,m;initialm=1b0;initialbegin#5a=1b1;#25b=1b0;endinitialbegin#10 x=1b0;#25y=1b1;endinitial#50$finish;endmodule,时间被执行的叙述0m=1b0;5a=1b1;10 x=1b0;30b=1b0;35y=1b1;50$finish;,.,always语句,always语句重复执行例如:alwaysClk=Clk;/将无限循环。always语句的执行必须带有某种时序控制always#5Clk=Clk;/产生时钟周期为10的波形。,.,always语句举例,moduleDFF(Clk,D,Set,Q,Qbar);inputClk,D,Set;outputQ,Qbar;regQ,Qbar;alwayswait(Set=1)begin#3Q=1;#2Qbar=0;wait(Set=0);endalways(negedgeClk),beginif(Set!=1)begin#5Q=D;#1Qbar=Q;endendendmodule,.,always用法举例,modulelab1(a,b,c,sel,z);input7:0a,b,c;inputsel;output8:0z;always(aorborc)beginif(sel)z=a+b;elsez=a+c;endendmodule,.,两类语句在同一模块的使用,moduleTestXorBehavior;regSa,Sb,Zeus;initialbeginSa=0;Sb=0;#5Sb=1;#5Sa=1;#5Sb=0;endalways(SaorSb)Zeus=SaSb;endmodule,.,3.5.2行为建模中的时序控制,时序控制与过程语句关联。有2种时序控制形式:时延控制事件控制这两类时序控制形式只能用于initial或者always语句块之中,即只能用于行为建模,.,时延控制,时延控制定义为执行过程中首次遇到该语句与该语句的执行的时间间隔。时延控制表示在语句执行前的“等待时延”形式如:#2Tx=Rx-5;时延控制也可以用另一种形式定义:#5;这种形式指定了在下一条语句执行前等待给定的时延时延控制中的时延可以是任意表达式,不必限定为某一常量如果时延表达式的值为0,则称之为显式零时延。促发一个等待,等待所有其它在当前模拟时间被执行的事件执行完毕后,才将其唤醒;模拟时间不前进。,.,课堂练习,写出完整代码,生成如下波形。,生成一个周期为10的时钟信号,.,参考答案,timescale1ns/100psmodulet_s2();rega;regclk;initialbegina=0;clk=0;#10a=1;#10a=0;#20;a=1;#10a=0;#10a=1;#10a=0;#10a=1;end,alwaysbegin#5clk=clk;endendmodule,.,事件控制(消息控制),边沿触发事件控制格式为:事件声明例如(posedgeClock)带有事件控制的进程或过程语句的执行,须等到指定事件发生。上例中,如果Clock信号从低电平变为高电平(正沿),就执行赋值语句;否则进程被挂起,直到Clock信号产生下一个正跳边沿。posedge表示上升沿(正沿);nededge表示下降沿(负沿),.,正沿和负沿代表的意义,.,边沿触发事件控制举例,timeRiseEdge,OnDelay;.initialbegin/等待,直到在时钟上发生正边沿:(posedgeClockA);RiseEdge=$time;/等待,直到在时钟上发生负边沿:(negedgeClockA);OnDelay=$time-RiseEdge;$display(Theon-periodofclockis%t.D,elay);end,.,两个边沿触发事件控制举例,.always(posedgeclkornegedgereset)begind1=1b1;d222)Sum=0;wait(DataReady)Data=Bus;wait(Preset);,.,行为建模举例,moduleshifter(in,clock,reset,out);inputin,clock,reset;output7:0out;reg7:0out;always(posedgeclock)beginif(reset)out=8h00;,elsebeginout=out1;out0=in;endendendmodule,.,3.5.3语句块,语句块提供将两条或更多条语句组合成语法结构上相当于一条语句的机制。在VerilogHDL中有两类语句块,即:顺序语句块(begin.end):语句块中的语句按给定次序顺序执行。并行语句块(fork.join):语句块中的语句并行执行。语句块的标识符是可选的,如果有标识符,寄存器变量可在语句块内部声明。带标识符的语句块可被引用语句块标识符提供唯一标识寄存器的一种方式。但是,要注意所有的寄存器均是静态的,即它们的值在整个模拟运行中不变,.,顺序语句块,顺序语句块(beginwith)中的语句按顺序方式执行。每条语句中的时延值与其前面的语句执行的模拟时间相关。一旦顺序语句块执行结束,跟随顺序语句块过程的下一条语句继续执行。,begin:example_1#10stream=0;#2stream=1;#5stream=0;#3stream=1;#4stream=0;#2stream=1;#5stream=0;end,.,并行语句块,并行语句块带有定界符forkjoin,并行语句块中的各语句并行执行。并行语句块内的各条语句指定的时延值都与语句块开始执行的时间相关。当并行语句块中最后的动作执行完成时(最后的动作并不一定是最后的语句),顺序语句块的语句继续执行。并行语句块内的所有语句必须在控制转出语句块前完成执行。例如alwaysfork:my_test_parr.a=5;.join,.,并行语句块举例,/如果并行语句块在第10个时间单位开始执行fork#2stream=1;#7stream=0;#10stream=1;#14stream=0;#16stream=1;#21stream=0;join,.,混合使用顺序块和并行块,alwaysbegin:SEQ_A#4Dry=5;/S1fork:PAR_A/S2#6Cun=7;/P1begin:SEQ_B/P2EXE=Box;/S6#5Jap=Exe;/S7end#2Dop=3;/P3#4Gos=2;/P4#8Pas=4;/P5join,#8Bax=1;/S3#2Zoom=52;/S4#6$stop;/S5end,.,运行图示,.,课堂练习,initialbegin:come_ona=0;b=0#10;a=1;b=1;fork:parral#5a=0;#6b=0;#9b=1;join,#10a=1;#15a=0;b=0;begin#10b=1;#5a=1;endendalwaysbeginc=ab;end,.,混合建模RTL代码举例(1),/VerilogModuleNucleon_Digital_lib.Spike_Filter.arch_name/Created:/byArnoldShi/at-13:44:1707/01/2004/usingMentorGraphicsHDLDesigner(TM)2004.1(Build41)resetalltimescale1ns/10psmoduleSpike_Filter(IN_SPIKE,CLK,RESET,OUT_SPIKE,NEG_EDET,POS_EDET);,.,混合建模RTL代码举例(2),inputIN_SPIKE;inputCLK;inputRESET;outputOUT_SPIKE;outputNEG_EDET;outputPOS_EDET;wireIN_SPIKE;wireCLK;wireRESET;regOUT_SPIKE;wireNEG_EDET;wirePOS_EDET;/Spikerejectfilterregin_d0,in_d1,in_d2,in_d3;,.,混合建模RTL代码举例(3),always(negedgeRESETorposedgeCLK)if(RESET)beginin_d0=1b1;in_d1=1b1;in_d2=1b1;in_d3=1b1;endelsebeginin_d0=IN_SPIKE;in_d1=in_d0;in_d2=in_d1;in_d3=in_d2;end,.,混合建模RTL代码举例(4),assignPOS_EDET=in_d0endcaseendmodule,.,作业,用行为建模的方式描述一个十进制计数器,.,3.6过程性赋值语句,.,3.6过程性赋值,过程性赋值是仅仅在initial语句或always语句内的赋值,它只能对寄存器数据类型的变量赋值。表达式的右端可以是任何表达式。.reg1:4Enable,A,B;.#5Enable=AB;Enable为寄存器。

温馨提示

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

评论

0/150

提交评论