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

下载本文档

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

文档简介

第3讲verilog的基本语法3.1数据类型及其常量及变量0、低、伪、逻辑低、地、VSS、负插入01XZ0bufbufbufbufif11、高、真、逻辑高、电源、VDD、正插入X、不确定:逻辑冲突无法确定其逻辑值HiZ、高阻抗、三态、无驱动源Verilog的四种逻辑值x和X、z和Z不区别大小写。Z有时候也用?代替数据类型VerilogHDL中共有19种数据类型,分成常量和变量最基本最常用的4种:寄存器型reg线网型wire整形integer参数型parameter其余的包括:large\medium\scalared\time\small\tri\trio\tri1\triand\trior\trireg\vectored\wand\wor型,主要与基本单元库有关,设计时很少使用一、常量在程序运行中,其值不能被改变的量叫常量两类最基本的常量:数字型常量和参数(parameter)数字型常量:整型数可以按如下两种方式书写简单的十进制数格式基数格式基数表示法(一)格式:[位宽]’进制

值无符号数。位宽是按照二进制数来计算的。进制可以为b或B(二进制)、o或O(八进制)、d或D(十进制)、h或H(十六进制)。值是基于进制的数字序列。如:

3’b001,3’B110三位二进制

6’o12,6’O12六位八进制

4’d9,4’D9十位十进制

8’hBF,8’HBF八位十六进制基数表示法(二)基数格式计数形式的数通常为无符号数。这种形式的整型数的长度定义是可选的。如果没有定义一个整数型的长度,数的长度为相应值中定义的位数。下面是两个例子:'o7219位八进制数'hAF8位十六进制数基数表示法(三)如果定义的长度比为常量指定的长度长,通常在左边填0补位。但是如果数最左边一位为x或z,就相应地用x或z在左边补位。例如:10'b10左边添0占位,000000001010'bx0x1左边添x占位,xxxxxxx0x1如果长度定义得更小,那么最左边的位相应地被截断。例如:3'b1001_0011与3'b011相等5'H0FFF与5'H1F相等?字符在数中可以代替值z在值z被解释为不分大小写的情况下提高可读性下划线下划线可以用来分割数的表达式以提高程序的可读性,但不能用在位宽和进制处,只能用于具体的数字之间比如16’b1010_1011_11111_000//合法格式8’b_0011_1011//非法格式负数一个数字可以被定义成负数,只要在位宽表达式前加一个减号-8’d5//合法格式8’d-5//非法格式简单的十进制格式这种形式的整数定义为带有一个可选的“+”(一元)或“-”(一元)运算符的数字序列。这种形式的整数值代表一个有符号的数。负数使用补码形式表示。例如15 相当于二进制01111-15 相当于二进制10001

实数类型实数可以用下列两种形式定义十进制记数法,例如:2.0;-0.1等科学记数法,例如:235.1e2 等于23510.0234_12e2 等于2341200.0实数小数通过四舍五入被隐式地转换为最相近的整数。例如:42.446,42.45转换为整数4292.5,92.699转换为整数93-5.62转换为整数-6-26.22转换为整数-6常量的位数,x(或z)在十六进制值中代表4位x(或z),在八进制中代表3位x(或z),在二进制中代表1位x(或z)当常量不说明位数时候默认是32位,每个字母用8位ASCII码来表示10=32’d10=32’b10101=32’d1=32’b1-1=-32’d1=32’hFFFF_FFFF‘BX=32’BX=32’BXXXXXXXXXX...“AB”=16’B010000001_01000010A的ASCII值是85,B的值是86字符串字符串是双引号内的字符串列。一个字符可用八位二进制表示。如:“INTEGER”需要8*7位。 例: reg[8*14:1]Message;

Message=“INTERNALERROR”;课堂练习下列表达式的位模式是什么?写出其具体的二进制表示值7'o44,'Bx0,5'bx110,'hA0,10'd2,'hzFVerilog描述实际的二进制值7'o44100100'Bx0x05'bx110xx110'hA01010_000010'd20000_0000_10'hzFzzzz1111参数参数是一个常量。用parameter定义一个标识符来代表一个常量。参数经常用于定义时延和变量的宽度。格式:parameterparam1=const_expr1,param2=const_expr2, …,

