VHDL硬件描述语言(入门简述)_第1页
VHDL硬件描述语言(入门简述)_第2页
VHDL硬件描述语言(入门简述)_第3页
VHDL硬件描述语言(入门简述)_第4页
VHDL硬件描述语言(入门简述)_第5页
已阅读5页,还剩153页未读 继续免费阅读

下载本文档

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

文档简介

章节目录3.1硬件描述语言概述3.2VHDL语言程序结构3.3VHDL语法基础3.4VHDL常用语句3.5组合电路的VHDL描述3.6时序电路的VHDL描述调换11/24/202313.1硬件描述语言概述可编程逻辑器件、电子设计自动化(EDA)与硬件描述语言可编程逻辑器件是一种功能可变的集成器件可通过编程的方法设计其完成不同的逻辑功能设计需借助软件工具,即采用电子设计自动化的方式设计形式有原理图和硬件描述语言两种硬件描述语言是用来描述数字电路系统的一种语言11/24/202323.1硬件描述语言概述目前常用的硬件描述语言有两种VHDLVerilogHDLVeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage超高速集成电路硬件描述语言Verilog

HardwareDescriptionLanguageVerilog硬件描述语言VHDL语言发展较早,从使用者数量来看,目前两种语言平分秋色,VHDL语言更严谨、更适合设计大型数字系统。两种语言相似的地方很多,学会一种可自学另一种。11/24/202333.1硬件描述语言概述VHDL语言的IEEE标准

VHDLIEEE1076-1987VHDLIEEE1076-1993早在1980年,因为美国军事工业需要描述电子系统的方法,美国国防部开始进行VHDL的开发

1987年,由IEEE(InstituteofElectricalandElectronicsEngineers,电气和电子工程师协会

)将VHDL制定为标准,称为IEEE1076-19871993年制定了第二个IEEE标准版本,称为IEEE1076-1993,增加了一些新的命令和属性11/24/20234章节目录3.1硬件描述语言概述3.2VHDL语言程序结构3.3VHDL语法基础3.4VHDL常用语句3.5组合电路的VHDL描述3.6时序电路的VHDL描述11/24/20235五个基本组成部分库(Library)程序包(Package)实体说明(EntityDeclaration)结构体(Archiecture)配置(Configuration)主要部分注意:11/24/20236【例3-1】2选1数据选择器的VHDL语言描述d0d1selftemp3temp1temp2功能:2选1数据选择器Sel=0时,f=d0;Sel=1时,f=d1;11/24/20237--2to1muxVHDLLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmuxISPORT(d0,d1,sel:INSTD_LOGIC;f:OUTSTD_LOGIC);ENDmux;库程序包实体说明VHDL语言程序注释d0d1selfmux11/24/20238ARCHITECTUREstructureOFmuxISSIGNALtemp:STD_LOGIC;--内部信号BEGINp0:PROCESS(d0,d1,sel)--进程

VARIABLEtemp1,temp2,temp3:STD_LOGIC;BEGIN--进程内的局部变量

temp1:=d0AND(NOTsel);--变量间的逻辑关系

temp2:=d1ANDsel;temp3:=temp1ORtemp2;temp<=temp3;f<=temp;ENDPROCESSp0;--进程结束ENDstructure;--结构体结束结构体11/24/20239EDA工具软件QuartusII综合出来的电路程序中的信号temp被优化掉了11/24/2023101行是注释,用“--”引头2~3行是库说明部分,打开库及库中的程序包4~7行是实体说明部分,描述电路的端口信号8~最后是结构体部分,描述电路的逻辑功能VHDL语言不区分大小写,为阅读方便,关键字用大写,用户自定义部分用小写。说明11/24/202311本节三方面内容3.2.1实体说明3.2.2结构体3.2.3程序包、库及配置11/24/2023123.2.1实体说明【格式】ENTITY<实体名>IS[GENERIC(类属常数说明);][PORT(端口说明);][实体语句部分;]END[ENTITY]<实体名>;主要部分<>表示必选项,[]表示可选项【主要功能】说明电路的名字、输入输出信号。d0d1selfmux11/24/202313【例】4位串行进位加法器的实体说明。ENTITYadder_rippleISGENERIC(m:TIME:=5ns);PORT(a,b:INSTD_LOGIC_VECTOR(3DOWNTO0);q:OUTSTD_LOGIC_VECTOR(3DOWNTO0);cout:OUTSTD_LOGIC);ENDadder_ripple;abqcoutadder_ripple实体名由用户自定义,必须和主文件名一致必须以ENTITY<实体名>IS开始,以END<实体名>结束在端口说明部分说明输入输出信号的情况在类属常数说明部分说明类属常数的情况11/24/202314类属常数:若程序中多处用到某个常数,为方便修改,可将其定义为类属常数,只需修改类属常数的值,则程序中与其有关的常数自动修改。【功能】说明类属常数的名字,数据类型,设定值。GENERIC(m:TIME:=5ns);【格式】GENERIC(常数名:数据类型[:=设定值];…常数名:数据类型[:=设定值]);【例】11/24/202315【格式】PORT(端口名,[端口名]:[模式]数据类型;…端口名,[端口名]:[模式]数据类型);PORT(a,b:INSTD_LOGIC_VECTOR(3DOWNTO0);q:OUTSTD_LOGIC_VECTOR(3DOWNTO0);cout:OUTSTD_LOGIC);【功能】

