第二章VerilogHDL基础课件.ppt

上传人:小飞机 文档编号:4095169 上传时间:2023-04-03 格式:PPT 页数:124 大小:1.66MB
返回 下载 相关 举报
第二章VerilogHDL基础课件.ppt_第1页
第1页 / 共124页
第二章VerilogHDL基础课件.ppt_第2页
第2页 / 共124页
第二章VerilogHDL基础课件.ppt_第3页
第3页 / 共124页
第二章VerilogHDL基础课件.ppt_第4页
第4页 / 共124页
第二章VerilogHDL基础课件.ppt_第5页
第5页 / 共124页
点击查看更多>>
资源描述

《第二章VerilogHDL基础课件.ppt》由会员分享,可在线阅读,更多相关《第二章VerilogHDL基础课件.ppt(124页珍藏版)》请在三一办公上搜索。

1、Verilog HDL历史,1983年,Gateway Design Automation公司推出Verilog语言,开发了仿真与验证工具;1985年,GDA推出Verilog仿真器Verilog-XL:仿真速度快,处理能力强,具有交互式调试手段;1987年,Synopsys公司的综合软件开始接受Verilog输入;1989年,Cadence公司收购GDA,进一步扩大Verilog的影响;1990年,Open Verilog International(OVI)成立,推广Verilog HDL和Veriog-XL被广泛推广;1993年,OVI推出Verilog2.0,作为IEEE提案提出申请;

2、2019年,IEEE(Institute of Electrical and Electronics Engineers)通过Verilog HDL标准IEEE Std.1364-2019;2019年,IEEE 发布了Verilog IEEE 1364-2019标准。本课程以IEEE Std.1364-2019为主,Verilog HDL现状,Verilog HDL是最广泛使用的、具有国际标准支持的硬件描述语言,绝大多数的EDA厂商都支持;在工业界和ASIC设计领域,Verilog HDL应用更加广泛。,Verilog HDL与VHDL,VHDLVery-High-Speed Integrat

3、ed Circuit Hardware Description Language 诞生于1982年;1987年底被IEEE和美国国防部确认为标准硬件描述语言。IEEE 1076(1983)IEEE 1076-2019,Verilog HDL与VHDL,建模层次系统级(system):用高级语言结构实现设计模块的外部性能的模型。算法级(algorithmic):用高级语言结构实现设计算法的模型。RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何处理这些数据的模型。门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。开关级(switch-le

4、vel):描述器件中三极管和储存节点以及它们之间连接的模型。,Verilog HDL与VHDL,相同点:都能形式化抽象表示电路行为和结构;支持逻辑设计中层次与范围的描述;具有电路仿真和验证机制;与工艺无关。不专门面向FPGA设计不同点:Verilog与C语言相似,语法灵活;VHDL源于Ada语言,语法严格;Verilog更适合ASIC设计。,SystemVerilog与SystemC,SystemVerilog:IEEE 1364 Verilog-2019 标准的扩展增强,兼容Verilog 2019,将硬件描述语言(HDL)与现代的高层级验证语言(HVL)结合。SystemC:一种软/硬件协

5、同设计语言,既是系统级语言,也是硬件描述语言。,系统建模,设计方法学自顶向下自底向上混合式描述方式数据流描述:描述电路数据流行为:assign行为描述:描述功能:initial,always结构化描述:描述元器件间连接关系:例化混合描述:Verilog允许多描述方式共存于同一模块。,简单的Verilog程序,module trist1(out,in,enable);output out;/*输出信号*/input in,enable;/输入信号 mytri tri_inst(out,in,enable);endmodulemodule mytri(out,in,enable);output o

6、ut;input in,enable;assign out=enable?in:bz;endmodule,三态门模块trist1 调用模块 mytri 的实例元件tri_inst;通过这种结构性模块构造可构成特大型模块。,简单的Verilog程序,三态门(综合),简单的Verilog程序,Verilog HDL程序是由模块构成的;每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行逻辑描述;Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行;除了endmodule语句外,每个语句和数据定义的最后必须有分号。,同一电路的多种描述方法,二选一的选择器 门

7、级(结构化)描述module muxtwo(out,a,b,sl);input a,b,sl;output out;wire nsl,sela,selb;not#1 u1(nsl,sl);/#1是仿真延迟 and#1 u2(sela,a,nsl);and#1 u3(selb,b,sl);or#1 u4(out,sela,selb);endmodule,RTL级行为描述module muxtwo(out,a,b,sl);input a,b,sl;output out;reg out;always(sl or a or b)if(!sl)out=a;else out=b;endmodule,布尔代

