已阅读5页,还剩118页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章VerilogHDL基础,VerilogHDL历史与现状VerilogHDL与VHDL系统建模概述VerilogHDL示例语言要素表达式、操作数、操作符数据流建模行为建模VerilogHDL源代码设计Testbench验证,VerilogHDL历史,1983年,GatewayDesignAutomation公司推出Verilog语言,开发了仿真与验证工具;1985年,GDA推出Verilog仿真器Verilog-XL:仿真速度快,处理能力强,具有交互式调试手段;1987年,Synopsys公司的综合软件开始接受Verilog输入;1989年,Cadence公司收购GDA,进一步扩大Verilog的影响;1990年,OpenVerilogInternational(OVI)成立,推广VerilogHDL和Veriog-XL被广泛推广;1993年,OVI推出Verilog2.0,作为IEEE提案提出申请;1995年,IEEE(InstituteofElectricalandElectronicsEngineers)通过VerilogHDL标准IEEEStd.1364-1995;2001年,IEEE发布了VerilogIEEE1364-2001标准。本课程以IEEEStd.1364-1995为主,VerilogHDL现状,VerilogHDL是最广泛使用的、具有国际标准支持的硬件描述语言,绝大多数的EDA厂商都支持;在工业界和ASIC设计领域,VerilogHDL应用更加广泛。,VerilogHDL与VHDL,VHDLVery-High-SpeedIntegratedCircuitHardwareDescriptionLanguage诞生于1982年;1987年底被IEEE和美国国防部确认为标准硬件描述语言。IEEE1076(1983)IEEE1076-1995,VerilogHDL与VHDL,建模层次系统级(system):用高级语言结构实现设计模块的外部性能的模型。算法级(algorithmic):用高级语言结构实现设计算法的模型。RTL级(RegisterTransferLevel):描述数据在寄存器之间流动和如何处理这些数据的模型。门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。,VerilogHDL与VHDL,相同点:都能形式化抽象表示电路行为和结构;支持逻辑设计中层次与范围的描述;具有电路仿真和验证机制;与工艺无关。不专门面向FPGA设计不同点:Verilog与C语言相似,语法灵活;VHDL源于Ada语言,语法严格;Verilog更适合ASIC设计。,SystemVerilog与SystemC,SystemVerilog:IEEE1364Verilog-2001标准的扩展增强,兼容Verilog2001,将硬件描述语言(HDL)与现代的高层级验证语言(HVL)结合。SystemC:一种软/硬件协同设计语言,既是系统级语言,也是硬件描述语言。,系统建模,设计方法学自顶向下自底向上混合式描述方式数据流描述:描述电路数据流行为:assign行为描述:描述功能:initial,always结构化描述:描述元器件间连接关系:例化混合描述:Verilog允许多描述方式共存于同一模块。,简单的Verilog程序,moduletrist1(out,in,enable);outputout;/*输出信号*/inputin,enable;/输入信号mytritri_inst(out,in,enable);endmodulemodulemytri(out,in,enable);outputout;inputin,enable;assignout=enable?in:bz;endmodule,三态门模块trist1调用模块mytri的实例元件tri_inst;通过这种结构性模块构造可构成特大型模块。,简单的Verilog程序,三态门(综合),简单的Verilog程序,VerilogHDL程序是由模块构成的;每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行逻辑描述;VerilogHDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行;除了endmodule语句外,每个语句和数据定义的最后必须有分号。,同一电路的多种描述方法,二选一的选择器门级(结构化)描述modulemuxtwo(out,a,b,sl);inputa,b,sl;outputout;wirensl,sela,selb;not#1u1(nsl,sl);/#1是仿真延迟and#1u2(sela,a,nsl);and#1u3(selb,b,sl);or#1u4(out,sela,selb);endmodule,RTL级行为描述modulemuxtwo(out,a,b,sl);inputa,b,sl;outputout;regout;always(sloraorb)if(!sl)out=a;elseout=b;endmodule,布尔代数级行为描述modulemuxtwo(out,a,b,sl);inputa,b,sl;outputout;assignout=sel?b:a;endmodule,同一电路的多种描述方法,二选一的选择器(综合),混合描述,混合设计方式的1位全加器实例moduleFA_Mix(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;regCout;regT1,T2,T3;wireS1;xorX1(S1,A,B);/门实例语句。always(AorBorCin)/always语句。beginT1=A/连续赋值语句。endmodule,混合描述,混合设计方式的1位全加器实例(综合),模块基本结构,module模块名(端口列表);端口I/O说明内部信号声明功能定义endmodule,时延,VerilogHDL模型中的所有时延都根据时间单位定义。下面是带时延的连续赋值语句实例。assign#2Sum=AB;#2指2个时间单位。使用编译指令将时间单位与物理时间相关联。这样的编译器指令需在模块描述前定义,如下所示:timescale1ns/100ps此语句说明时,延时间单位为1ns并且时间精度为100ps(时间精度是指所有的时延必须被限定在0.1ns内)。如果此编译器指令所在的模块包含上面的连续赋值语句,#2代表2ns。如果没有这样的编译器指令,VerilogHDL模拟器会指定一个缺省时间单位。IEEEVerilogHDL标准中没有规定缺省时间单位。,语言要素:标识符,所谓标识别符就是用户为程序描述中的Verilog对象所起的名字。模块名、变量名、常量名、函数名、任务名标识符必须以英语字母(a-z,A-Z)起头,或者用下横线符(_)起头。其中可以包含数字、$符和下划线符。标识符最长可以达到1023个字符。模块名、端口名和实例名都是标识符。Verilog语言大小写敏感,sel和SEL是两个不同的标识符。所有的关键词都是小写的。,语言要素:系统任务和函数,以$字符开始的标识符表示系统任务或系统函数。任务可以返回0个或多个值,函数除只能返回一个值以外与任务相同。函数在0时刻执行,即不允许延迟,而任务可以带有延迟。常用于测试模拟,一般不用于源代码设计。$display(Hi,youhavereachedLTtoday);/*$display系统任务在新的一行中显示。*/$time/该系统任务返回当前的模拟时间。,语言要素:编译指令,以(反引号)开始的某些标识符是编译器指令。define和undef,很像C语言中的宏定义指令ifdef、else和endif,用于条件编译include文件既可以用相对路径名定义,也可以绝对路径timescale编译器指令将时间单位与实际时间相关联。该指令用于定义时延的单位和时延精度。,语言要素:值集合,VerilogHDL有下列四种基本的值:0:逻辑0或“假”1:逻辑1或“真”x:未知z:高阻(x,z不区分大小写)VerilogHDL中有三类常量:整型实数型字符串型,语言要素:常量,1.整数表达方式:标准方式:默认位宽,与机器类型有关:不指明进制默认为十进制进制二进制(b或B):8b10101100,b1010十进制(d或D):4d1543,512十六进制(h或H):8ha2八进制(o或O):6O41x和z值x:不确定:4b100 xz:高阻:16hzzzz,没有驱动元件连接到线网,线网的缺省值为z。,语言要素:常量,负数:在位宽表达式前加一个减号,如-8d5减号不可以放在位宽和进制之间,也不可以放在进制和具体的数之间,如8d-5下划线:只能用在具体的数字之间,如16b1010_1111_1010位数指的是二进制位数。数位扩展:(定义的长度比为常量指定的长度长)最高位是0、1,高位用0扩展:8b1111等于8b00001111最高位是z、x,高位自动扩展:4bz等于4bzzzz数位截断:如果长度定义得更小,最左边的位被截断,如:3b1001_0011等于3b011,5H0FFF等于5H1F,语言要素:常量,2.实数十进制计数法;例如2.05.68科学计数法;23_5.1e2其值为23510.0,忽略下划线3.6E2其值为360.0(e与E相同)实数通常不用于FPGA源代码的常量,语言要素:常量,3.字符串字符串是双引号内的字符序列。字符串不能分成多行书写。例如:INTERNALERRORREACHEDHERE“用8位ASCII值表示的字符可看作是无符号整数。为存储字符串“INTERNALERROR”,变量需要8*14位。reg1:8*14Message;(Message=“INTERNALERROR“)字符串较少用于FPGA源代码的常量,语言要素:数据类型,两大类数据类型线网型寄存器型线网型包含下述不同种类的线网子类型wire/FPGA设计中,通常只用wire型triwortriorwandtriandtriregtri1tri0supply0supply1,msb和lsb定义了范围,并且均为常数值表达式。范围定义是可选的;如果没有定义范围,缺省值为1位线网wireReset;wire3:0data_in;wire3:2select;wire0:2point;,wiremsb:lsbreg1,reg2,.regN;,语言要素:数据类型,寄存器型5种不同的寄存器类型。reg/FPGA设计中,通常只用reg型,默认初始值eger/其他类型用于仿真timerealrealtime,msb和lsb定义了范围,并且均为常数值表达式。范围定义是可选的;如果没有定义范围,缺省值为1位寄存器regReset;reg3:0data_in;reg3:2select;reg0:2point;,regmsb:lsbreg1,reg2,.regN;,语言要素:数据类型,存储器存储器是一个寄存器数组。存储器使用如下方式说明regmsb:lsbmemory1upper1:lower1,memory2upper2:lower2,.;reg3:0MyMem63:0/MyMem为64个4位寄存器的数组。regBog1:5/Bog为5个1位寄存器的数组。存储器赋值不能在一条赋值语句中完成,寄存器可以。存储器常用于FPGA外围器件的仿真建模,语言要素:数据类型,存储器赋值2)系统任务赋值reg3:0RomB7:0;$readmemb(ram.patt,RomB);Romb是存储器。文件“ram.patt”必须包含二进制值。文件也可以包含空白空间和注释。下面是文件中可能内容的实例。11011110100001110000100100110001,语言要素:数据类型,存储器赋值1)对每个单元逐一赋值reg0:3Xrom0:2;.Xrom0=4hA;Xrom1=4h8;Xrom2=4hF;,语言要素:参数,参数是一个常量,常用于定义时延和变量的宽度。parameterLINELENGTH=132;parameterALL_X_S=16bx;parameterBIT=1,BYTE=8,PI=3.14;parameterSTROBE_DELAY=(BYTE+BIT)/2;参数值也可以在编译时被改变。改变参数值可以使用参数定义语句或通过在模块初始化语句中定义参数值,语言要素:空白符、注释,除了字符串中的空白符,其他空白符编译被忽略注释多行注释/*/(不允许嵌套)单行注释/,习题1,1使用timescale编译器指令的目的是什么?2写出产生下图所示波形的变量BullsEye的初始化语句。3使用数据流描述方式编写下图所示的异或逻辑的VerilogHDL描述,并使用规定的时延。4下列表达式的位模式是什么?7o44,Bx0,5bx110,hA0,10d2,hzF,表达式,表达式由操作数和操作符组成;表达式可以在出现数值的任何地方使用;表达式是数据流描述的基础。ALOAD和STORE为参数,值分别被声明为12和10。,表达式:操作数,线网线网中的值被解释为无符号数,表达式中可使用:标量线网(1位)和向量线网(多位)。wire3:0led;/4位向量线网。wireline;/标量线网。assignled=4ha;/被赋于位向量1010,为十进制10。,表达式:操作数,寄存器integer型的值被解释为有符号的二进制补码数,reg型或time型的值被解释为无符号数,real型和realtime的值被解释为有符号浮点数。reg4:0state;State=5b01011;/值为位向量01011,十进制值11。State=9;/值为位向量01001,十进制值9。为何没有用assign语句赋值?,表达式:操作数,位选择位选择从向量中抽取特定的位。形式如下:net_or_reg_vectorbit_select_exprState1led2:0/线网部分选择。wire3:0led;选择范围越界或为x、z时,部分选择的值为x。(FPGA设计中禁用越界),表达式:操作数,存储器单元存储器单元从存储器中选择一个memoryword_addressreg7:0Dram63:0;Dram60;/存储器的第61个单元。不允许对存储器变量值部分选择或位选择。(思考:在存储器中读取一个位或部分选择一个字?)函数调用表达式中可使用函数调用。$time+SumOfEvents(A,B)/*$time是系统函数,并且SumOfEvents是在别处定义的用户自定义函数。*/,表达式:操作符,VerilogHDL中的操作符可以分为下述类型:算术操作符关系操作符相等操作符逻辑操作符按位操作符归约操作符移位操作符条件操作符连接和复制操作符,表达式:操作符,操作符从最高优先级到最低优先级排列。同一行中的操作符优先级相同。,表达式:操作符,除条件操作符从右向左关联外,其余所有操作符自左向右关联。A+B-C等价于:(A+B)-C/自左向右A?B:C?D:F等价于:A?B:(C?D:F)/从右向左圆扩号能够用于改变优先级(A?B:C)?D:F,表达式:操作符,算术运算符+(加)(减)*(乘)/(除)%(取模)1)后三种不常用,是具体设计结构而定;2)任意操作数是X或Z,那么整个结果为X;3)结果的长度由最长的操作数决定;4)reg和wire保存无符号数。,表达式:操作符,关系操作符有:(大于)=(不小于)4552=b01110,表达式:操作符,等式运算符(相等关系运算符)=(逻辑相等)!=(逻辑不等)=(全等)!=(非全等)1)如果比较结果为假则结果为0,为真结果为1;2)在全等比较中,值x和z严格按位比较。,习题:求下列表达式真值假定Data=b11x0;Addr=b11x0;求Data=AddrData=Addr,表达式:操作符,逻辑操作符有:/0为假D=b1;/1为真A_Bus=b0110;B_Bus=b0110;求CB=b0100;求A|BAMyReg=4b01x0;求assignDecodeOut=4b12,表达式:操作符,条件操作符根据条件表达式的值选择表达式,形式:cond_expr?expr1:expr2三目运算符wire2:0Student;assignStudent=Marks18?Grade_A:Grade_C;,表达式:操作符,位拼接运算符(连接和复制操作)连接操作:将小表达式合并形成大表达式的操作。形式:expr1,expr2,.,exprN复制操作:指定重复次数来执行操作。如下:repetition_numberexpr1,expr2,.,exprN实例:wire7:0Dbus,11:0Abus;assignDbus7:4=Dbus0,Dbus1,Dbus2,Dbus3;assignAbus=34b1011;/位向量12b1011_1011_1011)assignAbus=4Dbus7,Dbus;/*符号扩展*/,习题2,1.说明参数GATE_DELAY,参数值为5。2.假定长度为64个字的存储器,每个字8位,编写Verilog代码,按逆序交换存储器的内容。即将第0个字与第63个字交换,第1个字与第62个字交换,依此类推。3.假定32位总线Address_Bus,编写一个表达式,计算从第11位到第20位的归约与非。4.假定一条总线Control_Bus15:0,编写赋值语句将总线分为两条总线:Abus0:9和Bbus6:1。5.编写一个表达式,执行算术移位,将Qparity中包含的8位有符号数算术移位。6.使用条件操作符,编写赋值语句选择NextState的值。如果CurrentState的值为RESET,那么NextState的值为GO;如果CurrentState的值为GO,则NextState的值为BUSY;如果CurrentState的值为BUSY;则NextState的值为RESET。7.如何从标量变量A,B,C和D中产生总线BusQ0:3?如何从两条总线BusA0:3和BusY20:15形成新的总线BusR10:1?,模块与端口,模块:基本单元定义成模块形式modulemodule_name(port_list);Declarations_and_Statementsendmodule端口队列port_list列出了该模块通过哪些端口与外部模块通信。,模块与端口,端口模块的端口可以是input(输入端口)、output(输出端口)或者inout(双向端口);缺省的端口类型为wire型;output或inout能够被重新声明为reg型,但是input不可以;线网或寄存器必须与端口说明中指定的长度相同。,模块与端口,例:moduleMicro(PC,Instr,NextAddr);/端口说明input3:1PC;output1:8Instr;inout16:1NextAddr;/重新说明端口类型:wire16:1NextAddr;/该说明是可选的,但如果指定了,就必须与它的端口说明保持相同长度。reg1:8Instr;/Instr已被重新说明为reg型,因此能在always语句或在initial语句中赋值。.endmodule,模块与端口,模块实语句一个模块能够在另外一个模块中被引用,这样就建立了描述的层次。模块实例语句形式module_nameinstance_name(port_associations);信号端口可以通过位置或名称关联;但是关联方式不能够混合使用。端口官廉形式port_expr/通过位置,隐式关联.PortName(port_expr)/通过名称,显示关联,强烈推荐!port_expr可以是以下的任何类型:1)标识符(reg型或wire型)2)位选择3)部分选择4)上述类型的合并5)表达式(只适用于input型信号)MicroM1(UdIn3:0,WrN,RdN,Status0,Status1,模块与端口,使用两个半加器模块构造全加器moduleHA(A,B,S,C);inputA,B;outputS,C;assignS=AB;assignC=A/或门实例语句endmodule考虑如何模块参数化?,模块与端口,使用两个半加器模块构造全加器(模块参数化)moduleHA(A,B,S,C);inputA,B;outputS,C;parameterAND_DELAY=1,XOR_DELAY=2;assign#XOR_DELAYS=AB;assign#AND_DELAYC=A/或门实例语句endmodule,模块与端口,悬空端口通过将端口表达式表示为空白来指定为悬空端口DFFd1(.Q(QS),.Qbar(),.Data(D),.Preset(),.Clock(CK);端口长度不同通过无符号数的右对齐或截断方式进行匹配moduleChild(Pba,Ppy);input5:0Pba;output2:0Ppy;.endmodulemoduleTop;wire1:2Bdl;wire2:6Mpr;ChildC1(.Pba(Bdl),.Ppy(Mpr);endmodule,模块与端口,模块参数值改变1)参数定义语句(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,模块与端口,模块参数值改变2)带参数值的模块引用moduleTOP(NewA,NewB,NewS,NewC);inputNewA,NewB;outputNewS,NewC;HA#(5,2)Ha1(NewA,NewB,NewS,NewC);/第1个值5赋给参数AND_DELAY,该参数在模块HA中说明。/第2个值2赋给参数XOR_DELAY,该参数在模块HA中说明。endmodule,模块与端口,外部端口显式地指定外部端口。(较少使用)moduleScram_B(.Data(Arb),.Control(Ctrl),.Mem_Word(Mem_Blk),.Addr(Byte);input0:3Arb;inputCtrl;input8:0Mem_Blk;output0:3Byte;.endmodule,习题3,1.模块实例语句与门实例语句的区别是什么?2.当端口悬空时,即端口没有被连接时,端口的值是什么?3.用本章讲述的模块FA编写执行加法和减法的4位ALU的结构模型。,门级建模,FPGA设计中较少使用VerilogHDL中提供下列内置基本门:1)多输入门:and,nand,or,nor,xor,xnor2)多输出门:buf,not3)三态门:bufif0,bufif1,notif0,notif14)上拉、下拉电阻:pullup,pulldown5)MOS开关:cmos,nmos,pmos,rcmos,rnmos,rpmos6)双向开关:tran,tranif0,tranif1,rtran,rtranif0,rtranif1,用户定义原语(UDP),FPGA设计中通常不使用;UDP实例语句的语法与基本门的实例语句语法一致;UDP中可以描述组合电路和时序电路。,PrimitiveD_Edge_FF(Q,Clk,Data);outputQ;regQ;inputData,Clk;initialQ=0;table/ClkDataQ(State)Q(next)(01)0:?:0;(01)1:?:1;(0 x)1:1:1;(0 x)0:0:0;/忽略时钟负边沿:(?0)?:?:-;/忽略在稳定时钟上的数据变化(?)?:?:-;endtableendprimitive,数据流建模,连续赋值用于数据流建模(描述),生成组合逻辑电路。连续赋值使用连续赋值语句assign语句,格式为:assignLHS_target=RHS_expression;例如wireZ1,Preset,Clear;/线网说明assignZ1=Preset,数据流建模,连续赋值语句在什么时候执行呢?只要在右端表达式的操作数上有事件发生(值变化),表达式立即被计算,新结果就赋给左边的线网。连续赋值的目标类型(左侧操作数类型)1)标量线网assignZ1=;2)向量线网assigndata_tmp=;3)向量的常数型位选择assigndata_tmp2=;4)向量的常数型部分选择assigndata_tmp7:0=;5)上述类型的任意的拼接运算结果assignZ1,data_tmp15=2b10;,数据流建模,例:数据流描述的一位全加器moduleFA_Df(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;assignSum=ABCin;assignCout=(A,数据流建模,数据流建模的时延assign#2Sum=ABCin;#2表示右侧表达式的值延迟两个时间单位赋给Sum;时间单位是多少?由谁来决定?timescale1ns/100psFPGA设计中的时延仅在功能仿真时有效,不影响实际电路生成。,数据流建模,数据流建模注意事项:1)wire型变量如果不赋值,默认值为z;2)数据流建模没有存储功能,不能保存数据;3)wire型变量只能在声明时赋值或者assing语句赋值;4)assign语句并发执行,实际的延迟又物理芯片的布线结果决定。5)最基本的FPGA设计源代码描述语句之一,用于生成组合逻辑,定制LUT的逻辑功能。常作为中间信号的描述用于控制寄存器的输入输出。,习题4,1.使用assign语句描述一个时钟信号clk,频率为100MHz。assign#5clk=clk;2.请指出下列语句是否合法?描述了怎样的功能?assignMux=(S=0)?A:bz;assignMux=(S=1)?B:bz;assignMux=(S=2)?C:bz;assignMux=(S=3)?D:bz;,行为建模,过程赋值用于行为建模(描述)行为建模的主要机制:1)initial语句主要用于仿真文件(模拟)2)always语句用于源文件和仿真文件所有initial语句和always语句之间都是并发执行;执行顺序与其在模块中书写顺序无关。,行为建模:initial语句,initial语句只执行一次;在模拟开始时执行,即在0时刻开始执行;不能嵌套使用。initialtiming_controlprocedural_statementprocedural_statement可以是:procedural_continuous_assignment过程赋值(阻塞或者非阻塞)conditional_statement-ifcase_statement-caseloop_statement-for,forever,repeat,whilewait_statement-waitdisable_statement-disable(相当于C中的break)event_trigger-(event)sequential_block-begin.endparallel_block-fork.jointask_enable(userorsystem),行为建模:initial语句,例:regCurt;.initial#2Curt=1;例:parameterSIZE=1024;reg7:0RAM0:SIZE-1;regRibReg;Initialbegin:SEQ_BLK_A/顺序过程的标记,如果没有局部声明,则不需要integerIndex;RibReg=0;for(Index=0;Indexifcase_statement-caseloop_statement-for,forever,repeat,whilewait_statement-waitdisable_statement-disable(相当于C中的break)event_trigger-(event)sequential_block-begin.endparallel_block-fork.jointask_enable(userorsystem),行为建模:always语句,两种典型的always语句1)组合逻辑(电平触发)regc;always(aorborsel)c=sel?a:b;说明:(1)虽然c是reg型,但综合的结果是组合电路;(2)等同于数据流描述wirec;assignc=sel?a:b;(3)FPGA设计中不建议使用;此外,容易产生锁存器,行为建模:always语句,两种典型的always语句2)时序逻辑(时钟沿触发)reg8:0count;always(posedgeclkornegedgereset)beginif(reset)count=0;elsebeginif(count=511)count=0;elsecount=count+1;endend,说明:(1)在always语句中所有被赋值的信号必须是reg型;(2)综合为触发器,推荐使用;(3)异步时序逻辑,常见过程语句,时序控制语句仅用于仿真测试1)时序控制regStream;initialBeginStream=0;#12Stream=1;#5Stream=0;#3Stream=1;#4Stream=0;#2Stream=1;#5Stream=0;end,常见过程语句,时序控制语句2)事件控制边沿触发事件reg9:0addr;integeri;initialbeginfor(i=0;i22)Sum=0;end,常见过程语句,顺序语句块beginend源程序、测试文件块内语句顺序执行,并行语句块forkjoin测试文件块内语句并行执行,思考题:initial语句若使用forkjoin如何描述右图时序?,常见过程语句,问题:(1)时序电路的行为具有并行特性:寄存器都受到时钟的控制,流水线(2)既然forkjoin不能在源文件中使用,在行为描述中如何描述并行语句?(3)beginend中的语句是顺序执行,在同一时钟边沿触发下,每个寄存器变量为何赋值有先有后?这与实际电路是否矛盾?,常见过程语句,过程赋值语句定义:initial和always语句中的赋值语句区别于数据流描述的连续赋值语句(assign)分为阻塞过程赋值和非阻塞过程赋值两种,阻塞过程赋值always(posedgeclkornegedgerst)beginif(rst)/寄存器复位elseif()begina=1b1;b=a;endend,非阻塞过程赋值always(posedgeclkornegedgerst)beginif(rst)/寄存器复位elseif()begina=1b1;b=a;endend,b=?,常见过程语句,结论:源代码设计推荐使用非阻塞过程赋值“=”可以有效综合为寄存器逻辑电路符合实际,时序分析简单语句之间并行执行,不再有顺序关系阻塞过程赋值“=”多用于仿真测试文件适合构造仿真模型和仿真行为不容易直接综合为FPGA资源,常见过程语句,initialbeginClr=#50;Clr=#41;Clr=#100;end,initialbeginClr=#51;Clr=#40;Clr=#100;end,常见过程语句,过程赋值与连续赋值的比较,常见过程语句,if语句与C语言类似If(condition_1)procedural_statement_1elseif(condition_2)procedural_statement_2elseprocedural_statement_3注:1)条件语句必须在过程块语句中使用,不能单独使用;2)if后面的表达式的值只有为1时才按“真”处理。,常见过程语句,if语句的嵌套if(表达式1)if(表达式2)语句1;else语句2;elseif(表达式3)语句3;else语句4;注:1)else总是与它最上面的最近的if配对;2)如果if与else的数目不一样,为了实现程序设计者的目的,可以用beginend语句确定配对关系;3)强烈建议保留else分支。,常见过程语句,例:always(posedgeclkornegedgerst)beginif(rst)beginctrl=#12b00;flag=#10;endelseif(flag)beginctrl=#12b01;flag=#11;endelseflag=#10;end,常见过程语句,综合电路,常见过程语句,case语句类似C语言的switchcase语句case(case_expr)case_item_expr,case_item_expr:procedural_statement.default:procedural_statementendcase,常见过程语句,rege;always(posedgeclkornegedgerst)beginif(rst)e=#10;elsecase(a,b)2b00:e=#1d;2b01:e=#1c;2b11:e=#11b0;2b11:e=#11b1;default:;/空语句,强烈建议保留default分支表达式endcaseend,常见过程语句,综合电路,常见过程语句,casex语句和casez语句语法与case非常相似不建议使用casez(ir)8b1?:instruction1(ir);8b01?:instruction2(ir);8b00010?:instruction3(ir);8b000001?:instruction4(ir);endcase,常见过程语句,循环语句forever语句repeat语句while语句for语句(1)连续执行的循环;(2)只用于测试程序的initial块中;(3)综合工具很难综合成FPGA的逻辑电路。,思考题:用四种循环语句分别实现initial中的时钟产生:1)在100ns出开始;2)周期10ns。,习题5,1.描述电路行为:该电路在每一个时钟下跳沿(负沿)检查输入数据,当输入数据Usg为1011时,输出Asm被置为1。2.描述电路行为:输入为12位的向量。如果其中1的数量超过0的数量,输出设置为1。当Data_Ready为1时,才对输入数据进行检查。提示:输入信号均有clk和rst,采用时序逻辑设计(always语句),VerilogHDL源代码设计,基于本章内容,可以设计FPGA可实现的Verilog源代码;自顶向下设计;采用数据流建模、行为建模、结构化建模三种方式;开始你的第一个Verilog功能模块源代码设计!,VerilogHDL源代码设计,基本设计流程1)根据需求,进行模块功能划分,自顶向下设计;2)定义各个模块的接口信号(包括方向、类型、宽度);3)定义全局时钟信号和全局复位信号;4)编写顶层模块,例化子模块;5)子模块功能设计,以时序逻辑设计为主;与软件源代码设计最大的不同:时序的严格性!,VerilogHDL源代码设计,如何验证源代码设计的正确性?功能仿真(前仿真)进行语法检查,error和warning设计testbench,根据激励输入验证逻辑功能逻辑综合,Testbench验证,Testbench模拟实际环境的输入激励和输出校验的一种“虚拟平台”以输入激励为主,输出校验可以通过波形观测,1)Testbench和源代码都是.v文件2)Testbench和源代码都是module3)Testbench不能综合成FPGA内部电路,Testbench验证,接口信号定义被测试模块的输入激励设置为reg型;被测试模块的输出设置为wire型;双向端口inout在测试中需要进行特殊处理。为什么信号方向与类型的对应关系与之前的要求不同?源代码看作testbench子模块源代码顶层的输入是testbench的输出源代码顶层的输出是testbench的输入,Testbench验证,Testbench中inout信号的使用本质上是三态门inout15:0data;wire15:0data;reg15:0data_out;regdata_enable;方法1:assigndata=data_enable?data_out:16hz;方法2:IOBUF(.I(data_out),.O(),.T(data_enable),.IO(data);,Testbench验证,Testbench的结构moduletestbench();/信号类型定义(wire或者reg),注意testench没有输入输出。/例化顶层模块/激励行为描述,通常都包含clk和rst的产生描述initial/可使用各种合法语句alwaysassigntask/类似于函数endmodule,Testbench验证,Testbench自动生成模板XilinxISE工具提供testbench的自动生成模板在同一项目中的VerilogTestFixture与哪个源代码文件关联就生成对应层次的Testbench,Testbench验证,空模板样例需增加clk的产生rst的使能描述输入信号的行为描述,Testbench验证,值序列产生产生值序列的最简单是使用initial语句。例如:initialbeginReset=0;#100Reset=1;#80Reset=0;#30Reset=1;end,Testbench验证,值序列产生重复序列可由always语句产生,例如:parameterREPEAT_DELAY=35;integerCoinValue;alwaysbeginCoinValue=0;#7CoinValue=25;#2CoinValue=5;#8CoinValue=10;#6CoinValue=5;#REPEAT_DELAY;end,Testbench验证,重复模式(例如时钟信号)wireClock;assign#(PERIOD/2)Clock=Clock;初值多少?initialClock=0;Clock数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年四川交通职业技术学院单招职业技能测试题库必考题
- 2026年南阳科技职业学院单招职业技能考试必刷测试卷必考题
- 临平国企笔试题目及答案
- 2025-2030民办婴幼儿托育机构标准化运营与管理实践报告
- 2025-2030民办基础教育行业师资培养与人才流失问题研究报告
- 2025-2030民办基础教育家庭支付能力与价格弹性研究报告
- 2025-2030民办国际学校行业投资环境评估及发展路径与战略规划报告
- 2025-2030民办养老服务培训行业市场深度调研及前景趋势与投资研究报告
- 2025-2030民办人工智能培训发展现状及投资价值分析研究报告
- 2025-2030民办中小学研学旅行产品设计与市场反响
- v5600压缩包2-参考指南VITROS5600全自动生化免疫分析仪
- 公开课非谓语动词在写作中的运用
- 《平凡的世界》读书分享会
- SC/T 8120-2001玻璃钢渔船修理工艺及质量要求
- GA/T 383-2014法庭科学DNA实验室检验规范
- GA 802-2019道路交通管理机动车类型
- FZ/T 62017-2009毛巾浴衣
- 第七章社会科学研究的世界视野课件
- 【无锡】钱桥锡兴钢厂地块改造景观规划设计
- 埋线减肥讲义课件
- 水电站厂房设计-ppt课件
评论
0/150
提交评论