说明输入输出信号的名字,输入输出模式,数据类型,位宽。【例】11/24/202316端口名是输入输出信号的名字。模式是指输入输出信号的方向。数据类型是指输入输出信号的取值类型。表3-1端口方向说明方向定义含义IN输入OUT输出INOUT双向BUFFER输出(可反馈使用)LINKAGE不指定方向BITBIT_VECTORSTD_LOGICINTEGERBOOLEANSTD_LOGIC_VECTOR常用数据类型说明:BUFFER是INOUT的子集,做输入时,信号不是由外部驱动,而是从输出反馈得到。11/24/2023173.2.2结构体【格式】ARCHITECTURE<结构体名>OF<实体名>IS[内部信号或元件定义语句;]BEGIN<功能描述部分(并行语句);>END<结构体名>;【功能】描述电路的具体结构、功能。主要部分11/24/202318ARCHITECTURE是关键字。结构体名可随意起,实体名必须和实体说明中的实体名一致。定义语句是指对内部信号、元件、常数等的说明。并行处理语句部分是结构体的主要部分,描述电路的结构、功能等。BEGIN后开始结构和功能的描述。说明:11/24/202319【例3-2】一个RS触发器的结构体(数据流描述方式)resetsetqqb该电路中并行语句部分使用的是并行信号赋值语句,描述了两个与非门的连接关系。11/24/202320【例3-3】一个RS触发器的结构体(结构描述方式)本例是RS触发器的另一种描述方式,并行处理语句采用的是元件例化语句,后面3.4.1介绍。11/24/202321【例3-4】一个全加器的VHDL程序(数据流描述方式)本例结构体中的并行处理部分采用的也是并发信号赋值语句。描述了两个异或门和一个与或门。本例中的类属说明语句说明了一个时间常数tpd是5ns,后面的赋值语句使用了该延时参数。11/24/202322结构体中并行语句有5种类型信号赋值语句元件例化语句进程语句结构块语句结构子程序语句结构11/24/2023233.2.3包集合、库及配置1.包集合(Package)包集合中存放供多个实体公用的数据类型、常量、子程序。包集合又存放在库中。一般情况下,要使用某个包集合中的资源时,必须对该包集合进行使用说明。一般情况下,要使用某个库中的包集合时,也必须对该库进行说明。【格式】LIBRARY<库名>;USE<库名.程序包名.项目名>LIBRARYIEEE;【例】类似于C语言中的头文件11/24/202324VHDL提供的常用的标准包集合: STANDARD STD_LOGIC_1164STANDARD包中定义了若干数据类型、子类型、函数;该包已预先在STD库中编译好,并且自动与所有模型连接,使用时无须说明;STD_LOGIC_1164包中也定义了若干数据类型和函数;该包已预先在IEEE库中编译好,但是在使用时须加以使用说明;在STD库中在IEEE库中,用时不须说明,用时须说明11/24/202325常用的数据类型(整数、实数、BIT、BIT_VECTOR、布尔量、字符、字符串、物理型、错误等级、自然数和正整数)均在STANDARD程序包中常用的数据类型(STD_LOGIC、STD_LOGIC_VECTOR)在STD_LOGIC_1164程序包中11/24/202326【包集合结构格式】PACKAGE<包集合名>IS[说明语句;]END[包集合名];PACKAGEBODY<包集合名>IS[说明语句;]END[包集合名];包首包体用户可自定义包集合。