8、数级行为描述module muxtwo(out,a,b,sl);input a,b,sl;output out;assign out=sel?b:a;endmodule,同一电路的多种描述方法,二选一的选择器(综合),混合描述,混合设计方式的1位全加器实例module FA_Mix(A,B,Cin,Sum,Cout);input A,B,Cin;output Sum,Cout;reg Cout;reg T1,T2,T3;wire S1;xor X1(S1,A,B);/门实例语句。always(A or B or Cin)/always 语句。beginT1=A/连续赋值语句。endmodule

9、,混合描述,混合设计方式的1位全加器实例(综合),模块基本结构,module 模块名(端口列表);端口I/O说明内部信号声明功能定义endmodule,时延,Verilog HDL模型中的所有时延都根据时间单位定义。下面是带时延的连续赋值语句实例。assign#2 Sum=A B;#2指2个时间单位。使用编译指令将时间单位与物理时间相关联。这样的编译器指令需在模块描述前定义,如下所示:timescale 1ns/100ps此语句说明时,延时间单位为1ns并且时间精度为100ps(时间精度是指所有的时延必须被限定在0.1ns内)。如果此编译器指令所在的模块包含上面的连续赋值语句,#2 代表2ns

10、。如果没有这样的编译器指令,Verilog HDL 模拟器会指定一个缺省时间单位。IEEE Verilog HDL 标准中没有规定缺省时间单位。,语言要素:标识符,所谓标识别符就是用户为程序描述中的Verilog 对象所起的名字。模块名、变量名、常量名、函数名、任务名标识符必须以英语字母(a-z,A-Z)起头,或者用下横线符(_)起头。其中可以包含数字、$符和下划线符。标识符最长可以达到1023个字符。模块名、端口名和实例名都是标识符。Verilog语言大小写敏感,sel 和 SEL 是两个不同的标识符。所有的关键词都是小写的。,语言要素:系统任务和函数,以$字符开始的标识符表示系统任务或系统

11、函数。任务可以返回0个或多个值,函数除只能返回一个值以外与任务相同。函数在0时刻执行,即不允许延迟,而任务可以带有延迟。常用于测试模拟,一般不用于源代码设计。$display(Hi,you have reached LT today);/*$display系统任务在新的一行中显示。*/$time/该系统任务返回当前的模拟时间。,语言要素:编译指令,以(反引号)开始的某些标识符是编译器指令。define 和undef,很像C语言中的宏定义指令ifdef、else 和endif,用于条件编译 include 文件既可以用相对路径名定义,也可以绝对路径 timescale 编译器指令将时间单位与实际

12、时间相关联。该指令用于定义时延的单位和时延精度。,语言要素:值集合,Verilog HDL有下列四种基本的值:0:逻辑0或“假”1:逻辑1或“真”x:未知z:高阻(x,z不区分大小写)Verilog HDL中有三类常量:整型实数型字符串型,语言要素:常量,1.整数表达方式:标准方式:默认位宽,与机器类型有关:不指明进制默认为十进制进制二进制(b或B):8b10101100,b1010十进制(d或D):4d1543,512十六进制(h或H):8ha2八进制(o或O):6O41x和z值x:不确定:4b100 xz:高阻:16hzzzz,没有驱动元件连接到线网,线网的缺省值为z。,语言要素:常量,负

13、数:在位宽表达式前加一个减号,如-8d5减号不可以放在位宽和进制之间,也不可以放在进制和具体的数之间,如8d-5下划线:只能用在具体的数字之间,如16b1010_1111_1010位数指的是二进制位数。数位扩展:(定义的长度比为常量指定的长度长)最高位是0、1,高位用0扩展:8b1111 等于 8b00001111 最高位是z、x,高位自动扩展:4bz 等于 4bzzzz数位截断:如果长度定义得更小,最左边的位被截断,如:3 b1001_0011 等于 3b011,5H0FFF等于5H1F,语言要素:常量,2.实数 十进制计数法;例如2.05.68科学计数法;23_5.1e2 其值为23510