paramN=const_exprN;

如:parameterDelay=1;

parameterA=32,B=4’b0001;

parameterstring=“exec_command”;参数的传递参数值也可以在编译时被改变。改变参数值可以使用参数定义语句或通过在模块初始化语句中定义参数值当某个模块在另一个模块内被引用时,高层模块能够改变低层模块的参数值。模块参数值的改变可采用下述两种方式:参数定义语句(defparam);带参数值的模块引用。defparam举例module

TOP(NewA,NewB,NewS,NewC);input

NewA,NewB;output

NewS,NewC;defparam

Ha1.XOR_DELAY=5,//实例Ha1中的参数XOR_DELAY。Ha1.AND_DELAY=2;//实例Ha1中参数的AND_DELAY。HAHa1(NewA,NewB,NewS,NewC);endmodulemoduleHA(A,B,S,C);inputA,B;outputS,C;parameterAND_DELAY=1,XOR_DELAY=2;assign#XOR_DELAYS=A^B;assign#AND_DELAYC=A&B;endmoduleHATOP参数值的模块引用module

TOP3(NewA,NewB,NewS,NewC);input

NewA,NewB;output

NewS,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的改变,会自动地立刻影响或门的输出。netsabslselbselansloutNets(线网型)例:

wireBpW;

assignBpW=Error&Wait;

assignBpW=Valid|Clear;BpW电路图Nets(网络连线,线网类型)简单的线网类型定义说明语句为:net_kind[msb:lsb]net1,net2,….netN;当一个线形有两个或多个驱动时,线网的有效值按如下表确定。补充:CMOSNORABF001010100110A+BABABAB补充:CMOSNANDABA•BABABF001011101110ABNets(网络连线)补充知识:连续赋制值语句连续赋制语句用于把值赋给线网型变量(不能为寄存器型变量赋值)语句形式为:assignA=B&C;连续赋值语句在什么时候执行呢?只要在右端表达式的操作数上有事件(事件为值的变化)发生时,表达式即被计算;如果结果值有变化,新结果就赋给左边的线网。连续赋值的目标类型标量线网向量线网向量的常数型位选择,如a[1]向量的常数型部分选择如:a[3:1]上述类型的任意的拼接运算结果连续赋值语句举例module

FA_Df(A,B,Cin,Sum,Cout);input

A,B,Cin;output

Sum,Cout;assign

Sum=A^B^Cin;assign

Cout=(A&Cin)|(B&Cin)|(A&B);endmodule在本例中,有两个连续赋值语句。这些赋值语句是并发的,与其书写的顺序无关数据流描述方式例:worBpW;wandBpR;

assignBpW=Error&Wait;

assignBpW=Valid|Clear;

assignBpR=Error^Valid;

assignBpR=!Clear;BpW和BpR电路图寄存器(register)类型变量寄存器(register)类型变量register型变量能保持其值,直到它被赋于新的值。register型变量常用于行为建模,产生测试的激励信号。常用行为语句结构来给寄存器类型的变量赋值。abslselbselansloutreg_areg_selreg_breg型寄存器是数据存储单元的抽象reg型数据常用来表示always块内的指定信号,常代表触发器reg型数据用initial或者always块中指定信号reg型数据的缺省值是x。可以被赋正值或者负值。当它作为一个表达式中的操作数时候,作为无符号数。reg数据类型定义格式为reg[n-1:0]数据名1,....;或者reg[n:1]数据名1,....;寄存器阵列

Verilog语言支持寄存器阵列的声明:integerNUMS[7:0];//8个整型变量的寄存器阵列timet_vals[3:0];//4个时间变量的寄存器阵列数据类型为reg的阵列常称为存储器(即memory):reg[15:0]MEM[0:1023];//1Kx16位的存储器reg[7:0]PREP[‘hfffe:‘hffff];//2x8位的存储器可以用参数来表示存储器的大小:parameterwordsize=16;parametermemsize=1024;reg[wordsize-1:0]MEM3[memsize-1:0];只能一次选择一个字,不允许对存储器变量值部分进行部分选择或位选择.如dram[60][2:4]是错误的存储器memory型变量存储器memory型用一个寄存器数组来对存储器建模。格式:reg[msb:lsb]存储器名[upper1:lower1];如:reg[3:0]MyMem[63:0];//64个四位寄存器组

