上节回顾块语句语句块提供将两条或更多条语句组合成语法结构上相当于一条语句的机制。在VerilogHDL中有两类语句块,即:顺序语句块(begin...end):语句块中的语句按给定次序顺序执行。并行语句块(fork...join):语句块中的语句并行执行。语句块的标识符是可选的,如果有标识符,寄存器变量可在语句块内部声明。带标识符的语句块可被引用编译预处理Verilog-HDL语言中有几种特殊命令,编译系统先对这些特殊命令进行“预处理”,然后将预处理的结果和源程序一起进行通常的编译处理。这些预处理命令:以重音符号ˋ开头行末尾不加分号常用预处理命令:`include/`define,`undef/`timescale/`ifdef,`else,`endif/`default_nettype`resetall/`unconnected_drive,`nounconnected_drive`celldefine,`endcelldefine1)编写一模块test1,生成如下波形0102040506070802)编写一模块test2,生成一个周期为20的时钟信号VerilogHDL的描述方式结构描述12行为描述3混合描述4数据流描述一、结构描述在Verilog程序中可通过如下方式描述电路的结构◆调用Verilog内置门元件(门级结构描述)◆调用开关级元件(晶体管级结构描述)◆用户自定义元件UDP(也在门级)1、门级结构描述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原型列出结构化的元件并按网表连接n1sumcon3n2ciba1.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_type[instance_name](term1,term2,...,termN);注意,instance_name是可选的;gate_type为前面列出的某种门类型。各term用于表示与门的输入/输出端口相连的线网或寄存器.同一门类型的多个实例能够在一个结构形式中定义gate_type[instance_name1](term1,term2,...,termN),[instance_name2](term1,term2,...,termN),[instance_name3](term1,term2,...,termN),[instance_name4](term1,term2,...,termN);1.2多输入门内置的多输入门包括:andnandnororxorxnor这些逻辑门只有单个输出,1个或多个输入。门实例语句的语法如:multi_input_gate_type[instance_name](OutputA,Input1,Input2,...,InputN);第一个端口是输出,其它端口是输入input1多输入门input2inputNOutputA多输入门语法举例andA1(Out1,In1,In2);andRBX(Sty,Rib,Bro,Qit,Fix);xor(Bar,Bud[0],Bud[1],Bud[2]),(Car,Cut[0],Cut[1]),(Sar,Sut[2],Sut[1],Sut[0],Sut[3]);多输入门的真值表(一)nand01XZ01111110XXX1XXXZ1XXXand01XZ00000101XXX0XXXZ0XXX多输入门的真值表(二)nor01XZ010XX10000XX0XXZX0XXor01XZ001XX11111XX1XXZX1XX多输入门的真值表(三)xnor01XZ010XX101XXXXXXXZXXXXxor01XZ001XX110XXXXXXXZXXXX1.3多输出门多输出门有:bufnot这些门都只有单个输入,一个或多个输出。多输出门的实例语句的基本语法如:multi_output_gate_type[instance_name](Out1,Out2,...OutN,InputA);多输出门output1output2outputNInputA多输出门语法举例bufB1(Fan[0],Fan[1],Fan[2],Fan[3],Clk);notN1(PhA,PhB,Ready);真值表01XZbuf01XXnot10XX1.4三态门三态门有:bufif0bufif1notif0notif1这些门用于对三态驱动器建模。这些门有一个输出、一个数据输入和一个控制输入。三态门实例语句的基本语法如下:tristate_gate[instance_name](OutputA,InputB,ControlC);第一个端口OutputA是输出端口,第二个端口InputB是数据输入,ControlC是控制输入。inputAoutputAControlC三态门三态门的真值表bufif0控制信号01XZ数据输入00Z0/z0/z11Z1/z1/zXXZXxZXZXxbufif1控制信号01XZ数据输入0Z00/z0/z1Z11/z1/zXZXXxZZXXxnotif0控制信号01XZ数据输入01Z1/z1/z10Z0/z0/zXXZXxZXZXxnotif1控制信号01XZ数据输入0Z11/z1/z1Z00/z0/zXZXXxZZXXx门级结构建模例题enclockfclearclockdataqbqabnd1nd3nd5nd7nd2nd4nd6nd8iv1iv2dcmoduleflop(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);endmoduleenclockfclearclockdataqbqabnd1nd3nd5nd7nd2nd4nd6nd8iv1iv2dc课堂练习用verilog的内置基本门结构建模以下电路参考答案moduleParity_9_Bit(D,Even,Odd);input[0:8]D;outputEven,Odd;xorXE0(E0,D[0],D[1]),XE1(E1,D[2],D[3]),XE2(E2,D[4],D[5]),XE3(E3,D[6],D[7]),XF0(F0,E0,E1),XF1(F1,E2,E3),XH0(H0,F0,F1),XEVEN(Even,D[8],H0);notXODD(Odd,Even);endmodule门级描述的特点:1.一个逻辑网络是由许多逻辑门和开关所组成,因此用逻辑门的模型来描述逻辑网络是最直观的。2.不易得出模块逻辑功能。1.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)cmos[instance_name](OutputA,InputB,NControl,PControl);rnmos、rpmos、驱动强度rnmos和rpmos在输入引线和输出引线之间存在高阻抗(电阻)。因此当数据从输入传输至输出时,对于rpmos和rnmos,存在数据信号强度衰减。值1强度supply1strong1pull1weak1highz1值0强度supply0strong0pull0weak0highz0双向开关双向开关:tran,tranif0,tranif1,rtran,rtranif0,rtranif1开关是双向的,即数据可以双向流动,并且当数据在开关中传播时没有延时。后4个开关能够通过设置合适的控制信号来关闭。tran和rtran(tran的高阻态版本)开关不能被关闭。gate_type[instance_name](SignalA,SignalB,ControlC);前两个端口是双向端口,即数据从SignalA流向SignalB,反之亦然。第三个端口是控制信号。根据开关例化的选择有控制信号或者没有控制信号。1.6门的延时可以使用门时延定义门从任何输入到其输出的信号传输时延。门时延可以在门自身实例语句中定义。带有时延定义的门实例语句的语法如下:gate_type[delay][instance_name](terminal_list);时延规定了门时延,即从门的任意输入到输出的传输时延。当没有强调门时延时,缺省的时延值为0。门时延由三类时延值组成:上升时延下降时延截止时延门时延定义个数0个时延1个时延2个时延3个时延上升0dd1d1下降0dd2d2to_X0dmin(d1,d2)min(d1,d2,d3)截止0dmin(d1,d2)d3门时延由三类时延值组成:上升时延,下降时延,截止时延门时延定义可以包含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语句定义从特定的输入到输出端的各种延时.1.7矢量线网用于门结构描述当需要进行多次实例引用时,在实例描述语句中能够有选择地定义范围说明,以便自动生成多个重复的实例。wire[3:0]Out,InA,InB;nandGang[3:0](Out,InA,InB);实例化时自动以相同的标号对齐。等价于nandGang3(Out[3],InA[3],In