14、.0,忽略下划线3.6E2 其值为360.0(e与E相同)实数通常不用于FPGA源代码的常量,语言要素:常量,3.字符串字符串是双引号内的字符序列。字符串不能分成多行书写。例如:INTERNAL ERROR REACHEDHERE“用8位ASCII值表示的字符可看作是无符号整数。为存储字符串“INTERNAL ERROR”,变量需要8*14位。reg 1:8*14 Message;(Message=“INTERNAL ERROR“)字符串较少用于FPGA源代码的常量,语言要素:数据类型,两大类数据类型线网型寄存器型线网型包含下述不同种类的线网子类型wire/FPGA设计中,通常只用wire型t

15、riwortriorwandtriandtriregtri1tri0supply0supply1,msb和lsb 定义了范围,并且均为常数值表达式。范围定义是可选的;如果没有定义范围,缺省值为1位线网wire Reset;wire 3:0 data_in;wire 3:2 select;wire 0:2 point;,wire msb:lsb reg1,reg2,.regN;,语言要素:数据类型,寄存器型5种不同的寄存器类型。reg/FPGA设计中,通常只用reg型,默认初始值x。integer/其他类型用于仿真timerealrealtime,msb和lsb 定义了范围,并且均为常数值表达式

16、。范围定义是可选的;如果没有定义范围,缺省值为1位寄存器reg Reset;reg 3:0 data_in;reg 3:2 select;reg 0:2 point;,reg msb:lsb reg1,reg2,.regN;,语言要素:数据类型,存储器存储器是一个寄存器数组。存储器使用如下方式说明reg msb:lsb memory1 upper1:lower1,memory2 upper2:lower2,.;reg 3:0 MyMem 63:0/MyMem为64个4位寄存器的数组。reg Bog 1:5/Bog为5个1位寄存器的数组。存储器赋值不能在一条赋值语句中完成,寄存器可以。存储器常用

17、于FPGA外围器件的仿真建模,语言要素:数据类型,存储器赋值2)系统任务赋值reg 3:0 RomB 7:0;$readmemb(ram.patt,RomB);Romb是存储器。文件“ram.patt”必须包含二进制值。文件也可以包含空白空间和注释。下面是文件中可能内容的实例。1 1 0 11 1 1 01 0 0 00 1 1 10 0 0 01 0 0 10 0 1 10 0 0 1,语言要素:数据类型,存储器赋值1)对每个单元逐一赋值reg 0:3 Xrom 0:2;.Xrom0=4hA;Xrom1=4h8;Xrom2=4hF;,语言要素:参数,参数是一个常量,常用于定义时延和变量的宽度