11/24/202327【例3-10】自定义包集合的例子。--包集合说明(包首)PACKAGEexampleIS TYPEalu_opIS(add,sub,mul,div,eq,gt,lt); CONSTANTpi:REAL:=3.1415926; delay1:TIME; COMPONENTnand2 PORT(a,b:INBIT;c:OUTBIT); ENDCOMPONENT; FUNCTIONmean(a,b,c:REAL)RETURNREAL;ENDexample;说明了一个枚举型的数据类型alu_op两个常数pi、delay1一个元件nand2一个函数mean11/24/202328--包集合体PACKAGEBODYexampleIS CONSTANTdelay1:TIME=15ns; FUNCTIONmean(a,b,c:REAL)RETURNREAL; BEGIN RETURN(a+b+c)/3.0; ENDmean;ENDexample;包集合体中具体说明了时间常数delay1的值、函数mean的功能11/24/202329USEWORK.example.ALL;自定义的包集合存放在现行工作库WORK库中。使用WORK库时不需说明。自定义的包集合在使用时必须进行使用说明。【例】说明:11/24/2023302.库(Library)【格式】库中存放已编译过的设计单元(如实体、程序包等);库中内容可以用作其它VHDL描述的资源。使用库时一般需要说明。LIBRARY<库名>;5种库IEEESTDASICWORK用户定义库LIBRARYIEEE;【例】11/24/202331IEEESTD_LOGIC_1164NUMERIC_BITNUMERIC_STDSTD_LOGIC_ARITHSTD_LOGIC_SIGNEDSTD_LOGIC_UNSIGNEDSTDSTANDARDTEXTIOVATIL(面向ASIC的库)VATIL_TIMINGVATIL_PRIMITIVEWORK(现行工作库)用户自定义库无须说明不但要说明库,还要说明库中的程序包。例:LIBRARYIEEE;最常用例:LIBRARYSTD;USESTD.STANDAR.ALL;11/24/2023323.配置语句(Configration)一个实体可以有多个结构体。可利用配置语句来选择不同的结构体,使其与要设计的实体相对应。实体1结构体1结构体2【例】CONFIGURATIONconfrOFrsffISFOR结构体1;ENDFOR;ENDconfr;【格式】CONFIGURATION配置名OF实体名ISFOR结构体1名;ENDFOR;END配置名;11/24/202333实体1结构体1实体2结构体2应用:比如可设计两个不同风格的结构体,比较其性能差异,可以用配置语句选择其中的一个结构体。否则,只能设计两个实体(程序),分别调试。实体结构体1结构体2VS11/24/202334章节目录3.1硬件描述语言概述3.2VHDL语言程序结构