其他类型变量integer整数寄存器有符号数。主要用来高层次建模。如:integerA; //整形寄存器,32位integerB[1023:0];//10位time时间类型寄存器如:timeCurrentTime;//CurrentTime存储一个时间值 CurrentTime=$time;输入端口(input)可以由寄存器(reg)或线网(wire)连接驱动,但它本身只能驱动网络连接。输出端口(output)可以由寄存器或线网连接驱动,但它本身只能驱动线网连接。输入/输出端口(inout)只可以由线网连接驱动,但它本身只能驱动线网连接。如果信号变量是在过程块(initial块或always块)中被赋值的,必须把它声明为寄存器类型变量

如何选择正确的数据类型?moduletop;wirey;

rega,b;DUTu1(y,a,b);

initial

begina=0;b=0;#10a=1;….

endendmodule

模块DUT的边界输入口输出口输出/入口netnetnet/registernetnet/registernetinoutmoduleDUT(Y,A,B_);outputY;inputA,B:wireY,A,B;and(Y,A,B);endmodule举例说明数据类型的选择在过程块(alwaysinitial)中对变量赋值时,忘了把它定义为寄存器类型(reg)或已把它定义为连接类型了(wire)把实例的输出连接出去时,把它定义为寄存器类型把模块的输入信号定义为寄存器类型。这是经常犯的三个错误!!!选择数据类型时常犯的错误3.2运算符及表达式天津大学电子科学与技术系史再峰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=16’h0001(-9)/6=16’hFFFF(-9)%6=16’hFFFD11%(-5)=16’h000112/(-7)=16’hFFFF3.2.2按位运算符按位运算符有:~(一元非)&(二元与)|(二元或)^(二元异或)~^,^~(二元异或非)这些运算符在输入操作数的对应位上按位操作,并产生向量结果。不同长度操作符运算时,会右端对齐,左端补0按位非运算符按位与运算符按位或运算符按位异或运算符按位异或非运算符按位操作符举例假定A='b0110;B='b0100;那么:A|B结果为0110A&B结果为01004'b1011^4'bx010=4'bx001如果操作数长度不相等,长度较小的操作数在最左侧添0补位。例如,'b0110^'b10000与如下式的操作相同:'b00110^'b10000结果为'b10110。3.2.3逻辑运算符逻辑运算符有:&&(逻辑与)||(逻辑或)!(一元逻辑非)这些运算符在逻辑值0或1上运算。逻辑运算的结构为0或1。逻辑与运算举例assigna=8'haa;assignb=8'hff;assignc_out=a&b;assignc_out2=a&&b;c_out2结果是0000_0001课堂练习以下表达式在verilogHDL中的值是多少?(结果用8位表示)assignd_0=4'b1101^8'h0a;assignd_1=4'b1101^~8'h0a;assignd_2=4'b1z01|8'h0a;assignd_3=4'b1101&&8'h0a;assignd_4=!4'b1x01;assignd_5=4'b1010||8'h55;答案是#hexd_0is07#hexd_1isF8#binaryd_2is0000_1x11#hexd_3is01#hexd_4is00#hexd_5is013.2.4关系运算符关系运算符有:>(大于)<(小于)>=(不小于)<=(不大于)关系运算符的结果为真(1)或假(0)。如果操作数中有一位为X或Z,那么结果为X。例如:23>45结果为假(0)52<8‘hxFF结果为x。关系运算符语法如果操作数长度不同,长度较短的操作数在最重要的位方向(左方)添0补齐。例如:'b1000>='b01110等价于:'b01000>='b01110结果为假(0)3.2.5相等关系运算符相等关系运算符有:==(逻辑相等)!=(逻辑不等)===(全等)!==(非全等)如果比较结果为假,则结果为0;否则结果为1。在全等比较中,值x和z严格按位比较。相等关系运算举例Data='b11x0;Addr='b11x0;那么(Data==Addr)不定,值为x,但:Data===Addr为真,值为1。如果操作数的长度不相等,长度较小的操作数在左侧添0补位,例如:2'b10==4'b0010与下面的表达式相同:4'b0010==4'b0010结果为真(1)。关系及相等关系运算符练习判断以下表达式中的d值是多少assignd_relation1=(4'b1011>=4'b10x1);