18、。parameter LINELENGTH=132;parameter ALL_X_S=16bx;parameter BIT=1,BYTE=8,PI=3.14;parameter STROBE_DELAY=(BYTE+BIT)/2;参数值也可以在编译时被改变。改变参数值可以使用参数定义语句或通过在模块初始化语句中定义参数值,语言要素:空白符、注释,除了字符串中的空白符,其他空白符编译被忽略注释多行注释/*/(不允许嵌套)单行注释/,习题1,1 使用timescale 编译器指令的目的是什么?2 写出产生下图所示波形的变量BullsEye的初始化语句。3 使用数据流描述方式编写下图所示的异或逻辑

19、的Verilog HDL描述,并使用规定的时延。4下列表达式的位模式是什么?7o44,Bx0,5bx110,hA0,10d2,hzF,表达式,表达式由操作数和操作符组成;表达式可以在出现数值的任何地方使用;表达式是数据流描述的基础。A&BAddr13:0+Addr23:0Count+1(a0 b0)|(a1&b1),表达式:操作数,操作数可以是以下类型中的一种:常数参数线网寄存器位选择部分选择存储器单元函数调用,表达式:操作数,常数表达式中的整数值可被解释为有符号数或无符号数;如果整数是基数型整数,作为无符号数对待。1201100的5位向量形式(有符号)-1210100的5位向量形式(有符号)

20、5b01100十进制数12(无符号)参数参数类似于常量,并且使用参数声明进行说明。例如parameter LOAD=4d12,STORE=4d10;LOAD和STORE为参数,值分别被声明为12和10。,表达式:操作数,线网线网中的值被解释为无符号数,表达式中可使用:标量线网(1位)和向量线网(多位)。wire 3:0 led;/4位向量线网。wire line;/标量线网。assign led=4ha;/被赋于位向量1010,为十进制10。,表达式:操作数,寄存器integer型的值被解释为有符号的二进制补码数,reg型或time型的值被解释为无符号数,real型和realtime的值被解释

21、为有符号浮点数。reg 4:0 state;State=5b01011;/值为位向量01011,十进制值11。State=9;/值为位向量01001,十进制值9。为何没有用assign语句赋值?,表达式:操作数,位选择位选择从向量中抽取特定的位。形式如下:net_or_reg_vectorbit_select_exprState1&State4/寄存器位选择。led0|line/线网位选择。如果选择表达式的值为x、z或越界,则位选择的值为Statex值为x。(FPGA设计中禁用),表达式:操作数,部分选择net_or_reg_vectormsb_const_expr:lsb_const_exp

22、rState 4:1/寄存器部分选择。reg 4:0 state;led 2:0/线网部分选择。wire 3:0 led;选择范围越界或为x、z时,部分选择的值为x。(FPGA设计中禁用越界),表达式:操作数,存储器单元存储器单元从存储器中选择一个memoryword_addressreg 7:0 Dram 63:0;Dram 60;/存储器的第61个单元。不允许对存储器变量值部分选择或位选择。(思考:在存储器中读取一个位或部分选择一个字?)函数调用 表达式中可使用函数调用。$time+SumOfEvents(A,B)/*$time是系统函数,并且SumOfEvents是在别处定义的用户自定义

23、函数。*/,表达式:操作符,Verilog HDL中的操作符可以分为下述类型:算术操作符关系操作符相等操作符逻辑操作符按位操作符归约操作符移位操作符条件操作符连接和复制操作符,表达式:操作符,操作符从最高优先级到最低优先级排列。同一行中的操作符优先级相同。,表达式:操作符,除条件操作符从右向左关联外,其余所有操作符自左向右关联。A+B-C等价于:(A+B)-C/自左向右A?B:C?D:F等价于:A?B:(C?D:F)/从右向左圆扩号能够用于改变优先级(A?B:C)?D:F,表达式:操作符,算术运算符+(加)(减)*(乘)/(除)%(取模)1)后三种不常用,是具体设计结构而定;2)任意操作数是X

24、或Z,那么整个结果为X;3)结果的长度由最长的操作数决定;4)reg和wire保存无符号数。,表达式:操作符,关系操作符有:(大于)=(不小于)=(不大于)1)关系操作符的结果为真(1)或假(0);2)如果操作数中有一位为X或Z,那么结果为X。,习题:求下列表达式真值23 4552=b01110,表达式:操作符,等式运算符(相等关系运算符)=(逻辑相等)!=(逻辑不等)=(全等)!=(非全等)1)如果比较结果为假则结果为0,为真结果为1;2)在全等比较中,值x和z严格按位比较。,习题:求下列表达式真值假定Data=b11x0;Addr=b11x0;求 Data=AddrData=Addr,表达

25、式:操作符,逻辑操作符有:&(逻辑与)|(逻辑或)!(逻辑非)1)只对逻辑值运算,结果一位,逻辑值1、0或x;2)对于向量操作,非0向量作为1处理;3)如果任意一个操作数包含x,结果也为x。,习题:求下列表达式真值假定:C=b0;/0为假D=b1;/1为真A_Bus=b0110;B_Bus=b0110;求 C&DC|D!DA_Bus&B_Bus A_Bus|B_Bus!A_Bus,表达式:操作符,按位操作符有:(一元非)&(二元与)|(二元或)(二元异或)或(二元异或非)操作数对应位上按位操作,并产生向量结果。,习题:求下列表达式真值假定A=b0110;B=b0100;求A|BA&B,表达式:

26、操作符,归约操作符有:&(归约与)&(归约与非)|(归约或)|(归约或非)(归约异或)(归约异或非)在单一操作数的所有位上操作,并产生1位结果。,习题:求下列表达式真值假定:A=b0110;B=b0100;MyReg=4b01x0;求&AA|B&B|MyRegMyReg,表达式:操作符,移位操作符有:(右移)1)左侧操作数移动右侧操作数表示的次数,逻辑移位,空闲位添0补位;2)如果右侧操作数的值为x或z,移位操作的结果为x。应用实例:使用移位操作为2-4解码器建模wire 3:0 DecodeOut;assign DecodeOut=4b1 Address 1:0;,习题:求Qreg的值假定:

27、reg 7:0 Qreg;Qreg=4b0111;移位Qreg 2,表达式:操作符,条件操作符根据条件表达式的值选择表达式,形式:cond_expr?expr1:expr2三目运算符wire 2:0 Student;assign Student=Marks 18?Grade_A:Grade_C;,表达式:操作符,位拼接运算符(连接和复制操作)连接操作:将小表达式合并形成大表达式的操作。形式:expr1,expr2,.,exprN复制操作:指定重复次数来执行操作。如下:repetition_number expr1,expr2,.,exprN实例:wire 7:0 Dbus,11:0 Abus;

28、assign Dbus 7:4=Dbus0,Dbus1,Dbus2,Dbus3;assign Abus=34b1011;/位向量12b1011_1011_1011)assign Abus=4Dbus7,Dbus;/*符号扩展*/,习题2,1.说明参数GATE_DELAY,参数值为5。2.假定长度为64个字的存储器,每个字8位,编写Verilog 代码,按逆序交换存储器的内容。即将第0个字与第63个字交换,第1个字与第62个字交换,依此类推。3.假定32位总线Address_Bus,编写一个表达式,计算从第11位到第2 0位的归约与非。4.假定一条总线Control_Bus 15:0,编写赋值语

29、句将总线分为两条总线:Abus 0:9 和Bbus6:1。5.编写一个表达式,执行算术移位,将Qparity 中包含的8位有符号数算术移位。6.使用条件操作符,编写赋值语句选择NextState的值。如果Current State的值为RESET,那么NextState的值为GO;如果CurrentState的值为GO,则NextState的值为BUSY;如果CurrentState的值为BUSY;则NextState的值为RESET。7.如何从标量变量A,B,C和D中产生总线BusQ0:3?如何从两条总线B usA 0:3和BusY20:15形成新的总线BusR1 0:1?,模块与端口,模块

30、:基本单元定义成模块形式module module_name(port _list);Declarations_and_Statementsendmodule端口队列port_list列出了该模块通过哪些端口与外部模块通信。,模块与端口,端口模块的端口可以是input(输入端口)、output(输出端口)或者inout(双向端口);缺省的端口类型为wire型;output或inout能够被重新声明为reg型,但是input不可以;线网或寄存器必须与端口说明中指定的长度相同。,模块与端口,例:module Micro(PC,Instr,NextAddr);/端口说明input 3:1 PC;ou

31、tput 1:8 Instr;inout 16:1 NextAddr;/重新说明端口类型:wire 16:1 NextAddr;/该说明是可选的,但如果指定了,就必须与它的端口说明保持相同长度。reg 1:8 Instr;/Instr已被重新说明为reg型,因此能在always语句或在initial语句中赋值。.endmodule,模块与端口,模块实语句一个模块能够在另外一个模块中被引用,这样就建立了描述的层次。模块实例语句形式module_name instance_name(port _associations);信号端口可以通过位置或名称关联;但是关联方式不能够混合使用。端口官廉形式po

32、rt_expr/通过位置,隐式关联.PortName(port_expr)/通过名称,显示关联,强烈推荐!port_expr可以是以下的任何类型:1)标识符(reg型或wire型)2)位选择3)部分选择4)上述类型的合并5)表达式(只适用于input型信号)Micro M1(UdIn3:0,WrN,RdN,Status0,Status1,模块与端口,使用两个半加器模块构造全加器module HA(A,B,S,C);input A,B;output S,C;assign S=A B;assign C=A/或门实例语句endmodule考虑如何模块参数化?,模块与端口,使用两个半加器模块构造全加器

33、(模块参数化)module HA(A,B,S,C);input A,B;output S,C;parameter AND_DELAY=1,XOR_DELAY=2;assign#XOR_DELAY S=A B;assign#AND_DELAY C=A/或门实例语句endmodule,模块与端口,悬空端口通过将端口表达式表示为空白来指定为悬空端口DFF d1(.Q(QS),.Qbar(),.Data(D),.Preset(),.Clock(CK);端口长度不同通过无符号数的右对齐或截断方式进行匹配module Child(Pba,Ppy);input 5:0 Pba;output 2:0 Ppy;

34、.endmodulemodule Top;wire 1:2 Bdl;wire 2:6 Mpr;Child C1(.Pba(Bdl),.Ppy(Mpr);endmodule,模块与端口,模块参数值改变1)参数定义语句(defparam)module TOP(NewA,NewB,NewS,NewC);input New A,New B;output New S,New C;defparam Ha1.XOR_DELAY=5,/实例Ha1中的参数XOR_DELAY。Ha1.AND_DELAY=2;/实例Ha1中参数的AND_DELAY。HA Ha1(NewA,NewB,NewS,NewC);endmo

35、dule,模块与端口,模块参数值改变2)带参数值的模块引用module TOP(NewA,NewB,NewS,NewC);input New A,New B;output New S,New C;HA#(5,2)Ha1(NewA,NewB,NewS,NewC);/第1个值5赋给参数AND_DELAY,该参数在模块HA中说明。/第2个值2赋给参数XOR_DELAY,该参数在模块HA中说明。endmodule,模块与端口,外部端口显式地指定外部端口。(较少使用)module Scram_B(.Data(Arb),.Control(Ctrl),.Mem_Word(Mem_Blk),.Addr(Byt