VHDL语法基础3.4VHDL常用语句3.5组合电路的VHDL描述3.6时序电路的VHDL描述11/24/2023353.3VHDL语法基础3.3.1标识符和保留字3.2.2数据对象3.2.3数据类型3.3.4数据类型的转换3.3.5运算操作符五方面内容11/24/2023363.3.1标识符和保留字规则:由字母数字下划线组成必须以英文字母开头最后一个字符不能是下划线不允许出现连续两个下划线保留字不能作一般的标识符不区别大小写1.标识符即由用户起的实体名、结构体名、信号名、变量名…..11/24/2023372.保留字表3-3常用保留字保留字即VHDL语言中已使用的关键字。保留字不能用作标识符。11/24/20233811/24/2023393.3.2数据对象对象有四种类型:常数信号变量文件最常用11/24/2023403.3.2数据对象1.常数CONSTANT常数名:数据类型[:=表达式];【常数声明格式】使用前必须声明CONSTANTtoler:DISTANCE:=1.5nm;CONSTANTpi:REAL:=3.141592;CONSTANTcycle_time:TIME:=100ns;CONSTANTPropagation_Delay:DELAY_LENGTH;【例】常数值11/24/2023412.变量variable变量名:数据类型[约束条件][:=表达式];【变量声明格式】使用前必须声明【例】VARIABLEresult:STD_LOGIC:=‘0’;VARIABLEx,y,z:INTEGER;VARIABLEcount:INTEGERRANGE0TO255:=10;初始值声明时可带初始值约束条件11/24/202342【变量赋值格式】变量名:=表达式;【例】result:=‘1’;x:=y+3;注意赋值符号:=表达式的数据类型和变量的类型必须一致。表达式可以是运算表达式也可以是具体数值。11/24/2023433.信号SIGNAL信号名:数据类型[约束条件][:=表达式];【信号声明格式】使用前必须声明【例】SIGNALfirst_sig:INTEGER;SIGNALsys_clk:BIT:=‘0’;SIGNALsecond_sig,third_sig:INTEGER:=10;SIGNALs:INTEGERRANGE0TO20:=15;初值声明时可带初始值约束条件11/24/202344【信号赋值格式】信号名<=表达式;【例】a<=bAFTER10ns;a<=expression_b;a<=expression_bAFTER10ns;注意信号说明中的赋初值符号是:=,而信号赋值语句中的赋值符号为<=。表达式的数据类型和信号的类型必须一致。表达式可以是运算表达式也可以是具体数值。信号赋值可以添加延时信息。11/24/202345变量是局部的,信号是全局的;变量只能用在进程内,信号没有此限制。若变量用于进程之外,必须将该变量先赋给一个相同类型的信号,用信号在进程之间传递数据。信号可以延迟,变量不能。变量不能用于硬件连线,常用在高层次建模的计算中。进程对信号敏感而对变量不敏感。赋值符号不一样;信号和变量的区别11/24/2023463.3.3数据类型Scalartypes标量型Composite复合型Access存取型File文件型Protected保护型5种类型每一种中又有若干子类型和具体数据类型。11/24/202347已经在标准数据包STANDARD和STD_LOGIC_1164中定义好的常用的数据类型如下:整数、实数、BIT、BIT_VECTOR、布尔量、字符、字符串、物理型、错误等级、自然数和正整数本节介绍以上数据类型的特点。STD_LOGIC、STD_LOGIC_VECTORSTANDARDSTD_LOGIC_116411/24/2023483.3.3数据类型整数(INTEGER)(属于:标量型→整数型,在STANDARD程序包中

)整数的表示范围为-(231-1)~(231-1)。【例】VARIABLEa:INTEGER:=15;SIGNALs:INTEGERRANGE0TO20:=15;INTEGER型数据值不用引号括起来11/24/2023492.实数(REAL)(属于:标量型→浮点型,在STANDARD程序包中)实数的表示范围为-1.0E38~+1.0E38。实数的书写方式举例:某些数即可以用整数表示,也可以用实数表示,如1.0是实数,1是整数,两者数值相同但类型不同。REAL型数据值不用引号括起来11/24/2023503.BIT(属于:标量型→枚举型)和BIT_VECTOR(属于:复合型→数组型)在STANDARD程序包中BIT又称位型,其值仅有2个,’0’和’1’;BIT_VECTOR又称位矢量,是BIT的数组。例:BIT型数值要用单引号括起来,BIT_VECTOR型数值要用双引号括起来。SIGNALa:BIT;SIGNALlow_byte:BIT_VECTOR(0to7);a<=‘1’;Low_byte<=“00000101”;11/24/2023514.布尔型(BOOLEAN)(属于:标量型→枚举型,在STANDARD程序包中)BOOLEAN的值仅有2个,TRUE和FALSE。11/24/2023525.STD_LOGIC和STD_LOGIC_VECTOR在STD_LOGIC_1164程序包中STD_LOGIC又称标准逻辑变量,其值有9个,’U’,’X’,’0’,’1’,’Z’,’W’,’L’,’H’,’-’。常用的是’0’,’1’,’Z’。STD_LOGIC_VECTOR称标准逻辑向量,是STD_LOGIC的数组。STD_LOGIC型数值要用单引号括起来,STD_LOGIC_VECTOR型数值要用双引号括起来。例:SIGNALa:STD_LOGIC;a<=‘1’;11/24/2023536.字符(CHARACTER)(属于:标量型→枚举型)和字符串(STRING)(属于:复合型→数组型)在STANDARD程序包中CHARACTER型数值要用单引号括起来。STRING型数值要用双引号括起来。例:’A’,’a’,’1’,’2’。“ABC”,“HELLO”。11/24/2023547.时间型( TIME)(属于:标量型→物理型,在STANDARD程序包中)GENERIC(m:TIME:=5ns);例:11/24/2023558.错误等级(SEVERITY_LEVEL)(属于:标量型→枚举型,在STANDARD程序包中)SEVERITY_LEVEL的值有4个,NOTE,WARNING,ERROR,FAILURE。注意,警告,错误,失败。11/24/2023569.自然数(NATURAL)(标量型→整数型→整数)和正整数(POSITIVE)(标量型→整数型→整数)在STANDARD程序包中NATURAL和POSITIVE是INTEGER的子类型。11/24/202357以上是已经在标准数据包STANDARD和std_logic_1164中定义好的常用的数据类型。除此之外,还可以由用户自定义数据类型。可以由用户自定义的数据类型:枚举类型整数类型数组类型记录类型存取类型文件类型时间类型实数类型TYPE数据类型名IS数据类型定义OF基本数据类型;TYPE数据类型名IS数据类型定义;【格式】11/24/202358TYPEalu_opIS(add,sub,mul,div,eq,gt,lt);typeBITis('0','1');typeBIT_VECTORisarray(NATURALrange<>)ofBIT;subtypePOSITIVEisINTEGERrange1toINTEGER'HIGH;定义一个数据类型alu_op,是枚举型,取值为add,sub,mul,div,eq,gt,lt中的一个声明变量a是alu_op型的。Variablea:alu_op例下例为标准程序包中的某些数据类型定义11/24/2023593.3.4数据类型的转换自学11/24/2023603.3.5操作符5类操作符逻辑运算关系运算算术运算并置运算移位运算11/24/202361可以对BIT,BOOLEAN,STD_LOGIC,STD_LOGIC_VECTOR等类型数据进行逻辑运算。1.逻辑运算符ANDORNANDNORXORXNORNOT与或与非或非异或同或非11/24/2023622.算术运算符+–+–*/MODREMABS**加减正号负号乘除取模取余取绝对值平方通常取模运算也叫取余运算,它们返回结果都是余数。rem和mod唯一的区别在于:当x和y的正负号一样的时候,两个函数结果是等同的;当x和y的符号不同时,rem取余函数结果的符号和x的一样,而mod求模和y一样。11/24/2023633.关系运算符=/=<<=>>=等于不等于小于小于等于大于大于等于11/24/2023644.并置运算符&