assignd_relation2=(4'b1011==4'b10x1);

assignd_relation3=(4'b10x1==4'b10x1);

assignd_relation4=(4'b10z1===4'b10x1);assignd_relation5=(4'b10x1!==4'b10x1);assignd_relation6=(4'b10x1!=4'b10x1);答案是:#bind_relation1is1'bx#bind_relation2is1'bx#bind_relation3is1'bx#bind_relation4is1'b0#bind_relation5is1'b0#bind_relation6is1'bx3.2.6缩减(归约)运算符归约运算符在单一操作数的所有位上操作,并产生1位结果。归约运算符有:&(归约与):如果存在位值为0,那么结果为0;若如果存在位值为x或z,结果为x;否则结果为1。~&(归约与非):与归约运算符&相反。

|(归约或):如果存在位值为1,那么结果为1;如果存在位x或z,结果为x;否则结果为0。~|(归约或非):与归约运算符|相反。

^(归约异或):如果存在位值为x或z,那么结果为x;否则如果操作数中有偶数个1,结果为0;否则结果为1。

~^(归约异或非):与归约运算符^正好相反。缩减(归约)运算符练习判断以下表达式中的d值是多少

assignd_reduction1=&8'b1011_0011;

assignd_reduction2=~|8'b1011_0011;

assignd_reduction3=~&8'b1011_0011;assignd_reduction4=~^8'b1011_0011;

assignd_reduction5=^8'b1011_0011;assignd_reduction6=~|8'b1011_00x1;

assignd_reduction7=^8'b10z1_0011;

assignd_reduction8=&8'b1011_00x1;assign

d_reduction8=&~8'b1011_00x1;modelsim仿真验证的答案是#bind_reduction1is1'b0#bind_reduction2is1'b0#bind_reduction3is1'b1#bind_reduction4is1'b0#bind_reduction5is1'b1#bind_reduction6is1'b0#bind_reduction7is1'bx#bind_reduction8is1'b0

Error:./vlog_test.v(57):near"~":syntaxerror,

3.2.7移位运算符移位运算符有:<<(左移)

>>(右移)移位运算符左侧操作数移动右侧操作数表示的次数,它是一个逻辑移位。空闲位添0补位。如果右侧操作数的值为x或z,移位操作的结果为x。假定:reg

[0:7]Qreg;...Qreg=4'b0111;那么:Qreg>>2是8'b0000_00013.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。条件运算符举例wire