36、e);input 0:3 Arb;input Ctrl;input 8:0 Mem_Blk;output 0:3 Byte;.endmodule,习题3,1.模块实例语句与门实例语句的区别是什么?2.当端口悬空时,即端口没有被连接时,端口的值是什么?3.用本章讲述的模块FA编写执行加法和减法的4位ALU的结构模型。,门级建模,FPGA设计中较少使用Verilog HDL中提供下列内置基本门:1)多输入门:and,nand,or,nor,xor,xnor2)多输出门:buf,not3)三态门:bufif0,bufif1,notif0,notif14)上拉、下拉电阻:pullup,pulldown

37、5)MOS开关:cmos,nmos,pmos,rcmos,rnmos,rpmos6)双向开关:tran,tranif0,tranif1,rtran,rtranif0,rtranif1,用户定义原语(UDP),FPGA设计中通常不使用;UDP实例语句的语法与基本门的实例语句语法一致;UDP中可以描述组合电路和时序电路。,Primitive D_Edge_FF(Q,Clk,Data);output Q;reg Q;input Data,Clk;initialQ=0;table/Clk Data Q(State)Q(next)(01)0:?:0;(01)1:?:1;(0 x)1:1:1;(0 x)0

38、:0:0;/忽略时钟负边沿:(?0)?:?:-;/忽略在稳定时钟上的数据变化(?)?:?:-;endtableendprimitive,数据流建模,连续赋值用于数据流建模(描述),生成组合逻辑电路。连续赋值使用连续赋值语句 assign语句,格式为:assign LHS_target=RHS_expression;例如wire Z1,Preset,Clear;/线网说明assign Z1=Preset,数据流建模,连续赋值语句在什么时候执行呢?只要在右端表达式的操作数上有事件发生(值变化),表达式立即被计算,新结果就赋给左边的线网。连续赋值的目标类型(左侧操作数类型)1)标量线网 assign

39、 Z1=;2)向量线网 assign data_tmp=;3)向量的常数型位选择 assign data_tmp2=;4)向量的常数型部分选择 assign data_tmp7:0=;5)上述类型的任意的拼接运算结果 assign Z1,data_tmp15=2b10;,数据流建模,例:数据流描述的一位全加器module FA_Df(A,B,Cin,Sum,Cout);input A,B,Cin;output Sum,Cout;assign Sum=AB Cin;assign Cout=(A,数据流建模,数据流建模的时延assign#2 Sum=A B Cin;#2表示右侧表达式的值延迟两个时

40、间单位赋给Sum;时间单位是多少?由谁来决定?timescale 1ns/100psFPGA设计中的时延仅在功能仿真时有效,不影响实际电路生成。,数据流建模,数据流建模注意事项:1)wire型变量如果不赋值,默认值为z;2)数据流建模没有存储功能,不能保存数据;3)wire型变量只能在声明时赋值或者assing语句赋值;4)assign语句并发执行,实际的延迟又物理芯片的布线结果决定。5)最基本的FPGA设计源代码描述语句之一,用于生成组合逻辑,定制LUT的逻辑功能。常作为中间信号的描述用于控制寄存器的输入输出。,习题4,1.使用assign语句描述一个时钟信号clk,频率为100MHz。as

41、sign#5 clk=clk;2.请指出下列语句是否合法?描述了怎样的功能?assign Mux=(S=0)?A:bz;assign Mux=(S=1)?B:bz;assign Mux=(S=2)?C:bz;assign Mux=(S=3)?D:bz;,行为建模,过程赋值用于行为建模(描述)行为建模的主要机制:1)initial 语句主要用于仿真文件(模拟)2)always 语句用于源文件和仿真文件所有initial语句和always语句之间都是并发执行;执行顺序与其在模块中书写顺序无关。,行为建模:initial语句,initial 语句只执行一次;在模拟开始时执行,即在0时刻开始执行;不能