并置sel<=b&a;例:若b=‘1’,a=‘0’,则sel=“10”Y<=‘H’&’e’&’l’&’l’&’o’Y=“Hello”11/24/2023653.3.5运算操作符5.移位运算符SLLSRLSLASRAROLROR逻辑左移逻辑右移算术左移算术右移循环左移循环右移补零补首位例:aSLL311/24/2023663.3.5运算操作符运算符的优先级11/24/202367章节目录3.1硬件描述语言概述3.2VHDL语言程序结构3.3VHDL语法基础3.4VHDL常用语句3.5组合电路的VHDL描述3.6时序电路的VHDL描述11/24/2023683.4VHDL常用语句仿真时:两大类:并行语句顺序语句并行语句同时并行执行,顺序语句按先后次序执行。11/24/2023693.4.1并行语句ARCHITECTURE<结构体名>OF<实体名>IS[定义语句;]BEGIN

<功能描述语句(并行处理语句);>END<结构体名>;并行语句用在结构体的并行处理语句部分11/24/202370进程语句并行信号赋值语句元件例化语句块语句过程调用语句参数传递语句生成语句并行断言语句常用ARCHITECTURE<结构体名>OF<实体名>IS[定义语句;]BEGIN进程语句并行信号赋值语句元件例化语句END<结构体名>;11/24/202371ARCHITECTURECOMPONENTENDCOMPONENT;BEGIN

PROCESSENDPROCESS

dff1:dffPORTMAP(S(0),clk,S(1));

q1<=a+b;q2<=a*b;

q<=d0WHENsel="00"ELSEd1WHENsel="01"ELSE'Z';WITHselSELECTq<=d0WHEN0,d1WHEN1,'Z'WHENOTHERS;END<结构体名>;各部分之间是并行的进程元件例化并行信号赋值语句并行信号赋值语句并行信号赋值语句11/24/2023721.进程语句【格式】[进程标号:]PROCESS[敏感信号表][IS][进程内部变量说明部分;]BEGIN<顺序语句部分;>ENDPROCESS[进程标号];进程语句是最主要的并行语句,它在VDHL程序设计中使用频率最高,也是最能体现硬件描述语言的一条语句。11/24/202373【例3-7】带异步复位功能的D触发器的VHDL描述。11/24/202374当敏感信号发生变化时,执行进程。当执行完最后一个语句时,回到第一个语句,等待下一次敏感信号变化。一个结构体中可以有多个进程,进程之间是并行的。仿真时进程内部各条语句是顺序执行的。进程语句说明部分可以说明需要的局部变量。【说明】11/24/2023752.并行信号赋值语句并发信号赋值语句条件信号赋值语句选择信号赋值语句①并发信号赋值语句例:q1<=a+b;q2<=a*b;当a或b有变化时,两条语句同时执行。模拟了两个加法器和乘法器电路。+*abq1q2注意前提是信号赋值语句放在进程外;若放在进程中,则变成了顺序执行的语句。当信号赋值语句放在进程外时,就是并发信号赋值语句。11/24/202376②条件信号赋值语句【格式】目标信号<=表达式1WHEN条件1ELSE 表达式2WHEN条件2ELSE 表达式3WHEN条件3ELSE …… 表达式n-1WHEN条件n-1ELSE 表达式n;当条件1满足时,目标信号=表达式1当条件2满足时,目标信号=表达式2……【功能】条件判断是按顺序执行的,先判断条件1满足否,再判断条件2满足否。11/24/202377【例3-11】用条件信号赋值语句设计4选1数据选择器。语句之间是并行的11/24/202378③选择信号赋值语句【格式】WITH选择条件表达式SELECT目标信号<=表达式1WHEN选择条件1 表达式2WHEN选择条件2 表达式3WHEN选择条件3 …… 表达式nWHEN选择条件n;表达式n+1WHENOTHERS;当选择条件表达式值=条件1时,目标信号=表达式1当选择条件表达式值=条件2时,目标信号=表达式2……【功能】条件判断是同时进行的,无优先级。11/24/202379【例3-12】用选择信号赋值语句设计4选1数据选择器。该例既使用了条件信号赋值语句也使用了选择信号赋值语句11/24/2023803.元件例化语句元件例化语句是最能体现层次化设计思想的语句。例如设计由D触发器构成的移位寄存器,可以将设计分成2层,底层描述D触发器,顶层调用底层描述的D触发器。在顶层中调用底层设计时,就要用到元件例化语句。层次化设计简单说即将整个系统分成不同的层次,顶层设计可以调用底层设计。11/24/202381【格式】COMPONENT<元件名>[GENERIC类属说明;]PORT<端口说明>;ENDCOMPONENT;<标号名:><元件名>[GENERICMAP(参数映射)]PORTMAP(端口映射);定义元件:把底层设计定义成一个元件元件例化:调用定义好的元件,并说明该元件与其他信号的连接关系。11/24/202382【例3-14】用元件例化语句描述由D触发器构成的移位寄存器。dff是另一个程序对应的电路,这里将其定义成一个元件,并用其构成一个移位寄存器。dffdqclk11/24/202383dffs0s1clkdff1dffs1s2clkdff2dffs2s3clkdff3dffs3s4clkdff4dffas1dffs2dffs3dffbclks0s411/24/202384元件名必须与底层文件的实体名一致。端口映射部分要指明元件内部信号与外部信号的连接关系,其顺序必须与端口说明部分的顺序一致。一个元件定义部分可以对应多个元件例化部分,相当于调用了多个元件而已。元件标号名可以帮助标示不同的元件。【说明】11/24/2023854.生成语句非重点不讲11/24/202386ARCHITECTURECOMPONENTENDCOMPONENT;BEGIN