[0:2]Student=Marks>18?GA:GC;计算表达式Marks>18;如果真,GA赋值给Student;如果Marks<=18,GC赋值给Student。再例如:always#5Ctr=(Ctr!=25)?(Ctr+1):5;过程赋值中的表达式表明如果Ctr不等于25,则加1;否则如果Ctr值为25时,将Ctr值重新置为5。3.3.8连接和复制操作连接操作是将小表达式合并形成大表达式的操作。形式如:{expr1,expr2,...,exprN}实例如下所示:wire[7:0]Dbus;wire[11:0]Abus;assignDbus[7:4]={Dbus[0],Dbus[1],Dbus[2],Dbus[3]};//以反转的顺序将低端4位赋给高端4位。assignDbus={Dbus[3:0],Dbus[7:4]};//高4位与低4位交换。复制运算符通过指定重复次数来执行操作。形式如下:{repetition_number{expr1,expr2,...,exprN}}以下是一些实例:Abus={3{4'b1011}};/位向量12'b1011_1011_1011)Abus={{4{Dbus[7]}},Dbus};/*符号扩展*/运算符的优先级3.2.10关键词所有关键词都是事先定义好的确认符,用于组织语言结构,全部是小写定义。常用的有assignalwaysinitialbeginendbufbufif0bufif1casexcasezcmosdeassigndefaultdefparamdisableedgecaseifelseendcasejoinlargeforkjoinnotnotif0notif1xorwireregworxorxnorwhiletritri0tri1triandtriorrepeattaskfunctionforeverendtask等等作业练习题假定32位总线Address_Bus,编写一个表达式,计算从第11位到第20位的归约与非。假定一条总线Control_Bus[15:0],编写赋值语句将总线分为两条总线:Abus[0:9]和Bbus[6:1]。编写一个表达式,执行算术移位,将Qparity中包含的8位有符号数算术移位。使用条件运算符,编写赋值语句选择NextState的值。如果CurrentState的值为RESET,那么NextState的值为GO;如果CurrentState的值为GO,则NextState的值为BUSY;如果CurrentState的值为BUSY;则NextState的值为RESET。习题解答错误解答:assign

CurrentState==RESET?NextState=Go:(CurrentState==Go?NextState=BUSY:(CurrentState==BUSY?NextState=RESET:))正确解答:assignnextstate=(currentstate==RESET)?GO:((currentstate==GO)?BUSY:((currentstate==BUSY)?RESET:1’bz));3.3数据流建模天津大学电子科学与技术系史再峰一、连续赋制值语句连续赋制语句用于把值赋给线网型变量(不能为寄存器型变量赋值)语句形式为:assignA=B&C;只要在右端表达式的操作数上有事件(事件为值的变化)发生时,表达式即被计算;如果计算的结果值有变化,新结果就赋给左边的线网。数据流的模型化连续赋值语句将值赋给线网(连续赋值不能为reg)例如assign

Mux=(S==0)?A:1'bz;assign

Mux=(S==1)?B:1'bz;assign

Mux=(S==2)?C:1'bz;assign

Mux=(S==3)?D:1'bz;assign

Mux=(S==0)?A:1‘bz,//也可以这样在一个语句中写Mux=(S==1)?B:1‘bz,

Mux=(S==2)?C:1‘bz,

Mux=(S==3)?D:1'bz;连续赋值的目标类型标量线网wirea;向量线网wire[7:0]a;向量线网的常数型位选择,如a[1]向量线网的常数型部分选择如:a[3:1]上述类型的任意的拼接运算结果{3a[2],a[2:1]}连续赋值语句举例module

FA_Df(A,B,Cin,Sum,Cout);input

A,B,Cin;output

Sum,Cout;assign

Sum=A^B^Cin;assign

Cout=(A&Cin)|(B&Cin)|(A&B);endmodule在本例中,有两个连续赋值语句。这些赋值语句是并发的,与其书写的顺序无关对应的电路连接关系赋值给向量线网的拼接wire

Cout,Cin;wire[3:0]Sum,A,B;assign{Cout,Sum}=A+B+Cin;数据流描述方式例:worBpW;wandBpR;

assignBpW=Error&Wait;

assignBpW=Valid|Clear;

assignBpR=Error^Valid;

