版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章硬件描述语言VerilogHDL本章概要本章介绍使用硬件描述语言VerilogHDL设计电路的编程方法,首先说明Verilog编程的基本框架结构,接着介绍Verilog的语言要素和基本语法规则,尤其是硬件描述语言中区别于其他高级语言的、能体现电路特色的语句,最后结合模块化程序设计的思想对FPGA设计常用的三种抽象级别不同、风格迥异的描述方式及运用方法进行了详细说明。硬件描述语言简介01Part1硬件描述语言简介1.1硬件描述语言的诞生硬件描述语言(HardwareDescribeLanguage,HDL)产生于20世纪80年代,顾名思义,它是一种用高级编程语言形式对电路硬件进行描述以生成或测试硬件电路的语言。硬件描述语言运用于电子设计领域,极大地促进了EDA的发展,对电路进行设计和验证的工作效率得到显著提高。1硬件描述语言简介1.1硬件描述语言的诞生硬件描述语言改变了电路设计的传统范式,可以在更高的抽象层次上描述电路的行为和结构。对于具有成千上万逻辑门的大规模逻辑电路,硬件描述语言允许设计师以接近自然语言的方式描述电路的逻辑行为,这种设计方式不仅更加精确和高效,而且易于修改和复用,能够更快速地迭代和优化设计。硬件描述语言还支持参数化设计,可以通过调整参数来快速生成不同的电路配置,极大地提高了设计的灵活性和可扩展性。这种高级别的抽象和自动化的设计流程,使得电路设计和验证变得更加快速和可靠。1硬件描述语言简介1.1硬件描述语言的诞生使用硬件描述语言设计,可以使设计和制造过程相对独立。芯片制造商可以根据市场的需求和自身的工艺优势,选择最合适的工艺技术来实现设计的电路,进一步促使芯片制造商有更大动力去研发更先进的工艺技术以提高芯片的竞争力。同时,为了满足硬件描述语言的编译、综合、布局布线的需求,以及功能和时序的验证等,开发出了一系列专业EDA工具,如Synopsys的综合工具,Cadence的布局布线工具,Mentor的仿真工具等。这些工具与硬件描述语言紧密结合,为设计师提供了便捷、高效的开发环境。1硬件描述语言简介1.2硬件描述语言的发展在40多年的发展过程中,硬件描述语言出现过上百种,有些是昙花一现,有些是近年来伴随着SOPC芯片的出现应运而生,比如SystemVerilog、SystemC等系统级语言。而长期保持主流、应用最为广泛的硬件描述语言有VHDL和VerilogHDL两种,他们被IEEE认定为标准语言。1硬件描述语言简介1.2硬件描述语言的发展VHDL是VeryHighSpeedHardwareDescriptionLanguage的缩写,意思是超高速硬件描述语言,由美国国防部于1982年推出。VHDL在1987年被IEEE认定为标准硬件描述语言,推出IEEE1076标准。后于1993年进行了修订,因此VHDL有87版和93版两个版本在使用中。1硬件描述语言简介1.2硬件描述语言的发展VerilogHDL是1983年由美国GDA(GatewayDesignAutomation)公司开发的硬件描述语言,适用于电子系统设计的所有阶段,支持硬件设计的开发、验证、综合和测试。VerilogHDL在1995年正式成为IEEE标准(1364-1995)。1硬件描述语言简介1.2硬件描述语言的发展VHDL程序一般由库(LIBRARY)、实体(ENTITY)、结构体(ARCHITECTURE)三部分组成。库用来声明需要使用的库和程序包实体用来描述电路器件的信号端口等外部情况结构体负责描述电路器件的内部逻辑功能VerilogHDL虽然也需要描述同样的内容,但是没有VHDL那么繁复的格式要求,风格更为灵活。1硬件描述语言简介1.2硬件描述语言的发展以半加器设计为例,两种硬件编程语言的代码比较。VHDL代码:libraryIEEE;//库useIEEE.STD_LOGIC_1164.ALL;entityHalfAdderis//实体port(A:inSTD_LOGIC;B:inSTD_LOGIC;S:outSTD_LOGIC;C:outSTD_LOGIC);endHalfAdder;architectureBehavioralofHalfAdderis//结构体beginS<=AxorB;C<=AandB;endBehavioral;VerilogHDL代码:moduleHalfAdder(inputA,inputB,outputS,outputC);
assignS=A^B;assignC=A&B;endmodule1硬件描述语言简介1.2硬件描述语言的发展从硬件描述语言的共性来说,VHDL和VerilogHDL都可以实现门级、RTL级和行为级这三个层次上的电路描述,既能够抽象表示电路的行为,也能够具体描述电路的结构,都具有电路仿真与验证机制以保证设计的正确性。但VHDL的描述风格严谨,语言特点让它更适合行为级描述。而VerilogHDL的语言包含大量RTL和门电路级别描述,更贴近电路。它类似C语言的语法结构和关键字,对有软件编程背景的人来说较为容易上手。第3章硬件描述语言VerilogHDL模块与端口02Part2模块与端口2.1模块结构VerilogHDL语言中的模块是构建数字系统的基本单位,描述某个电路块的功能或内部结构以及该电路与其他电路进行通信的外部端口。2模块与端口2.1模块结构模块提供了一种结构化和层次化的方法来描述硬件电路。每个模块就像是一个封装好的电路单元,具有明确的输入和输出接口,所以每个模块是独立的,同一个模块可以在不同的设计项目中重复使用。2模块与端口2.1模块结构VerilogHDL的模块结构电路描述门级描述数据流描述(RTL级)行为级描述module模块名(端口列表);变量声明任务和函数(可选)endmodule参数(可选)端口声明2模块与端口模块框架module和endmodule这两个关键字表明了模块的开始和结束,共同组合成模块的框架。模块的先后顺序不影响它们的执行顺序。moduleA……endmodulemoduleB……endmodule2模块与端口模块框架即使模块有层级关系,模块B的电路是模块A电路的一部分,模块代码也不能写成嵌套形式。错误写法:moduleA……
moduleB
……
endmodule……endmodule一个程序文件里有多个模块,通过module-endmodule组合可以明确区分出各个模块。2模块与端口模块第一行1模块的第一行首先写出关键字module,后面紧跟模块名和端口列表,最后以分号(;)结束。2模块名是自定义的标识符,帮助模块定位。3端口列表写在模块名后面的()里,有两种书写方式。仅列出电路模块所有输入端口和输出端口的名称把完整的端口声明写在()里。2模块与端口声明模块里的声明主要包含端口声明和变量声明。端口声明是对电路外部接口在类型、名称、位宽等特性的定义。如果模块第一行的()里仅列出了端口名称,那么在第一行下面要写出所有端口的声明语句。变量声明是对电路内部变量进行类型、名称、位宽等特性的定义,遵循“定义后使用”的原则,只有经过声明的变量才能在模块主体中用于描述电路,并且在不同的描述风格中必须使用相应类型的变量。2模块与端口电路描述电路描述是VerilogHDL模块的主体,体现电路的结构或行为。Verilog允许使用门级描述、数据流描述和行为级描述等不同抽象级别的描述方式。2模块与端口可选部分参数是用来定义常量的标识符,在编译时为模块提供可配置的常数值,从而灵活地实现模块的复用。任务主要用来在测试平台中进行数据显示或者辅助时序逻辑控制。函数是用于实现从输入到输出的映射关系的结构,仅有一个返回值,常用于实现复杂的计算或数据转换。2模块与端口例3.1使用VerilogHDL语言描述一个上升沿D触发器。moduledff(q,clk,data);outputq;inputclk,data;regq;always@(posedgeclk)q=data;endmodule电路描述(行为级描述)端口声明变量声明模块名dff2模块与端口例3.2使用VerilogHDL语言描述一个SR锁存器。2模块与端口2.2端口端口是VerilogHDL模块与外部环境之间的通道,代表着电路对外的接口。端口声明的基本格式如下:端口类型[端口宽度]端口名;2模块与端口端口类型其中,inout声明的双向端口兼具输入端口和输出端口的功能。关键字端口类型input输入端口output输出端口inout
双向端口VerilogHDL端口类型说明2模块与端口端口宽度端口的宽度可以是1位,也可以是多位,默认是1位端口。矢量端口必须注明位数(宽度),位数写在[]里,可以按照两种方式声明:[LSB:MSB]或者[MSB:LSB]其中LSB(LeastSignificantBit)为最低有效位,MSB(MostSignificantBit)为最高有效位。如:inputclk;//1位输入端口output[7:0]bcd;//8位输出端口,左边是最高位2模块与端口端口宽度宽度超过1位的端口,在端口列表处也只需要写出端口名,不需要写宽度,如:moduledb(clk,bcd);//bcd在端口列表只写端口名inputclk;output[7:0]bcd;2模块与端口端口声明的两种写法端口列表和端口声明可以分开,也可以合并。分开时模块第一行的端口列表里只写端口名称,详细信息写在端口声明语句里,每条语句用分号表示结束。只有类型相同且位宽相同的端口才可以写在同一条语句里。合并的情况是把端口声明搬入端口列表,同时把每条语句结尾的分号(;)改为逗号(,)。如例3.1可以写成moduledff(outputregq,inputclk,data);always@(posedgeclk)q=data;endmodule例3.2可以写成moduleSR_latch(outputQ,Qbar,inputSbar,Rbar);nandn1(Q,Sbar,Qbar);nandn2(Qbar,Rbar,Q);endmodule2模块与端口端口声明的两种写法modulefull_adder(sum,c_out,a,b,c_in);outputsum,c_out;inputa,b,c_in;
……//电路描述endmodule2模块与端口端口声明的两种写法例3.3根据图3-2所示的元件符号,写出全加器模块的基本框架和端口声明。第3章硬件描述语言VerilogHDL数值与变量03Part3数值与变量关键字关键字是在程序中起到指定用途的字符组合以下是部分VerilogHDL常用关键字的说明。module和endmodule用于定义模块的开始和结束input和output用于定义I/O端口always用于描述电路的逻辑行为assign用于连续赋值begin和end用于将多条语句组合在一起case和endcase用于实现多路选择结构wire和reg用于声明变量类型for用于迭代和循环if和else用于条件语句integer用于定义数据类型3数值与变量关键字VerilogHDL的关键字全部采用小写字母,详见附录1。3数值与变量标识符VerilogHDL代码中的标识符用于表示模块名称、端口名称、实体名称、变量名称等。VerilogHDL的标识符是任意大小写字母、数字、$符号和_(下划线)符号的组合,但是第一个字符必须是字母或者下划线。区分大小写。以下是合法的标识符:counterSYS_CLKsys_clk_ADD_T1231$ad其中SYS_CLK和sys_clk因为大小写字母的区别,认定为两个不同的标识符。以下是不合法的标识符:58ant_CLK*well19790207?wew3数值与变量标识符为了保持代码的一致性和可读性,建议在使用标识符时遵循一定的规范。例如,不建议在标识符中使用大小写混合,普通内部信号建议全部小写,并且信号命名最好能体现信号的含义,使其简洁、清晰、易懂。3数值与变量注释为增加代码的可读性,VerilogHDL支持两种注释方式:①注释单行文本,使用//(双斜杠)符号,VerilogHDL忽略从此处到本行末尾的内容。这种方式常用于说明文字或备注较短的情况。②注释多行文本,使用/*……*/符号,编译时将忽略其中注释的内容。这种方式适用于代码的辅助说明较为复杂需要占用多行的情况。3数值与变量注释以下是两个常见的单行注释,用于解释一条程序语句。a=b&&c;//a是b和c相与的结果setStartPosition(nX,nY);//设置起始坐标以下是一个常见的多行注释,使用/*……*/符号。/*ProjectDescription:Theprojectisstartedfrom2024/1/1,willbefinishedinJune.*/3数值与变量注释注释符不仅用于程序语句和程序块的说明,也常用于对整个程序的信息发布,下面是一个常见的程序开头说明,使用//符号。//************************************************//创建日期:2024-01-01//开发者:王明//项目名称:XXX//************************************************多行文本的注释不允许进行嵌套,在/*……*/符号里又出现/*……*/是非法注释。如/*Thisis/*anillegal*/comment*/就是一个非法注释的例子。3数值与变量数字格式为了便于阅读或计算,VerilogHDL程序中允许使用多种形式的数值,基本的数字格式为:<位数>’<进制格式><数值>其中,<位数>是指该数值转换为二进制形式的位数,进制是数值的表现形式,与<数值>相一致进制格式进制进制格式有效值二进制Borb0,1,x,X,z,Z,?,_八进制Ooro0~7,x,X,z,Z,?,_十进制Dord0~9,_十六进制HorH0~9,a~f,A~F,x,X,z,Z,?,_3数值与变量数字格式没有标明进制格式的,默认为十进制,如1234。所有数值必须符合进制格式的有效范围,否则视为无效。VerilogHDL数值可以指定位数,也可以不指定位数。不指定位数时,<位数>位置的数据省略,默认为32位。如:‘hc3
//8位,十六进制数,默认为32位
‘o21
//6位,八进制数,默认为32位常见的数值表现为:4’b1111//4位,二进制数12’habc//12位,十六进制数16’d255//16位,十进制数3数值与变量四值逻辑根据IEEE1364标准,VerilogHDL语言运用四值逻辑,即用四种逻辑状态表示数据的状态:0、1、X和Z。0:逻辑0或条件为假1:逻辑1或条件为真X:未知态或不定态Z:高阻抗态3数值与变量信号强度信号强度及其属性按照从强到弱的排列顺序:strong:驱动pull:驱动large:存储weak:驱动medium:存储small:存储highz:高阻态强弱3数值与变量字符X和Z字符X和x代表未知状态,字符Z和z代表高阻状态。不区分大小写。当X和Z出现在数值末尾时,代表了后面的所有位数。12’h13x//12位十六进制数,低4位未知6’hx//6位x32’bz//32位高阻值3数值与变量参数参数来配置电路的信号位宽、功能行为等,使用parameter定义。在未改变模块主要逻辑结构的情况下,可以通过改变参数来改变电路的属性,从而提高代码的复用性。参数的声明格式为:parameter参数1=表达式1,参数2=表达式2,…,参数n=表达式n;如:parametermsb=7;//定义一个参数msb,代表常数7与参数匹配的表达式里也可以引入另一个参数。如:parameterbyte_size=8,byte_msb=byte_size-1;//定义了两个参数byte_size和byte_msb,后一个参数的表达式里包含了前一个参数3数值与变量下划线_在VerilogHDL中,下划线的主要作用是增加程序的可读性。当它用在数值中,符号“_”可以出现在数字中间的任何位置,以增加数值的可读性。比较12’b111100001010和12’b1111_0000_1010下划线还可以用于命名标识符,体现模块名或变量名中的层次或分类,如test_counter_4bit。3数值与变量3.3变量VerilogHDL支持多种类型的变量定义。主要分为线网(net)和寄存器(register)两大类。3数值与变量线网型变量线网型(net)变量用于连接不同的硬件模块元件。它表示结构实体之间的物理连接,类似于电子线路中使用的导线,可以传输信号,但没有电荷保持作用。线网型变量有wire、tri、wor、trior、wand、triand、tri0、tri1、supply0、supply1、trireg共11种,如表3.3.2所示,其中只有wire、tri、supply0、supply1是“可综合”的,可以用于硬件实现和系统仿真,其余6种只能用于系统仿真。线网型变量不能储存值,它必须连接驱动,如果没有驱动连接到线网型变量上,它就呈现高阻状态,其默认值为Z(trireg除外)。3数值与变量线网型变量线网类型变量说明关键字说明关键字说明关键字说明wire连线tri三态线网supply0用于对“地”建模wand线与triand三态线与supply1用于对“电源”建模wor线或trior三态线或uwire连线,用于避免多驱动tri0三态下拉线网tri1三态上拉线网trireg三态寄存器3数值与变量线网型变量wire是最常使用的线网型数据类型,在模块中,wire型变量可以作为电路连线使用。除了声明,wire型数据通常使用连续赋值语句assign对其进行赋值。wire变量的定义格式为:wire[MSB,LSB]变量1,变量2,…,变量n;如:wirea;
//定义一个1位wire变量awire[7:0]busA,busB;
//定义两个8位wire变量wire[15:0]bus;
//定义一个16位wire变量assignbus={busA,busB};
//给bus变量赋值3数值与变量线网型变量在进行模块端口声明时,如果没有明确指出端口数据类型,这个端口被默认为wire型数据。如定义语句为inputa;和outputb,c;这里的a、b、c默认为wire类型,具备wire变量的特性。3数值与变量寄存器型变量寄存器型变量是VerilogHDL语法中的概念,与电路硬件中的寄存器不同,它是一个储存数据的变量,用于电路的行为级建模。寄存器型变量可以始终保持其状态的值,直到被新的值覆盖。因此,没有驱动的寄存器型变量或者是未初始化的变量,它们可能包含任何值,因此默认值视为X,意思是未知的。仅在变量声明时,或者在initial和always过程块中,才可以给寄存器型变量赋值。寄存器变量用在initial和always过程块中,可以接受任何变量或表达式的赋值。3数值与变量寄存器型变量常用的寄存器类型变量有reg、integer、time、real等常用寄存器类型变量说明寄存器类型功能说明reg可定义位宽的寄存器型变量integer32位有符号的整数型变量real64位有符号的实数型变量time64位无符号的时间变量3数值与变量reg变量寄存器型变量中,reg是最常使用类型,也只有reg是确定“可综合”的,既可以用于硬件实现,也可以用于系统仿真。reg变量的定义格式为:reg[MSB:LSB]变量1,变量2,…,变量n;定义reg变量的时候要定义位宽,用[MSB:LSB]表示位宽范围,通常按照数字系统的书写习惯把最高位放在左边,最低位放在右边。没有书写位宽的默认是1位变量。3数值与变量reg变量如:regclock;//定义一个1位reg变量clockreg[3:0]addr_a;//定义一个4位的变量addr_aaddr_a=4’b0011;//给寄存器变量add_a赋值integer、real和time变量有固定位宽,定义语句中只需要写明变量名称,不需要定义位宽。3数值与变量integer变量integer定义有符号整数,可以表示出正整数、零和负整数,可用于算术运算、关系运算和循环控制。integer变量通常不被直接综合为硬件寄存器。integer变量的定义格式为:integer变量1,变量2,…,变量n;如:integerA,B,C;//定义3个整数型变量,每个变量都是32位有符号数3数值与变量real变量real类型在Verilog中用于表示浮点数,它提供了高精度的数值表示和运算能力。然而,由于浮点数运算在硬件实现中相对复杂且资源消耗大,real类型变量通常也不被综合到硬件中,而是用于仿真中的精确数值计算。real变量的定义格式为:real变量1,变量2,…,变量n;如:realdelta;//定义一个64位实数型变量,只可用于仿真,不可综合3数值与变量time变量time变量是一种特殊类型的变量,主要用于存储和处理仿真时间相关的信息。time类型变量不能综合到硬件中,它主要用于仿真中的时间控制和延迟建模。time变量的定义格式为:time变量1,变量2,…,变量n;如:timetime_a;//定义一个64位的时间变量3数值与变量与端口连接的变量VerilogHDL对与端口连接的信号变量类型的规则。3数值与变量与端口连接的变量从端口看:input端口仅用于将外部信号输入电路,默认为线网类型,可以接受外来的wire或者reg型变量的赋值。output端口仅用于将电路产生的信号送出去,在模块内可以定义为wire或者reg类型,出了模块后作为线网类型的变量。inout端口既可以作为输入也可以作为输出使用。无论是它自己的端口定义还是与它连接的变量,都必须是线网类型。3数值与变量与端口连接的变量从模块看:一个模块的端口,无论是input还是output端口,因为本身具备net变量的特性,在声明时默认为wire类型。从模块外部看,连接input端口的信号可以是net或者reg型,连接output和inout端口的信号必须为net型。从模块内部看,input和inout端口只能是net(wire)型,而output端口可以是net或者reg型。在module-endmodule框架内进行的电路描述,属于模块内部描述,通常只会给输出端口赋值。3数值与变量与端口连接的变量如果Verilog代码采用结构化描述或者数据流描述,输出端口保持wire类型。如果采用的是行为描述,输出端口必须显式地声明为reg类型。原本声明的端口outputQ;应该重新声明为regQ;3数值与变量与端口连接的变量分析:电路模块OUTER的端口和变量声明如下:inputO1;O2;O3;//OUTER模块的输入端口outputQ1,Q2;//OUTER模块的输出端口wirewire_o;//OUTER模块内的wire变量regreg_o;//OUTER模块内的reg变量例3.4如图3-4所示,大电路模块OUTER里包含小电路模块INNER,试分析INNER各端口能够连接的信号类型。3数值与变量与端口连接的变量电路模块INNER的端口和变量声明如下:inputI1,I2;//INNER模块的输入端口outputY1,Y2;//INNER模块的输出端口wirewire_inn;//INNER模块内的wire变量regreg_inn;//INNER模块内的reg变量3数值与变量与端口连接的变量所有的输入输出端口都默认为线网(wire)类型。①INNER模块的输入端口I1既可以接受来自端口O1、O2、O3的赋值,也可以接受线网变量wire_o和寄存器变量reg_o的赋值,它们对于I1来说都是来自INNER模块外部的信号。I1=wire_o;和I1=reg_o;这两条语句都是成立的。I1作为端口等同于wire型变量可以赋值给INNER模块内部的任何信号,如wire_i=I1;和reg_i=I1;I2与I1同理。②INNER的输出端口Y1可以接受模块内部的reg或者wire的值,Y1=wire_inn;和Y1=reg_inn;都是成立的。只是,在行为建模方式下,输出端口Y1必须声明为reg类型才能使用,也就是将端口声明outputY2;改为outputregY2;这样才能接受赋值。在模块外部,Y1作为输出端口等同于wire型变量跟其他信号连接。Y2与Y1同理。3数值与变量标量与矢量变量的使用有标量和矢量之分。标量是1个位的变量,矢量是由多个位组成的集合。标量通常用于表示简单的信号或控制线,如使能信号、时钟信号等。矢量用于表示更为复杂的数据量或控制量,如地址总线、寄存器存储等。如:inputclk;//1位的时钟信号wiresto;//1位数据wire[7:0]data;//8位的数据总线reg[31:0]address;//32位的地址寄存器3数值与变量标量与矢量信号传输时,常常涉及到标量和不同位宽的矢量,需要注意位宽的匹配和位数的对齐。标量与矢量连接,需要指定矢量中的某一位与标量连接。取出矢量中的一个或多个位用[],格式为:矢量名[位号]或者矢量名[位号范围]如:data[2]=sto;//将一个标量指定连接到矢量的第2位address[7:0]=data;//将8位矢量data对应连接到32位矢量address的低8位第3章硬件描述语言VerilogHDL赋值语句04Part4赋值语句VerilogHDL的赋值语句由赋值对象、赋值符号和表达式三部分组成,格式如下:赋值对象<赋值符号>表达式;赋值语句从右往左执行,以分号结束,将表达式的值通过赋值运算送给赋值对象。赋值对象是已经声明过的线网型或寄存器型的变量或变量组合。VerilogHDL赋值分为连续赋值和过程赋值两种类型,可以使用“=”或“<=”两种赋值符号,符号的右边可以是任何可求值的表达式。4赋值语句4.1连续赋值语句连续赋值语句用来驱动net类型的变量,比如wire型。在VerilogHDL中,连续赋值语句使用关键字assign引导。语句格式为:assign变量名=赋值表达式;如:wirea,b;
assigna=b;又如:wire[3:0]A,B;output[3:0]Z;
assignZ=A&B;//端口默认为wire变量4赋值语句4.1连续赋值语句可以指定赋值给变量中的某一位或者某几位。如:wire[3:0]A,B,C,D; assignA[2]=B[3]; assignC[2:0]=D[2:0];也可以在赋值运算中加入拼接运算。如:wirea,b;wire[1:0]w1,w2; assign{a,b}=w1; assignw2={a,b};4赋值语句4.2过程赋值语句过程赋值语句是在initial或者always过程块中使用的赋值语句,不需要另外使用关键字。过程赋值将表达式的值赋给变量,变量将保留该值,直到下一次对该变量赋值时进行更新。过程赋值只能对寄存器型的变量赋值,如reg型等。4赋值语句4.2过程赋值语句过程赋值语句有两类赋值运算:阻塞(blocking)赋值,其运算符为“=”;非阻塞(non-blocking)赋值,其运算符为“<=”。即:阻塞性过程赋值:变量=表达式;非阻塞性过程赋值:变量<=表达式;4赋值语句阻塞性过程赋值阻塞性赋值语句顺序执行。从一条语句内部来看,赋值时先计算右边表达式的值,然后立即更新左边的变量,在这个过程中,不允许任何其他Verilog语句的干扰,直到当前的赋值操作完成。从多条语句来看,后一条语句必须在前一条语句完成后才能执行。因此,阻塞性赋值的特点是,在前一条语句赋值完成之前,后一条语句不会执行,可以看成前面的语句“阻塞”了后面的语句执行。4赋值语句阻塞性过程赋值例如下列语句,作为在一个语句块中的语句,它们会按照从上到下的顺序依次执行,变量按照T1→T2→T3→Count的顺序依次赋值。begin
T1=A&B;T2=B&Cin;T3=A&Cin;Count=T1&T2&T3;end4赋值语句非阻塞性过程赋值非阻塞性赋值语句并行执行。先计算每条赋值语句右边的表达式,然后在指定时刻,如仿真时间结束或时钟边沿,将语句块里面的所有赋值语句同时执行,即右边计算所得的值同时赋值给左边的寄存器变量。比如在always块中always@(posedgeclk)begin
a<=b; c<=d;end4赋值语句非阻塞性过程赋值再比如执行下列语句,假设程序运行之前RegA=16,RegB=24。beginRegA<=8;RegB<=RegA;RegC<=RegB;end执行完语句块之后,可以得到RegA=8,RegB=16,RegC=24。4赋值语句非阻塞性过程赋值综上所述,由于两种赋值语句的不同特点,组合逻辑通常使用阻塞性赋值语句,时序逻辑通常使用非阻塞性赋值语句。不要在一个always过程块中混合使用阻塞性和非阻塞性赋值。第3章硬件描述语言VerilogHDL运算符05Part5运算符运算符是构成表达式的重要组成部分,VerilogHDL提供的运算符按照功能可分为9类:算术运算符位运算符缩位运算符逻辑运算符赋值运算符关系运算符移位运算符条件运算符拼接运算符5运算符5.1运算符类型根据运算符所带操作数的数量不同,运算符又可分为三种:单目运算符、双目运算符和三目运算符。单目运算符可以带一个操作数,操作数放在运算符的右边。格式为:变量=<运算符>操作数;双目运算符可以带二个操作数,操作数放在运算符的两边。格式为:变量=操作数1<运算符>操作数2;三目运算符可以带三个操作数,用三目运算符的组合符号分隔开。5运算符5.1运算符类型类型符号功能说明类型符号功能说明算术运算符(双目运算符)+-*/%二进制加二进制减二进制乘二进制除求模关系运算符(双目运算符)>
<
>=<===!=大于小于大于或等于小于或等于等于不等于逻辑运算符(双目运算符)!&&||逻辑非逻辑与逻辑或位运算符(双目运算符)~&|^^~或~^按位取反按位与按位或按位异或按位同或缩位运算符(单目运算符)&~&|~|^^~或~^缩位与缩位与非缩位或缩位或非缩位异或缩位同或移位运算符(双目运算符)>>
<<
右移左移条件运算符(三目运算符)?
:条件运算拼接运算符{}拼接运算赋值运算符=<=阻塞赋值非阻塞赋值
5运算符5.2运算符优先级运算符的优先级影响到表达式的计算顺序,从而影响到计算结果的正确性。在VerilogHDL中,括号()的优先级高。运算符的优先级低高5运算符5.2运算符优先级在设计电路时,如果要改变运算的优先级,可以结合括号()使用。如算式a&&b||c,运算顺序为先与后或,改成a&&(b||c)运算顺序是先或再与。5运算符算术运算符在Verilog-1995标准中定义了5种算术运算符:加(+)、减(-)、乘(*)、除(/)、取余(%)名称符号说明加a+b两个数相加减a-b两个数相减,或者取1个操作数的负数(补码)乘a*b两个操作数相乘除a/b两个操作数相除,b不能等于0取余a%b%两侧的数据必须为整型数据,b不能等于05运算符位运算符按位运算符即操作数按照对应的bit分别进行逻辑运算。名称符号说明按位取反~将一个多位操作数的每一位取反按位与&两个多位操作数按位对齐,对应位进行与运算按位或|两个多位操作数按位对齐,对应位进行或运算按位异或^两个多位操作数按位对齐,对应位进行异或运算按位同或^~或~^两个多位操作数按位对齐,对应位进行同或运算5运算符位运算符在位上进行的与运算、或运算和异或运算遵循数字电路的逻辑运算规则。或运算真值表与运算真值表&01XZ00000101XXX0XXXZ0XXX|01XZ001XX11111XX1XXZX1XX5运算符位运算符进行按位运算,原来的操作数有多少位,计算后结果仍然为多少位,保持位数不变。当双目运算的两个操作数位数不同时,较短的操作数左端自动用0补充。异或运算真值表^01XZ001XX110XXXXXXXZXXXX5运算符缩位运算符缩位运算符又称归约运算符,包含缩位与(&)、缩位与非(~&)、缩位或(|)、缩位或非(~|)、缩位异或(^)和缩位同或(^~或~^)共6种。名称符号说明缩位与&对一个多位操作数从最高位开始依次按位进行与运算,直到最低位缩位与非~&对一个多位操作数从最高位开始依次按位进行与非运算,直到最低位缩位或|对一个多位操作数从最高位开始依次按位进行或运算,直到最低位缩位或非~|对一个多位操作数从最高位开始依次按位进行或非运算,直到最低位缩位异或^对一个多位操作数从最高位开始依次按位进行异或运算,直到最低位缩位同或^~或~^对一个多位操作数从最高位开始依次按位进行同或运算,直到最低位5运算符逻辑运算符逻辑运算是对操作数进行逻辑关系的运算,运算符包括逻辑与(&&)、逻辑或(||)、逻辑非(!)3种。a
ba&&ba||b!a!b1
111000
101101
001010
000115运算符逻辑运算符A&&B=4’b0001A&B=4’b1000&A=&B=1’b0例3.5已知A=4’b1101,B=4’b1010,求A&&B,A&B,&A,&B。5运算符关系运算符关系运算符都是双目运算符,对两个操作数的大小进行比较,分为小于(<)、小于等于(<=)、大于(>)、大于等于(>=)四种,返回值为1,说明声明的关系为真;返回值为0,说明声明的关系为假。如果任何一个操作数包含X或Z,则运算结果为不确定,返回值为X。等式运算符衡量两个操作数相等或不等的关系,包括逻辑相等(==)、逻辑不等(!=)、全等(===)和不全等(!==)四种,得到的结果是1位的逻辑值。如果得到的结果为1,说明声明的关系为真;如果得到的结果为0,说明声明的关系为假。5运算符关系运算符==10XZ110XX001XXXXXXXZXXXX===10XZ1100000100X0010Z00015运算符移位运算符移位运算符有两个操作数,左边的操作数是待移位的数据,每次只移动1位,右边的操作数移动的次数以4位数Q3Q2Q1Q0逻辑左移1位为例5运算符移位运算符名称符号说明逻辑左移<<
第一个操作数向左移动由第二个操作数指定的位数,产生的空位用0填补逻辑右移>>
第一个操作数向右移动由第二个操作数指定的位数,产生的空位用0填补算术左移<<<
第一个操作数向左移动由第二个操作数指定的位数,产生的空位用0填补算术右移>>>
第一个操作数向右移动由第二个操作数指定的位数。如果第一个操作数为无符号数,则产生的空位用0填充;如果第一个操作数为有符号数,则符号位用原符号位填充,其余空位用0填充5运算符移位运算符如reg[5:0]a,c;reg[7:0]b;a=6'b101001;b=a<<2;//b=8'b10100100c=a>>2;//c=6'b001010如果要移位的操作数中含有X或Z,移位结果为X。5运算符条件运算符条件运算符格式为:变量=条件表达式?表达式1:表达式2;如果条件表达式为真(值为1),将表达式1的值赋给变量;如果条件表达式为假(值为0),将表达式2的值赋给变量。条件运算可以用于简化if-else语句的书写和提高代码的可读性。5运算符拼接运算符拼接运算符将把两个或多个信号的某些位拼接起来的运算操作,将小表达式合并成大表达式,或者将几个位数少的数据合并为一个位数多的数据,合并结果的位宽是各个参与拼接运算数据的位宽之和。如A=1’b1,B=2’b10,C=2’b00则{B,C}=4’b1000//左B右C,使用B和C的全部数据{A,B[1],C[0]}=3’b110//使用A的全部和B、C的其中各一位{A,B,C,3’b101}=8’b11000101//使用A、B、C的全部,再添加一个3位数常量5运算符拼接运算符如{4{A}}=4’b1111//重复4次A{2{A},2{B},C}=8’b11101000//重复2次A,2次B,再添加C拼接运算符可以嵌套使用,对同一个操作数的重复拼接使用双重大括号构成的运算符{{}},区分开操作数和重复次数。第3章硬件描述语言VerilogHDL电路描述方式06Part6电路描述方式6.1三种描述方式VerilogHDL有三种主要描述方式分别是结构化描述、数据流描述和行为级描述,它们从不同的抽象层级上描述数字电路,编写代码时每种描述方式都有其有各自的典型语句和基本构成,三种描述方式在综合建模的区别主要体现在电路的综合结果和对硬件资源的映射上。6电路描述方式6.1三种描述方式结构化描述是最接近电路硬件结构的描述方式,抽象级别最低。它像在面包板上搭建数字电路一样,通过各种实例化语句来实现单元电路和模块,主要用于层次化的模块划分和IP核调用。数据流描述又称为寄存器传输级(RTL)描述,抽象级别较高,不需要清晰地刻画具体的数字电路架构,而是使用连续赋值语句比较直观地表达数据的流动,从而实现电路功能。行为描述具有最高抽象级别,不关注电路的具体实现,只描述电路的行为。行为描述语句类似于高级编程语言,可读性和可维护性最好,因此设计速度快,能快速实现功能原型。这适用于高层次算法描述和大型系统设计。6电路描述方式6.2模块化设计思想现代工业生产中流行一种模块化设计的思想,把产品的子系统制作成通用性的模块,各种通用模块进行组合可以产生不同功能或应用的产品。这种设计方式日渐成熟,模块化设计也逐渐成为现代软件设计的重要思想。将系统分解为多个独立、可互换的模块,每个模块实现特定的功能,并可以独立于其他模块进行设计、开发和测试,提高设计的可维护性、可扩展性和复用性。在EDA领域的常见的IP设计就是模块化思想的重要体现。在代码层面,VerilogHDL语言中的模块例化集中体现了模块化设计的思想。在Verilog中,模块例化也称为实例化,其过程是将预先设计好的模块(子模块)嵌入到另一个模块(通常是顶层模块)中,这种操作类似于在软件编程中调用一个函数。通过端口映射,可以将顶层模块的信号连接到子模块的端口,从而实现复杂设计的模块化。6电路描述方式6.2模块化设计思想例如,要设计一个4位脉动进位计数器,它是由4个一模一样的T触发器级联而成,按照模块化设计的思想,可以把T触发器作为一个子模块进行独立设计,再在顶层程序中进行模块例化,且例化四次,就相当于使用4个T触发器“组装”了一个4位脉动进位计数器电路。6电路描述方式6.2模块化设计思想一个T触发器是一个D触发器和一个反相器的组合,D触发器和反相器也可以看作T触发器的子模块,D触发器可以独立设计,反相器即非门6电路描述方式6.3自顶向下设计自底向上设计是传统数字电路的设计方法,从底层的基本电路开始设计,再逐步将电路模块集成起来,一级级进化到完整的电路系统6电路描述方式6.3自顶向下设计自顶向下设计是一种高层次抽象的设计方法,它从系统性分析入手,将复杂的电路系统逐级分解为更具体的子模块,便于各自独立完成设计和验证,从而加快电路设计的进度和流程。4位脉动进位计数器,按照自顶向下的设计可分为三个层级:第一级:脉动进位计数器第二级:T触发器第三级:D触发器和反相器这里第一级的模块是顶层模块,第三级是最底层模块,如图3-15所示。图3-154位脉动计数器自顶向下设计6电路描述方式6.3自顶向下设计1第一步:确定顶层功能需求。首先明确系统需要实现的功能和性能要求。这可能涉及到对用户需求、市场趋势和技术限制的分析和评估。2第二步:划分系统层次结构。根据功能需求,将系统划分为不同的层次或模块。每个层次或模块负责特定的功能或任务,并且它们之间通过接口进行通信。3第三步:设计模块接口。定义每个模块之间的接口,包括输入输出信号、数据格式和通信协议等。这些接口应该清晰明确,以便不同模块之间的协作和集成。4第四步:设计模块功能。针对每个模块,详细设计其内部结构和算法。这可能涉及到硬件电路设计、软件程序编写或其他相关技术。5第五步:验证和测试。对每个模块进行独立验证和测试,确保其功能正确性和性能满足要求自顶向下设计的过程通常包括以下几个步骤:6电路描述方式6.3自顶向下设计6电路描述方式6.3自顶向下设计自顶向下设计是一种有效的系统设计方法论,它从系统的整体功能需求出发,逐步分解到各个子系统和模块的具体实现。这种方法强调在设计的初期就明确系统的总体架构和各部分之间的关系,以确保整个系统的协调一致和高效运作。它能够帮助设计师从全局视角出发,逐步构建出结构清晰、功能完善的系统。第3章硬件描述语言VerilogHDL结构化描述07Part7结构化描述结构化描述源于模块化设计思想,把电路看成是一个个模块组合而成,就像积木搭建一样,只需要描述清楚各个模块之间的连接方式,就实现了对整个电路的建模。使用结构化描述方式依赖于对电路结构的掌握,通过实例化(Instantiation)语句设计电路。7结构化描述7.1门级描述原语(Primitive)是VerilogHDL预先定义的逻辑功能单元,可用于构建数字电路的基本单元电路。原语分为两大类:内置原语和用户自定义原语(UDP)。内置原语实现较小的电路单元,用户自定义原语允许用户根据需求创建更复杂的逻辑功能模块。本书只介绍内置原语。7结构化描述内置原语内置原语有八种:and、nand、or、nor、xor、xnor以及not和buffer7结构化描述内置原语根据输入输出端口的特点,门级原语可以分为两类:一类是具有多个输入,单个输出的电路,包括and、nand、or、nor、xor和nor,输入数量在两个或两个以上。一类是只有一个输入,可以接一个或多个输出的电路,包括not和buf。7结构化描述原语例化语句在设计中直接调用原语相当于在电路中加入相应的逻辑门,这个过程称为原语例化。原语例化语句的格式如下:内置原语[标号](输出端口,输入端口);如:wireOUT,IN1,IN2;nandna1(OUT,IN1,IN2);nand是与非门原语,它只有一个输出,在这里输出端口是OUT,后面两个端口是它的输入。7结构化描述原语例化语句如:wireOUT,IN1,IN2,IN3;oror1(OUT,IN1,IN2,IN3);or是单输出的或门原语,说明这是一个3输入或门。又如:wireOUT,IN;notn1(OUT,IN);这条语句生成了一个输入为IN,输出为OUT的非门。7结构化描述7.2门级建模例3.6使用VerilogHDL语言门级建模方式描述下面这个4选1数据选择器7结构化描述7.2
门级建模s1s0out00i001i110i211i34选1数据选择器功能表7结构化描述7.2门级建模modulemux4_to_1(out,i0,i1,i2,i3,s1,s0);outputout;inputi0,i1,i2,i3;inputs1,s0;
wires1n,s0n;//变量声明wirey0,y1,y2,y3;//变量声明
notn1(s1n,s1);notn2(s0n,s0);anda1(y0,i0,s1n,s0n);anda2(y1,i1,s1n,s0);anda3(y2,i2,s1,s0n);anda4(y3,i3,s1,s0);oro1(out,y0,y1,y2,y3);
endmodule7结构化描述7.2门级建模例3.7使用与非门原语实现与门逻辑用门级描述实现一个与门,模块框架为modulemy_and(c,a,b);inputa,b;outputc;……endmodule7结构化描述7.2门级建模
7结构化描述7.2门级建模门级建模程序如下:modulemy_and(c,a,b);inputa,b;outputc; wirew;nandU1(w,a,b);nandU2(c,w,w);endmodule7结构化描述7.3模块实例化模块实例化是将一个已经定义的模块作为组件使用在另一个模块中,将被例化模块的端口与例化模块的端口或变量进行映射连接,从而实现电路的模块化设计和复用7结构化描述7.3模块实例化模块实例化机制能够有效地实现电路的模块化设计和复用,通过组合和重用不同的模块来构建复杂的数字电路和系统。7结构化描述位置关联模块实例化通过例化语句实现。模块例化语句分为位置关联和名字关联两种。将需要例化的模块端口按照模块声明时端口的位置顺序与外部信号进行匹配连接,格式如下:被例化模块名[标号](例化模块变量);这种格式下,()里如果有多个变量,顺序必须与例化模块所声明的端口顺序保持一致。7结构化描述位置关联3.6节所述的4位脉动进位计数器设计中,顶层模块框架如下:moduleripple_carry_counter(q3,q2,q1,q0,clk,reset);outputq3,q2,q1,q0;inputclock,reset;……endmodule7结构化描述位置关联图3-11电路中只包含4个T触发器,按照位置关联的写法,可以写作:T_FFtff0(q0,clock,reset);T_FFtff1(q1,q0,reset);T_FFtff2(q2,q1,reset);T_FFtff3(q3,q2,reset);7结构化描述位置关联T触发器的模块框架和端口声明应该是moduleT_FF(q,clock,reset);outputq;inputclock,reset;……endmodule7结构化描述位置关联在T触发器的设计中,可以例化D触发器和反相器两个模块。反相器采用原语例化语句,需要声明一个变量wirew;反相器的原语例化语句为not(w,q);7结构化描述位置关联T触发器设计模块代码如下:moduleT_FF(q,clock,reset);outputq;inputclock,reset;wirew; not(w,q); DFF(q,clock,reset,w);endmodule7结构化描述名字关联2.名字关联将需要例化的模块端口与外部信号按照其名字进行连接,格式如下:被例化模块名
[标号](.被例化模块端口(例化模块变量));这种格式的端口顺序可以与上层module声明的端口顺序不一致。7结构化描述名字关联其中.端口(变量)体现出例化模块端口和映射变量的名字对应关系,端口名前面加圆点,变量名放在括号里,他们成对出现,有多少个端口就得写多少个变量。如T触发器的端口是moduleT_FF(q,clock,reset);共有3个输入输出端口。按照名字关联的写法,T触发器tff0的模块例化语句可写成:T_FFtff0(.q(q[0]),.clk(clk),.reset(reset));这里的3组对应关系可随意更换顺序。7结构化描述7.4结构化建模例3.8用两种模块例化语句格式实现函数发生器。已知IC138的模块框架如下。moduleIC138(Y7,Y6,Y5,Y4,Y3,Y2,Y1,Y0,A2,A1,A0,E1,E2A,E2B);outputregY7,Y6,Y5,Y4,Y3,Y2,Y1,Y0;inputA2,A1,A0;inputE1,E2A,E2B;7结构化描述7.4结构化建模以位置关联语句为例,顶层模块完整代码如下:modulegene_func(fun1,fun2,fun3,in1,in2,in3);outputfun1,fun2,fun3;inputin1,in2,in3;
wireW7,W6,W5,W4,W3,W2,W1,W0;IC138ch1(W7,W6,W5,W4,W3,W2,W1,W0,in1,in2,in3,VCC,GND,GND);nandn1(fun1,W6,W5,W4,W3);nandn2(fun2,W7,W3,W1);nandn3(fun3,W5,W3,W2);
endmodule第3章硬件描述语言VerilogHDL数据流描述08Part8数据流描述数据流描述是一种以数据在各逻辑单元间的传输、变换和处理为核心的描述方式,提供一种从数据流动的角度出发描述电路,侧重于数据在寄存器之间的流动和处理过程。8数据流描述8.1数据流描述语句数据流描述的抽象层级介于行为级和门级之间,通过使用连续赋值语句、延迟控制以及丰富的表达式来描述数据流向与操作,主要使用assign语句为线网型变量赋值,将右边表达式的值赋给左边变量,赋值过程方向就是数据的流动方向。8数据流描述8.1数据流描述语句例如下面这个电路,信号从输入到输出的路径可以根据逻辑门分成三个节点。8数据流描述8.2数据流建模例3.9使用VerilogHDL语言数据流建模方式描述例3.6中的4选1数据选择器。方法一:使用条件运算符程序代码如下:modulemux4_to_1(out,i0,i1,i2,i3,s1,s0);outputout;inputi0,i1,i2,i3;inputs1,s0; assignout=s1?(s0?i3:i2):(s0?i1:i0);endmodule8数据流描述8.2数据流建模方法二:使用逻辑运算符。程序代码如下:modulemux4_to_1(out,i0,i1,i2,i3,s1,s0);outputout;inputi0,i1,i2,i3;inputs1,s0; assignout=(~s1&~s0&i0)|(~s1&s0&i1)|(s1&~s0&i2)|(s1&s0&i3);endmodule8数据流描述8.2数据流建模例3.10使用数据流建模的方式设计以下逻辑电路程序如下:moduledataflow_log(z1,x1,x2,x3,x4);inputx1,x2,x3,x4; outputz1;wirenet1,net2,net3;assignnet1=~(~x2|x4),net2=~(x1|x2),net3=~(x2|~x3|x4);assignz1=(~net1&~net2&~net3);endmodule8数据流描述8.3RTL描述RTL(寄存器传输级,RegisterTransferLevel)是数字电路设计中用于描述电路逻辑结构和数据流的一种方法,它主要关注电路的寄存器传输行为,即数据如何在寄存器之间传递和处理。8数据流描述8.3RTL描述RTL描述通常包括以下几个关键要素:寄存器:用于存储数据的存储单元。在RTL描述中,寄存器通常用变量或信号表示。数据传输:描述数据如何从一个寄存器传输到另一个寄存器。控制逻辑:描述数据何时以及如何传输和操作。8数据流描述8.3RTL描述RTL设计可以通过逻辑综合转换为门级网表,为后续的物理设计打下基础。在Quartus软件中打开Tools→NetlistViewers→RTLViewer,可以看到例3.9生成的RTL视图第3章硬件描述语言VerilogHDL行为级描述09Part9行为级描述行为级描述方式使用过程块和抽象级别高的程序语句对电路的逻辑功能进行描述,体现为把电路的一系列动态行为编制为算法,不涉及具体的硬件实现细节。行为级描述更加接近自然语言和人类的思维方式,便于复杂系统的分解和模块化设计。9行为级描述9.1程序的并发并发性(Concurrency)是FPGA区别于传统顺序执行处理器(如CPU)的核心特性之一,它指的是硬件电路在物理上同时执行多个操作的能力。FPGA由大量可编程逻辑单元(如查找表LUT、触发器FF)和互连资源组成,不同逻辑块可独立工作,这使得在数据处理,如图像处理中多个像素的滤波操作,可同时在不同逻辑单元中完成,极大提高处理速度。作为硬件描述语言,支持并发操作是VerilogHDL与一般高级编程语言的重要区别。Verilog能够通过语言机制模拟硬件,描述理想的并发行为。9行为级描述9.1程序的并发Verilog中的并发描述主要有以下几种:
结构级并发:并行执行体现在不同的并发代码结构之间,像always块与always块之间、always块与initial块或assign语句之间等。例如,在一个设计中,可能存在多个always块,它们各自独立地对不同的信号或逻辑进行操作,这些always块之间的执行是并行的,意味着它们可以同时对不同的信号进行赋值或处理,彼此不受干扰,并在同一时钟周期内可以同时启动并执行相应的操作。9行为级描述9.1程序的并发VerilogHDL中有两种过程块:initial过程块和always过程块,当一个模块中包含两个或两个以上的过程块时,这些过程块可以并发执行。如moduleabc();rega,b;
initialbegin//过程块1a=1;endinitialbegin//过程块2b=2;endendmodule在这里,initial过程块1和过程块2在仿真0时刻同时启动。9行为级描述9.1程序的并发事件驱动并发:由两个或多个事件(如时钟边沿、复位触发)激活不同的代码块,使它们在同一时间点执行。例如,一个always块可能在时钟上升沿触发,执行一组特定的逻辑操作;而另一个always块可能在复位信号为高的条件下触发,执行另一组逻辑操作。当这两个条件同时满足时,这两个always块所定义的事件就可以被视为并发的,它们会同时开始执行各自的内部语句。如always@(posedgeclk)begin...end//时钟触发的always过程块always@(negedgereset)begin...end//复位触发的always过程块9行为级描述9.1程序的并发
非阻塞赋值:Verilog支持通过非阻塞赋值“<=”操作符实现时序逻辑的并行更新,这种特性允许多个语句在同一时钟周期内并发执行。如always@(posedgeclk)begin
reg1<=data_in;//并行计算并暂存
reg2<=reg1;//使用reg1的旧值end9行为级描述9.2initial过程块initial过程块从关键字initial开始,格式为:
initial
过程块语句这里的过程块语句可以有一条或多条,如果有多条语句必须使用关键字begin和end组成一个语句块。initial过程块只能执行一次,一旦initial过程块中的所有语句被执行完毕,该过程块就结束执行。9行为级描述9.2initial过程块initial过程块一般被用于信号的初始化或者生成仿真波形等,它定义的变量和信号通常只在该过程块内部有效。initial过程块常用于信号的初始化,为后续的仿真测试建立初始条件。常见写法如下:initialbegina=0;//初始化变量a为0b=1;//初始化变量b为1//其他初始化语句...end9行为级描述9.2initial过程块因为initial过程块只能执行一次,它是不可综合的,过程块中的代码无法被转换为实际的硬件电路。initial过程块在仿真开始时(即0时刻)立即执行。如果仿真中有多个initial过程块,它们将并行执行。如:initialbegin
inputs=6'b000000;
#10inputs=6'b011001;
#10inputs=6'b011011;
#10inputs=6'b011000;
#10inputs=6'b001000;end9行为级描述9.3always过程块always过程块从关键字always开始,格式为:always过程块语句9行为级描述9.2initial过程块always的语句块可以连续多次运行,只要条件满足,过程块执行到最后一行代码后,再次从第一行代码开始执行。如:alwaysa_reg=~a_reg;这条语句使a_reg变量不停翻转,创建“零延迟”无限循环。9行为级描述时序控制为了避免出现死循环,应该给always过程块加上条件。实际上,电路行为的发生往往也是有条件的,会受到时序的控制。VerilogHDL能够描述过程中的时序特性,这也是硬件描述语言与计算机编程语言的重要差别之一。9行为级描述时序控制VerilogHDL的时序控制分为两种情况一种是基于时延的控制,一种是基于事件的控制。时延控制有明确的时间表示,使用#加上延迟时间来定义。延迟时间可以是常量、参数或者变量表达式,最终能转换成一个特定的数值。时延控制指定了从最初遇到该语句到该语句实际执行之间的延迟时间。9行为级描述时序控制比如:parameterlatency=20;parameterdelta=2;regx,y,z,p,q;initialbegin x=0; #10y=1; #latencyz=0; #(latency+delta)p=1; #yx=x+1;end9行为级描述时序控制事件控制主要用于always语句块,涉及到信号的检测和响应。在Verilog中,事件指某一个reg或wire型变量的值发生了变化,事件控制使用符号@。always过程块要正确运行,必须对其中关键变量的变化敏感。9行为级描述敏感事件敏感事件是指用于触发alwa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 淋巴结切除术对上皮性卵巢癌预后影响的Meta分析:基于多维度数据的综合评估
- 液态负极赋能新型钠基二次电池:性能突破与应用前景
- 液体硅橡胶中碳酸钙高效分散策略与性能关联探究
- 涉外证券内幕交易防范法律机制:国际比较与中国路径
- 消费者评价驱动的征信咨询系统:深度分析与创新设计
- 模板支护工程做法
- 电力生产与输配电管理手册
- 人工智能芯片设计与制造手册
- 妊娠期胆源性胰腺炎的个体化内镜方案制定
- 妊娠期结核病合并妊娠期妊娠期高血压疾病的降压目标
- 2026年行政执法人员执法资格考试全真模拟试卷及答案(共八套)
- 2025-2030中国内河运输行业市场深度分析及竞争格局与投资前景研究报告
- 雅安市雨城区2026年公开考试选聘社区工作者(99人)建设考试备考题库及答案解析
- 山东山东文化艺术职业学院2025年招聘18人笔试历年参考题库附带答案详解(5卷)
- 河北衡水中学2026届高三下学期综合素质评价三语文试卷+答案
- 佛山市南海区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 大族激光苹果创新加速与算力PCB扩产激光龙头迎接新一轮高成长
- 2026年智能制造评估师考试试题及答案
- 2026年春贵州人民版(2024)小学综合实践活动三年级下册(全册)教案(附目录)
- 2026年春人教鄂教版(新教材)小学科学三年级下册(全册)课时练习及答案(附目录)
- 讲师培训训练营
评论
0/150
提交评论