42、嵌套使用。initial timing_control procedural_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

43、.endparallel_block-fork.jointask_enable(user or system),行为建模:initial语句,例:reg Curt;.initial#2 Curt=1;例:parameter SIZE=1024;reg 7:0 RAM 0:SIZE-1;reg RibReg;Initialbegin:SEQ_BLK_A/顺序过程的标记,如果没有局部声明,则不需要integer Index;RibReg=0;for(Index=0;Index SIZE;Index=Index+1)RAM Index=0;end,行为建模:initial语句,initial语句在仿

44、真文件产生时钟和构造数据简单示例parameter APPLY_DELAY=5;reg 0:7 port_A;reg clk;.initialbeginPort_A=h20;#APPLY_DELAY Port_A=hF2;#APPLY_DELAY Port_A=h41;#APPLY_DELAY Port_A=h0A;initialbegin clk=0;while(1)/或者 forever clk=#5 clk;/或者#5 clk=clk;end,行为建模:always语句,always语句重复执行,语法和initial语句相同:always timing_control procedura

45、l_statement procedural_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_ena

46、ble(user or system),行为建模:always语句,两种典型的always语句1)组合逻辑(电平触发)reg c;always(a or b or sel)c=sel?a:b;说明:(1)虽然c是reg型,但综合的 结果是组合电路;(2)等同于数据流描述 wire c;assign c=sel?a:b;(3)FPGA设计中不建议使用;此外,容易产生锁存器,行为建模:always语句,两种典型的always语句2)时序逻辑(时钟沿触发)reg 8:0count;always(posedge clk or negedge reset)begin if(reset)count=0;e

47、lse begin if(count=511)count=0;else count=count+1;end end,说明:(1)在 always 语句中所有被赋值的信号必须是reg型;(2)综合为触发器,推荐使用;(3)异步时序逻辑,常见过程语句,时序控制语句仅用于仿真测试1)时序控制reg Stream;initialBegin Stream=0;#12 Stream=1;#5 Stream=0;#3 Stream=1;#4 Stream=0;#2 Stream=1;#5 Stream=0;end,常见过程语句,时序控制语句2)事件控制边沿触发事件reg 9:0addr;integer i;

48、initialbeginfor(i=0;i5;i=i+1)(posedge clk)addr=addr+1;end,电平触发事件initialbeginwait(Sum 22)Sum=0;end,常见过程语句,顺序语句块begin end源程序、测试文件块内语句顺序执行,并行语句块fork join测试文件块内语句并行执行,思考题:initial语句若使用forkjoin如何描述右图时序?,常见过程语句,问题:(1)时序电路的行为具有并行特性:寄存器都受到时钟的控制,流水线(2)既然fork join不能在源文件中使用,在行为描述中如何描述并行语句?(3)begin end中的语句是顺序执行,

49、在同一时钟边沿触发下,每个寄存器变量为何赋值有先有后?这与实际电路是否矛盾?,常见过程语句,过程赋值语句定义:initial和always语句中的赋值语句区别于数据流描述的连续赋值语句(assign)分为阻塞过程赋值和非阻塞过程赋值两种,阻塞过程赋值always(posedge clk or negedge rst)begin if(rst)/寄存器复位else if()begin a=1b1;b=a;endend,非阻塞过程赋值always(posedge clk or negedge rst)begin if(rst)/寄存器复位else if()begin a=1b1;b=a;enden

50、d,b=?,常见过程语句,结论:源代码设计推荐使用非阻塞过程赋值“=”可以有效综合为寄存器逻辑电路符合实际,时序分析简单语句之间并行执行,不再有顺序关系阻塞过程赋值“=”多用于仿真测试文件适合构造仿真模型和仿真行为不容易直接综合为FPGA资源,常见过程语句,initialbeginClr=#5 0;Clr=#4 1;Clr=#10 0;end,initialbeginClr=#5 1;Clr=#4 0;Clr=#10 0;end,常见过程语句,过程赋值与连续赋值的比较,常见过程语句,if语句与C语言类似If(condition_1)procedural_statement_1else if(c

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号