assignBpR=!Clear;BpW和BpR电路图用数据流描述对2-4解码器电路的建模参考答案`timescale1ns/1nsmoduleDecoder2x4(A,B,EN,Z);inputA,B,EN;output[0:3]Z;wireAbar,Bbar;assignAbar=~A;assignBbar=~B;assignZ[0]=~(Abar&Bbar&EN);assignZ[1]=~(Abar&B&EN);assignZ[2]=~(A&Bbar&EN);assignZ[3]=~(A&B&EN);endmodule课堂练习题使用连续赋值语句,描述图示的优先编码器电路的行为2bar02bar12bar2某同学的解答module(Data,Encode,Valid);input[3:0]Data;output[1:0]Encode;wire2bar0,2bar1,0bar;assign2bar0=~Data[2];assign2bar1=2bar0&Data[1];assign0bar=Data[0]|Data[1];assignEncode[0]=Data[3]|2bar1;assignEncode[1]=Data[3]|Data[2];assignValid=Data[3]|Data[2]|0bar;endmodule程序基本没有问题,但是:第1行module没有命名,这是不可以的第4行变量定义的时候,标识符的首字母应该是字母或者下划线正确解答moduleencoder(Data,Encode,Valid);input[3:0]Data;output[1:0]Encode;wirebar0,bar1,bar;assignbar0=~Data[2];assignbar1=2bar0&Data[1];assignbar=Data[0]|Data[1];assignEncode[0]=Data[3]|2bar1;assignEncode[1]=Data[3]|Data[2];assignValid=Data[3]|Data[2]|0bar;endmodule二、线网说明赋值连续赋值可作为线网说明本身的一部分。这样的赋值被称为线网说明赋值。如:wire[3:0]Sum=4'b0;wireClear='b1;wireA_GT_B=A>B,B_GT_A=B>A;等价于

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?(D0&D1&D2&D3):1’b0;

endmodule数据流建模课堂练习数据流建模参考答案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=~(D&C);assignD2=~(C&NotD);assignY=~(D1&Ybar);assignYbar=~(Y&D2);assignY1=~(Y&NotC);assignY2=~(NotY&NotC);assignQ=~(Qbar&Y1);assignQbar=~(Y2&Q);endmodule三、时延说明assign#6Ask=Quiet||Late;规定右边表达式结果的计算到其赋给左边目标需经过6个时间单位时延。例如,如果在时刻5,Late值发生变化,则赋值的右端表达式被计算,并且Ask在时刻11(=5+6)被赋于新值时延VerilogHDL模型中的所有时延都根据时间单位定义使用编译指令将时间单位与物理时间相关联。这样的编译器指令需在模块描述前定义,如下所示:`timescale

1ns/100ps此语句说明时延时间单位为1ns并且时间精度为100ps(时间精度是指所有的时延必须被限定在0.1ns内)。如果此编译器指令所在的模块包含上面的连续赋值语句,#2代表2ns。如果没有这样的编译器指令,VerilogHDL模拟器会指定一个缺省时间单位。IEEEVerilogHDL标准中没有规定缺省时间单位。为什么会有延时?以下两个最基本的电路单元CMOSNANDABA•BABABF001011101110ABCMOSNORABF001010100110A+BABABABMOSFET的结构MOS电容静态CMOS的开关模型AReqARpARpARnCLACLBRnARpBRpARnCintBRpARpARnBRnCLCintNAND2INVNOR2关于时延探讨如果右端在传输给左端之前变化,右端发生在时延间隔内的变化被滤掉。 例如: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=&DataBus;//Threedelayvalues.assignBus=MemAddr[7:4];//Nodelayvalue.带时延的译码器建模`timescale1ns/1nsmoduleDecoder2x4(A,B,EN,Z);inputA,B,EN;output[0:3]Z;wireAbar,Bbar;assign#1Abar=~A;assign#1Bbar=~B;assign#2Z[0]=~(Abar&Bbar&EN);assign#2Z[1]=~(Abar&B&EN);assign#2Z[2]=~(A&Bbar&EN);assign#2Z[3]=~(A&B&EN);endmodule结果波形3.3.3线网时延时延也可以在线网说明中定义,如:wire#5Arb;线网时延效果如图线网时延Textassign时延assign时延驱动2驱动2驱动1RHS表达式RHS表达式线网目标线网时延举例wire#5Arb;assign#2Arb=Bod⋒因为定义了线网时延,实际对Arb的赋值发生在时刻17(=10+2+5)。课后作业数据流建模以下的奇偶发生器3.4门级结构建模天津大学电子科学与技术系史再峰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_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);3.4.2多输入门内置的多输入门包括:andnandnororxorxnor这些逻辑门只有单个输出,1个或多个输入。门实例语句的语法如:multi_input_gate_type[instance_name](OutputA,Input1,Input2,...,InputN);第一个端口是输出,其它端口是输入多输入门input1input2inputNOutputA多输入门语法举例andA1(Out1,In1,In2);andRBX(Sty,Rib,Bro,Qit,Fi)x;xor(Bar,Bud[0],Bud[1],Bud[2]),(Car,Cut[0],Cut[1]),(Sar,Sut[2],Sut[1],Sut[0],Sut[3]);多输入门的真值表(一)nand01XZ01111110XXX1XXXZ1XXXand01XZ00000101XXX0XXXZ0XXX多输入门的真值表(二)nor01XZ010XX10000XX0XXZX0XXor01XZ001XX11111XX1XXZX1XX多输入门的真值表(三)xnor01XZ010XX101XXXXXXXZXXXXxor01XZ001XX110XXXXXXXZXXXX3.4.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);真值表01XZbuf01XXnot10XX3.4.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门级结构建模例题module flop(data,clock,clear,q,qb);input data,clock,clear;output q,qb;nand