PROCESSENDPROCESS

dff1:dffPORTMAP(S(0),clk,S(1));

q1<=a+b;q2<=a*b;

q<=d0WHENsel="00"ELSEd1WHENsel="01"ELSE'Z';WITHselSELECTq<=d0WHEN0,d1WHEN1,'Z'WHENOTHERS;END<结构体名>;各部分之间是并行的11/24/2023873.4.2顺序语句顺序语句是相对于并行语句而言的。顺序语句的特点是:每一条顺序语句的执行顺序是与它们的书写顺序相一致的。顺序语句只能出现在进程和子程序中。[进程标号:]PROCESS[敏感信号表]IS[进程语句说明部分;]BEGIN<顺序语句部分;>ENDPROCESS[进程标号];11/24/202388顺序赋值语句WAIT语句IF语句CASE语句LOOP语句EXIT语句RETURN语句NULL语句REPORT语句断言语句常用11/24/202389变量赋值语句信号赋值语句①变量赋值语句【格式】目标变量:=表达式注意赋值符号:=表达式的数据类型和变量的类型必须一致。表达式可以是运算表达式也可以是具体数值。变量赋值限定在进程、函数、过程等顺序区域内。变量赋值无时间特性。变量值具有局部性。只在进程内有效。count:=count+1;【例】11/24/202390②信号赋值语句【格式】目标信号<=表达式信号赋值语句中的赋值符号为<=。表达式的数据类型和信号的类型必须一致。表达式可以是运算表达式也可以是具体数值。信号赋值可以添加延时信息。用在进程中才是顺序语句S<=aXORbXORc;【例】当信号赋值语句放在进程内时,就是顺序语句。放在进程外时就是并行语句。11/24/202391【格式】WAIT --无限等待WAITON --敏感信号变化WAITUNTIL --条件满足WAITFOR --时间到【功能】进程在仿真运行中总是处于两种状态之一:执行或挂起。进程状态的变化可受WAIT语句的控制,当进程执行到WAIT语句时就将被挂起,并设置好再次执行的条件。可以设置4种条件。11/24/202392IF语句是一种条件控制语句,是常用语句之一。IF语句只能用在进程中。三种形式IF…THEN语句IF…THEN…ELSE语句IF…THEN…ELSIF…ELSE语句网上流传一句话:IF、CASE打天下11/24/202393【格式】IF<条件>THEN<顺序处理语句>;ENDIF;①IF…THEN语句当条件满足时,执行THEN后的语句,否则,不执行【功能】条件满足?顺序处理语句YN条件不完整,常用来实现时序电路11/24/202394顺序处理语句dClkq当条件满足时,d的值赋给q,否则,q值不变【例3-17】用IF…THEN语句描述D触发器功能。11/24/202395【格式】IF<条件>THEN<顺序处理语句1>;ELSE<顺序处理语句2>;ENDIF;两分支②IF…THEN…ELSE语句当条件满足时,执行THEN后的语句,否则,执行ELSE后的语句。条件完整,常用来实现组合电路。【功能】条件满足?顺序处理语句2顺序处理语句1YN11/24/202396【例】用IF…THEN…ELSE语句描述二选一数据选择器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmuxISPORT(d0,d1,sel:INSTD_LOGIC;f:OUTSTD_LOGIC);ENDmux;11/24/202397ARCHITECTUREbehaOFmuxISBEGINPROCESS(d0,d1,sel)BEGINIF(sel=‘0’)THENf<=d0;ELSEf<=d1;ENDIF;ENDPROCESS;ENDbeha;Sel=0时,f=d0;Sel=1时,f=d1;11/24/202398【格式】IF<条件1>THEN<顺序处理语句1>;ELSIF<条件2>THEN<顺序处理语句2>;ELSE<顺序处理语句3>;ENDIF;多分支③IF…THEN…ELSIF…ELSE语句当条件1满足时,执行THEN后的顺序语句1,否则,当条件2满足时,执行THEN后的顺序语句2,否则执行ELSE后的顺序语句3。条件完整,常用来实现组合电路。【功能】11/24/202399条件1优先级高条件2优先级低还可以再分支条件1满足?顺序处理语句2顺序处理语句1YN条件2满足?顺序处理语句3YN11/24/2023100【例】数据选择器的VHDL程序。(P137)注意:条件要完整,最后必须加ELSEf<=‘0’,否则会综合出寄存器。11/24/20231013.4.2顺序语句条件不完整的综合结果有寄存器11/24/2023102条件完整的综合结果无寄存器11/24/20231034. CASE语句【格式】CASE表达式ISWHEN取值1=>顺序处理语句1;WHEN取值2=>顺序处理语句2;…….WHENOTHERS=>顺序处理语句n;ENDCASE;CASE语句也是常用语句之一,具有条件控制功能。也只能用在进程中。11/24/2023104顺序处理语句1满足条件1顺序处理语句2满足条件2顺序处理语句4都不满足满足条件3顺序处理语句3顺序处理语句1满足条件1几个条件是同等级的11/24/2023105【例3-19】用CASE语句实现3-8线译码器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdecoder_3to8ISPORT(a,b,c,g1,g2,g3:INSTD_LOGIC;y:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDdecoder_3to8;ARCHITECTUREbehaOFdecoder_3to8ISSIGNALindata:STD_LOGIC_VECTOR(2DOWNTO0);BEGINIndata<=c&b&a;11/24/2023106PROCESS(Indata,g1,g2,g3)BEGINIF(g1=‘1’ANDg2=‘0’ANDg3=‘0’)THENCASEindataIS WHEN“000”=>y<=“11111110”; WHEN“001”=>y<=“11111101”; WHEN“010”=>y<=“11111011”; WHEN“011”=>y<=“11110111”; WHEN“100”=>y<=“11101111”; WHEN“101”=>y<=“11011111”; WHEN“110”=>y<=“10111111”; WHEN“111”=>y<=“01111111”; WHENOTHERS=>y<=“XXXXXXXX”;ENDCASE;ELSEf<="11111111";ENDIF;ENDPROCESS;ENDbeha;11/24/2023107CASE语句的各条件表达式是同时执行的。条件表达式的所有情况都要列举到。可用WHENOTHERS描述。【说明】11/24/20231085. LOOP语句【格式】FOR循环变量IN取值范围LOOP<顺序处理语句>;ENDLOOP;LOOP是循环语句,有两种①FOR…LOOP②WHILE…LOOP①FOR…LOOP若循环变量在取值范围内则执行循环,否则结束循环。【功能】11/24/2023109【例3-20】用FOR…LOOP语句描述的偶校验发生器。设a=11001110,则tmp=1,奇数个1;设a=11001100,则tmp=0,偶数个1。11/24/2023110【格式】WHILE条件LOOP<顺序处理语句>;ENDLOOP;若条件为真则执行循环,若为假则结束循环。②WHILE…LOOP【功能】11/24/2023111【例3-21】用WHILE…LOOP语句描述的偶校验发生器。功能和例3-20相同注意y<=tmp;只能写在进程内,因为tmp是变量,在进程内局部有效。11/24/2023112归纳一下前面介绍的IF语句、CASE语句、LOOP语句,有一个共同的特点,即不是对电路的具体结构进行描述,而是对电路的功能和行为进行了描述,采用的是类似C语言的高级描述语言,我们把这种描述方式称为行为描述方式。VHDL语言的三种描述方式数据流描述方式结构描述方式行为描述方式后面介绍11/24/20231136. EXIT语句【格式】EXIT[LOOP标号];EXIT[LOOP标号][WHEN条件];程序执行到该语句处,无条件跳出。程序执行到LOOP标号处,无条件跳出。条件满足时,执行到该语句处跳出。条件满足时,执行到LOOP标号处跳出。除正常结束循环外,还可利用EXIT语句退出。11/24/20231147. 断言语句(ASSERT)【格式】assert条件[REPORT表达式][SEVERITY表达式]断言语句主要用于程序仿真、调试中的人机会话,它可以给出一个文字串作为警告和错误的信息。【功能】如果断言条件不满足,则顺序执行REPORT语句,输出用双引号括起来的以文字串表示的错误信息,同时还要报告错误信息的严重级别。11/24/2023115【例3-22】使用ASSERT语句的RS触发器的VHDL程序。注意在RS触发器中,不允许两个输入都为1。该程序使用断言语句,一旦出现两个输入r、s都为1的情况,则发出错误提示。11/24/2023116VHDL语言的三种描述方式数据流描述方式(RTL级描述方式)结构描述方式行为描述方式主要采用逻辑关系式的描述方式,说明了数据的流向主要采用元件例化语句,说明元件之间的连接关系主要采用IF、CASE、WAIT、LOOP等高级语言,说明电路的功能和行为11/24/2023117数据流描述方式的2选1数据选择器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmuxISPORT(d0,d1,sel:INSTD_LOGIC;f:OUTSTD_LOGIC);ENDmux;ARCHITECTUREmux_1OFmuxISBEGINp0:PROCESS(d0,d1,sel)VARIABLEtemp1,temp2:STD_LOGIC;BEGINtemp1:=d0AND(NOTsel);temp2:=d1ANDsel;f<=temp1ORtemp2;ENDPROCESSp0;ENDmux_1;主要采用逻辑关系式的描述方式,说明了数据的流向11/24/2023118结构描述方式的2选1数据选择器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmuxISPORT(d0,d1,sel:INSTD_LOGIC;f:OUTSTD_LOGIC);ENDmux;ARCHITECTUREmux_2OFmuxISSIGNALy1,y2,y3:STD_LOGICCOMPONENTNOT1PORT(a:INSTD_LOGIC,y:OUTSTD_LOGIC);ENDCOMPONENT;11/24/2023119主要采用元件例化语句,说明元件之间的连接关系COMPONENTAND2PORT(a,b:INSTD_LOGIC,y:OUTSTD_LOGIC);ENDCOMPONENT;COMPONENTOR2PORT(a,b:INSTD_LOGIC,y:OUTSTD_LOGIC);ENDCOMPONENT;BEGINU1:NOT1PORTMAP(sel,y1)U2:AND2PORTMAP(d0,y1,y2)U3:AND2PORTMAP(d1,sel,y3)U4:OR2PORTMAP(y2,y3,y)ENDmux_2;11/24/2023120LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmuxISPORT(d0,d1,sel:INSTD_LOGIC;f:OUTSTD_LOGIC);ENDmux;ARCHITECTUREbehaOFmuxISBEGINPROCESS(d0,d1,sel)BEGINIF(sel=‘0’)THENf<=d0;ELSEf<=d1;ENDIF;ENDPROCESS;ENDbeha;行为描述方式的2选1数据选择器主要采用IF、CASE、WAIT、LOOP等高级语言,说明电路的功能和行为11/24/2023121实际程序中往往几种描述方式混合使用,初学阶段不必过于在意所采用的描述方式,知道有这种说法即可。11/24/2023122章节目录3.1硬件描述语言概述3.2VHDL语言程序结构3.3VHDL语法基础3.4VHDL常用语句3.5组合电路的VHDL描述3.6时序电路的VHDL描述11/24/20231231.【例4-3】判定电路的VHDL程序。(P123)本例使用了条件赋值语句同学们可以尝试用CASE语句实现11/24/2023124综合结果11/24/20231252.【例】4-2线优先编码器的VHDL程序。(P126)本例使用了ifthenelsifthen语句利用IF条件的优先级很方便地实现了优先编码的功能如果用CASE语句则只能实现普通编码器的功能Then后面的顺序语句用分号隔开a(3)a(2)a(1)a(0)yeo1XXX11101XX101001X0110001001000000011/24/2023126条件不完整,缺少最后一条ELSE…综合时会综合出寄存器,RTL图说明了这一点。【程序存在的问题】在ENDIF前加一句:ELSEy<="00";eo<='0';就不会产生寄存器11/24/20231273.【例】74138的VHDL程序。(P130)使用ifthenelse、case语句)s1s2s3a(2)a(1)a(0)f(0)f(1)f(2)f(3)f(4)f(5)f(6)f(7)10000011111111100001101111111000101101111110001111101111100100111101111001011111101110011011111101100111111111100XXXXX1111111111XXXX111111111X1XXX1111111111/24/20231283.【例】74138的VHDL程序。(P130)使用ifthenelse、case语句)11/24/20231294.【例】7448的VHDL程序。(P135)(ifthenelsifthenelse语句)11/24/2023130条件不完整,缺少最后一条ELSE…综合时会综合出寄存器,RTL图说明了这一点。【程序存在的问题】11/24/2023131综合电路局部寄存器【修改】在ENDIF前加一句:ELSEsegout<="0000000";rbo<='1';就不会产生寄存器11/24/20231325.【例】1-4数据分配器的VHDL程序。(P136)(ifthenelsifthenelse语句)该程序仍然出现条件不完整的情况,结果会综合出寄存器。修改程序,在ENDIF前加ELSEw(0)<=‘0’;w(1)<=‘0’;w(2)<=‘0’;w(3)<=‘0’;则寄存器消失。11/24/20231336.【例】4选1数据选择器的VHDL程序。(P137)(ifthenelsifthenelse语句)和上例同样的问题,综合出了寄存器,加ELSEf<=‘0’语句修改。11/24/20231347.

温馨提示

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

评论

0/150

提交评论