#10 nd1(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

#9 nd3(c,a,d),nd7(q,e,qb);not

#10 iv1(ndata,data),iv2(nclock,clock);endmodule课堂练习用verilog的内置基本门结构建模以下电路参考答案moduleParity_9_Bit(D,Even,Odd);input[0:8]D;outputEven,Odd;xor

XE0(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);endmodule3.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)cmos

[instance_name](OutputA,InputB,NControl,PControl);rnmos、rpmos、驱动强度rnmos和pmos在输入引线和输出引线之间存在高阻抗(电阻)。因此当数据从输入传输至输出时,对于rpmos和rmos,存在数据信号强度衰减。值1强度supply1>strong1>pull1>weak1>highz1值0强度supply0>strong0>pull0>weak0>highz0双向开关双向开关:tran,tranif0,tranif1,rtran,rtranif0,rtranif1开关是双向的,即数据可以双向流动,并且当数据在开关中传播时没有延时。后4个开关能够通过设置合适的控制信号来关闭。tran和rtran(tran的高阻态版本)开关不能被关闭。gate_type[instance_name](SignalA,SignalB,ControlC);前两个端口是双向端口,即数据从SignalA流向SignalB,反之亦然。第三个端口是控制信号。根据开关例化的选择有控制信号或者没有控制信号。3.4.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语句定义从特定的输入到输出端的各种延时.矢量线网用于门结构描述当需要重复性的实例时,在实例描述语句中能够有选择地定义范围说明wire[3:0]Out,InA,InB;nandGang[3:0](Out,InA,InB);实例化时自动以相同的标号对齐。等价于nandGang3(Out[3],InA[3],InB[3]),Gang2(Out[2],InA[2],InB[2]),Gang1(Out[1],InA[1],InB[1]),Gang0(Out[0],InA[0],InB[0]);门级结构建模例题`timescale1ns/1nsmoduleDEC2X4(A,B,Enable,Z);inputA,B,Enable;output[0:3]Z;wireAbar,Bbar;not

#(1,2)V0(Abar,A),V1(Bbar,B);nand

#(4,3)N0(Z[3],Enable,A,B),N1(Z[0],Enable,Abar,Bbar),N2(Z[1],Enable,Abar,B),N3(Z[2],Enable,A,Bbar);endmodule门级结构建模练习题参考解答`timescale1ns/1nsmoduleGateCircuit(Data,Encode,Valid)input[3:0]Data;output[1:0]Encode,Valid;notG1(NotData[2],Data[2]);andG2(A,NotData[2],Data[1]);orG3(B,Data[1],Data[0]),

G4(Encode[0],Data[3],A),

G5(Encode[1],Data[3],Data[2]),

G6(Valid,Data[3],Data[2],B);

endmodule作业题先画出完整门级电路图,然后用门级结构描述以下电路,并试分析其功能M1-EM2-DM3-CLA3.5行为建模3.5行为建模行为描述方式设计的行为功能使用下述过程语句结构描述:initial语句:此语句只执行一次。always语句:此语句总是循环执行,或者说此语句重复执行。只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原有值不变。所有的initial语句和always语句在0时刻并发执行。一个模块中可包含任意多个initial和always语句过程性赋值(过程结构)过程性赋值是在initial语句或always语句内的赋值,它只能对寄存器数据类型的变量赋值。表达式的右端可以是任何表达式。 ...reg[1:4]Enable,A,B;...#5Enable=~A^~B;...Enable为寄存器。根据时延控制,赋值语句被延迟5个时间单位执行。右端表达式被计算,并赋值给Enable过程性赋值分两类:阻塞性过程赋值、非阻塞性过程赋值initial过程结构语句initial语句只执行一次。initial语句在仿真开始时执行,即在0时刻开始执行。initial语句的语法如下:initial

begin...end顺序过程(begin...end)最常使用在进程语句中。initial的时序控制时序控制可以是时延控制,即等待一个确定的时间;或事件控制,即等待确定的事件发生或某一特定的条件为真。initial语句的各个进程语句仅执行一次。在模拟的0时刻开始执行。initial语句根据进程语句中出现的时间控制在以后的某个时间完成执行。Initial语句主要用于初始化和波形生成initial语句举例parameterAPPLY_DELAY=5;reg[0:7]port_A;...initialbeginPort_A=8'h20;#APPLY_DELAYPort_A=8'hF2;#APPLY_DELAYPort_A=8'h41;#APPLY_DELAYPort_A=8'h0A;endinitial语句举例`timescale1ns/100psmodulet_s2();

rega;

initial

begina=1;#5a=0;#8a=1;#10;a=0;#11a=1;endendmoduleInitial语句练习modulestimulus;

regx,y,a,b,m;

initial

m=1'b0;

initial

begin

#5a=1'b1;

#25b=1'b0;

end

initial

begin

#10x=1'b0;

#25y=1'b1;

end

initial

#50$finish;

endmodule时间

被执行的叙述

0

m=1'b0;

5

a=1'b1;

10

x=1'b0;

30

b=1'b0;

35

y=1'b1;

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;end

endendmodulealways用法举例modulelab1(a,b,c,sel,z);input[7:0]a,b,c;inputsel;output[8:0]z;always@(aorborc)beginif(sel)z=a+b;elsez=a+c;endendmodule两类语句在同一模块的使用moduleTestXorBehavior;regSa,Sb,Zeus;initial

beginSa=0;Sb=0;#5Sb=1;#5Sa=1;#5Sb=0;endalways@(SaorSb)Zeus=Sa^Sb;endmodule3.5.2行为建模中的时序控制时序控制与过程语句关联。有2种时序控制形式:时延控制事件控制这两类时序控制形式只能用于initial或者always语句块之中,即只能用于行为建模时延控制时延控制定义为执行过程中首次遇到该语句与该语句的执行的时间间隔。时延控制表示在语句执行前的“等待时延”形式如:#2Tx=Rx-5;时延控制也可以用另一种形式定义:#5;这种形式指定了在下一条语句执行前等待给定的时延时延控制中的时延可以是任意表达式,不必限定为某一常量如果时延表达式的值为0,则称之为显式零时延。促发一个等待,等待所有其它在当前模拟时间被执行的事件执行完毕后,才将其唤醒;模拟时间不前进。课堂练习写出完整代码,生成如下波形。生成一个周期为10的时钟信号参考答案`timescale1ns/100psmodulet_s2();

rega;

regclk;

initial

begina=0;clk=0;#10a=1;#10a=0;#20;a=1;#10a=0;#10a=1;#10a=0;#10a=1;endalwaysbegin#5clk=~clk;endendmodule事件控制(消息控制)边沿触发事件控制格式为:@事件声明例如@(posedgeClock)带有事件控制的进程或过程语句的执行,须等到指定事件发生。上例中,如果Clock信号从低电平变为高电平(正沿),就执行赋值语句;否则进程被挂起,直到Clock信号产生下一个正跳边沿。posedge表示上升沿(正沿);nededge表示下降沿(负沿)正沿和负沿代表的意义negedgeposedge1->X0->x1->Z0->Z1->00->1x->0x->1z->0z->1边沿触发事件控制举例time

温馨提示

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

评论

0/150

提交评论