4. 新的硬件描述语言VHDL编程基础_第1页
4. 新的硬件描述语言VHDL编程基础_第2页
4. 新的硬件描述语言VHDL编程基础_第3页
4. 新的硬件描述语言VHDL编程基础_第4页
4. 新的硬件描述语言VHDL编程基础_第5页
已阅读5页,还剩125页未读 继续免费阅读

下载本文档

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

文档简介

第四章硬件描述语言VHDL编程基础,本章首先介绍了VHDL的基本结构,使读者初步掌握VHDL的基础知识。最后通过大量的实例使读者进一步掌握使用VHDL的设计方法。,本章主要内容,第一节概述,第二节VHDL程序结构,第三节VHDL的基本数据类型,第四节VHDL的基本描述语句,第五节子程序,第一节概述,VHDL(VeryhighspeedintergatedcircuitHardwareDescriptionLanguage):非常高速集成电路的硬件描述语言。20世纪80年代诞生于美国国防部的一项研究计划,目的是使电路的设计能够以文字的方式保存下来。被列为IEEE1076标准,也成为工业界的标准。,1.VHDL简介,2VerilogHDL语言简介,VerilogHDL它是在C语言的基础上发展起来的,由GDA(GatewayDesignAutomation)公司创造的,1989年cadence公司收购了GDA公司,使得VerilogHDL成为了该公司的独家专利。1990年Cadence公司公开发表了VerilogHDL,并成立LVI组织以促进VerilogHDL成为IEEE标准,即IEEEStandard1364-1995。VerilogHDL的最大特点就是易学易用,如果有C语言的编程经验,可以在一个较短的时间内很快的学习和掌握,VerilogHDL语言的系统抽象能力稍逊于VHDL,而对门级开关电路的描述能力则优于VHDL。,二、VHDL的优点,1.支持层次化设计2.具有多层次描述系统硬件功能的能力3.具有丰富的仿真语句和库函数4.VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。,VHDL的优点,5.对设计的描述具有相对独立性,与硬件的结构无关6.可以利用EDA工具进行逻辑综合和优化,并自动将VHDL描述转化为门级网表。7.具有可移植性,可以在不同的设计环境和系统平台中使用。8.具有良好的可读性。,三、VHDL与高级语言的区别,1.某些并行语句可以自动的重复执行,不需要用循环指令来保证。2.VHDL中的许多语句不是按排列顺序执行的,而是可以同时执行的(VHDL的并行性)。,返回,第二节VHDL程序结构,一、VHDL的基本结构,ENTITYnand_2IS-定义一个实体PORT(a,b:INSTD_LOGIC;-描述输入输出y:OUTSTD_LOGIC);-信号ENDnand_2;,LIBRARYIEEE;-IEEE库说明USEIEEE.STD_Logic_1164.ALL;-自定义元件库,ARCHITECTURErtlOFnand_2ISBEGIN-结构体说明y=NOT(aANDb);ENDrtl;,1.USE定义区,2.PACKAGE定义区,3.ENTITY定义区,4.ARCHITECTURE定义区,定义元件库,5.CONFIGURATION定义区,定义使用那些自定义元件库,定义电路实体的外观:I/O接口的规格,描述电路内部的逻辑功能,决定那一个architecture被使用,1.VHDL基本结构图,2.实体说明,功能:描述设计模块的输入/输出信号或引脚,并给出设计模块与外界的接口。实体类似一个“黑盒”,实体描述了“黑盒”的输入输出口。格式:ENTITY实体名ISGENERIC(类属表);PORT(端口表);ENDENTITY实体名,实体名,实体名实际上是器件名,最好根据相应的电路功能确定。如4位2进制计数器用counter4b;8位加法器用add8b;3/8译码器用ym_38。,实体名必须与文件名相同,否则无法编译。,实体名不能用工具库中定义好的元件名。,实体名不能用中文,也不能用数字开头。,类属表,类属表:用以将信息参数传递到实体。类属表的一般格式为:GENERIC(常数名:数据类型:=设定值)GENERIC(awidth:INTEGER:=3;timex:time);其中:常数名由设计者确定;数据类型通常取INTEGER或time等;在表中提供时间参数、总线宽度等信息。,端口表:指明实体的输入、输出信号极其模式。端口表的一般格式为:PORT(端口名:端口模式数据类型)端口模式:共四种:IN(输入)、OUT(输出)、INOUT(双向端口)、BUFFER(输出并向内部反馈),端口表,数据类型:VHDL作为一种强类型语言,必须对数据对象(常量、变量、信号)规定取值范围,即对传输或存储数据的类型作明确的界定。,实体举例,ENTITYblack_boxISGeneric(constantwidth:integer:=7;);PORT(clk,rst:INstd_logic;d:INstd_logic_vector(widthDOWNTO0);q:OUTstd_logic_vector(widthDOWNTO0);co:OUTstd_logic);ENDblack_box;,练习一,编写包含以下内容的实体代码端口D为12位输入总线端口OE和CLK都是1位输入端口AD为12位双向总线端口A为12位输出总线端口INT是1位输出端口AS是一位输出同时被用作内部反馈,练习一答案,LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYmy_designISPORT(d:INstd_logic_vector(11DOWNTO0);oe,clk:INstd_logic;ad:INOUTstd_logic_vector(11DOWNTO0);a:OUTstd_logic_vector(11DOWNTO0);int:OUTstd_logic;as:BUFFERstd_logic);ENDmy_design;,练习,1、编写包含全加器的实体代码。2、编写4选1数据选择器的实体代码。,3.结构体,结构体:通过若干并行语句来描述设计实体的逻辑功能(行为描述)或内部电路结构(结构描述),从而建立设计实体输出与输入之间的关系。一个设计实体可以有多个结构体。格式:ARCHITECTURE结构体名OF实体名IS说明语句;BEGIN并行语句;ENDARCHITECTURE结构体名;,VHDL结构体术语,说明语句:用于定义结构体中所用的数据对象和子程序,并对所引用的元件加以说明,但不能定义变量。并行语句并行语句有五种类型,可以把它们看成结构体的五种子结构。这五种语句结构本身是并行语句,但内部可能含有并行运行的逻辑描述语句或顺序运行的逻辑描述语句,如进程内部包含的即为顺序语句。五种语句结构分别为块语句、进程语句、信号赋值语句、子程序调用语句和元件例化语句。,结构体结构图,实体和结构体之间的关系,Structure描述描述该设计单元的硬件结构,即该硬件是如何构成的,类似于数字电路中的逻辑图描述.DateFlow描述它是类似于寄存器传输级的方式描述数据的传输和变换,以规定设计中的各种寄存器形式为特征,然后在寄存器之间插入组合逻辑。与数字电路中的真值表描述相似。BehaviorProcess描述只描述所希望电路的功能或者电路行为(输入输出间转换的行为),而没有指明或涉及实现这些行为的硬件结构。与数字电路中的逻辑表达式描述相似。,结构体的三种描述形式,architectureoneofmux21issignald,e:bit;begind=aand(not)s;e=bands;y=dore;endone;,Structure描述,architectureoneofmux21isbeginy=(aand(nots)or(bands);endone;,DateFlow描述,BehaviorProcess描述,architectureoneofmux21isbeginy=awhens=0elseb;endone;,结构体行为描述举例,2X8InputANDgate:ENTITYblack_boxISPORT(a,b:INstd_logic_vector(7DOWNTO0);y:OUTstd_logic_vector(7DOWNTO0);ENDblack_box;ARCHITECTUREexampleOFblack_boxISBEGINy=aANDb;ENDexample;,操作案例,1、操作题目:通过38译码器的设计实例,从整体结构上初步认识VHDL的基本结构和语句特点。2、38译码器的电路图如图所示,有4个输入端(A0、A1、A2、EN),8个输出端(Y0Y7)3、步骤:定义元件库、实体、结构体、编译、仿真。,返回,第三节VHDL的基本数据类型,一、数据对象,是数据类型的载体,共有三种形式的对象:Constant(常量)Variable(变量)Signal(信号)对象的说明格式为:对象类别标识符表:类型标识:=初值,(1)常量声明,常量是全局量,在结构描述、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用。例:constantWIDTH:INTEGER:=8;constantX:NEW_BIT:=X;,(2)变量声明,定义了给定类型的变量名称。例:variableA,B:BIT;variableINIT:NEW_BIT,变量赋值,整体赋值:temp:=“10101010”;temp:=x”AA”;逐位赋值:temp(7):=1;多位赋值temp(7downto4):=“1010”;,(3)信号声明,信号可以将结构体中分离的并行语句连接起来,并且通过端口其他模块与该设计内的连接起来。信号为器件内部节点信号,数据的进出不像端口信号那样受限制,不必定义其端口模式。定义信号的目的是为了在设计电路时使用该信号。用“=”来给信号赋值例:signalA,B:BIT;signalINIT:INTEGE:=-1,信号赋值,SIGNALtemp:Std_Logic_Vector(7downto0);整体赋值:temp=“10101010”;temp=x”AA”;逐位赋值:temp(7)=1;多位赋值:temp(7downto4)=“1010”;,信号举例,LIBRARYieee;USEieee.std_logic_1164.all;ENTITYsimpISPORT(a,b,c,d:INStd_Logic;g:OUTStd_Logic);ENDsimp;ARCHITECTURElogicOFsimpISSIGNALe,f:Std_Logic;BEGINe=aorb;f=not(cord);g=eandf;ENDlogic;,信号和变量的作用范围,信号和变量的区别,二、数据类型,1.标准定义的数据类型不必用USE说明而直接使用。1)Boolean(布尔量):取值为FALSE和TRUE。2)Character(字符):使用时用单引号括起来,如:A。3)String(字符串):使用时用双引号括起来,如:111000101。4)Integer(整数):范围在-(231-1)(231-1)5)Real(实数):范围在-1.0E+38+1.0E+38,6)Bit(位):取值为0或1.7)Time(时间):取值范围与整数一致,一般用于仿真。8)Bit_vector(位矢量):基于BIT数据类型的数组。使用时必需注明宽度。9)Natural(自然数)和Positive(正整数):是整数的一个子类型。10)Severitylevel(错误等级):用来设计系统的工作状态。有四种状态值:NOTE(注意)、WARNING(警告)、ERROR(错误)、FAILURE(失败)。,2.用户自定义的数据类型,1)EnumeratedTypes(枚举类型)格式如下:TYPE数据类型名IS(枚举文字,枚举文字);例如:TYPEcolorIS(red,green,yellow,blue);TYPElevelIS(0,1,Z);2)IntegerTypes(整数类型)和RealTypes(实数类型)格式为:TYPE数据类型名ISRANGE约束范围;例如:TYPEintISRANGE-10TO10;3)ArrayTypes(数组类型)格式如下:TYPE数据类型名ISARRAY(索引范围)OF类型名称;例如:TYPEaISARRAY(integer0TO9)OFstd_logic,3.IEEE预定义标准逻辑位与矢量,在IEEE的程序包中std_logic_1164中定义了两个重要的数据类型。1)std_logic:工业标准的逻辑类型。取值为0(强0)、1(强1)、Z(高阻态)、X(强未知的)。2)std_logic_vector:工业标准的逻辑类型。std_logic的组合。注意:使用这两种数据时,程序中必须声明:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL,Std_Logic数据类型,IEEEstd_logic_1164中定义的一种数据类型,它包含9种取值分别为:U未初始化用于仿真X强未知用于仿真0强0用于综合与仿真1强1用于综合与仿真Z高阻用于综合与仿真W弱未知用于仿真L弱0用于综合与仿真H弱1用于综合与仿真_忽略用于综合与仿真,三、标识符,标识符是VHDL语言最基本的要素之一,是使用VHDL语言的基础。标识符是描述VHDL语言中端口、信号、常数、变量以及函数等名称的字符串。VHDL标识符书写规则如下:1)使用的字符由26个英文字母、数字09以及下划线组成;2)标识符必须以英文字母开始,不区分大小写;3)不能以下划线结尾;4)标识符中不能有空格;5)标识符不能与VHDL的关键字重名。,四、运算符,(1)算术运算符,+加*乘方减MOD求模*乘REM求余/除ABS求绝对值,(2)关系运算符,=等于/=不等于小于=小于或等于大于=大于或等于其中=符号也用于信号的赋值操作,(3)逻辑运算符,AND逻辑与SLL逻辑左移OR逻辑SRL逻辑右移NAND逻辑与非SLA算术左移NOR逻辑或非SRA算术右移XOR逻辑异或ROR逻辑循环右移NOT逻辑非ROL逻辑循环左移,五、VHDL属性,VHDL属性(Attribute)是指实体、结构体、类型及信号的一些表现特征。一般需要了解VHDL中的数值类属性、函数类属性以及范围类属性。其引用的一般形式均为:对象属性。,1数值类属性,数值类属性可用于返回数组、块或一般数据的有关属性。如左边界(left)、右边界(right)、下边界(low)、上边界(high)和数组长度(length)。例如:sdown:INstd_logic_vector(8DOWNTO0);这个信号的各属性值如下:sdownleft=8;sdownright=0;sdownlow=0;sdownhigh=8;sdownlength=9;,2函数类属性,函数类属性用来返回有关信号行为功能的信息。如信号属性函数:event,它的值为布尔型,如果刚好有事件发生在该属性所附着的信号上(即信号有变化),则其取值为True,否则为False。利用此属性可决定时钟边沿是否有效,即时钟是否发生。例如:时钟边沿表示SIGNALclk:INstd_logic则:clkeventANDclk=1,表示时钟的上升沿。clkeventANDclk=0,表示时钟的下降沿。,3范围类属性,范围(RANGE)类属性,用来生成一个限制性数据对象的范围。例如:数据总线的范围SIGNALdata_bus:std_logic_wector(15DOWNTO0);Data_busRANGE=15DOWNTO0;注意:MAX+PLUS不支持该属性。,练习,1、编写包含全加器的结构体代码。2、编写3输入与非门的结构体代码。,ARCHITECTUREexample1OFFull_adderISBEGINsum=aXORbXORc;c=(aANDb)OR(bANDc)OR(aANDc);ENDexample1;,ARCHITECTUREexample2OFand3ISBEGINy=aANDbANDc;ENDexample2;,练习答案,返回,第四节VHDL的基本描述语句,一、顺序语句,1.IF语句,顺序语句用于进程过程或函数之中,为算法描述提供了IF语句、CASE语句、LOOP语句。,可以用于实现两种或两种以上的条件分支判断。格式为:IF布尔表达式1THEN顺序语句1ELSIF布尔表达式2THEN顺序语句2ENDIF,1)IF布尔表达式1THEN顺序语句1ENDIF,常用格式,2)IF布尔表达式1THEN顺序语句1ELSE顺序语句2ENDIF,3)IF布尔表达式1THEN顺序语句1ELSIF布尔表达式2THEN顺序语句2ENDIF,4)IF布尔表达式1THENIF布尔表达式2THEN顺序语句ENDIFENDIF,【例4-3】IF语句描述的判断程序(2选1),IFs=0THENy=a0;ELSIFs=1THENy=a1;ENDIF,练习,用IF语句实现4选1,IFs=00THENy=a;ELSIFs=01THENy=b;ELSIFs=10THENy=c;ELSEydddd=0;-当s=其他时,d=0EndCase;,课后练习,用case语句实现3-8译码器,3.LOOP语句,用于循环控制,与LOOP有关的五种语法其格式如下:(1)循环标号:LOOP顺序语句;ENDLOOP循环标号;(2)标号:FOR循环变量IN循环次数范围LOOP顺序语句;ENDLOOP循环标号;(3)循环标号:WHILE条件LOOP顺序语句;ENDLOOP循环标号;,(4)NEXT语句:在LOOP语句中,用来跳出当前循环。其格式为:NEXT循环标号WHEN条件;(5)EXIT语句:用来结束LOOP语句的执行。其格式为:EXIT循环标号WHEN条件;,利用LOOP语句可以简化同类顺序语句表达式.如:Signala,b,c:std_logic_vector(1to3)FornIN1to3LOOPa(n)=b(n)ANDc(n)ENDLOOP等效于:a(1)=b(1)ANDc(1)a(2)=b(2)ANDc(2)a(3)dddNULL;EndCase;EndProcess;,二、并行语句,并行语句与一般软件程序的最大区别就是在结构体中的执行都是同时进行的,既它们的执行顺序与语法的书写顺序无关。这种并行性是由硬件本身的并行性决定的,一旦电路接通电源,各部分就会按照事先设计好的方案同时工作。并行语句主要有进程语句(PROCESS)、块语句(BLOCK)、并行信号赋值语句、生成语句(GENERATE)、元件例化语句、断言语句。,1.进程语句,进程语句是一段复合语句,由一段程序构成,各个进程之间是并行进行的,而进程的内部语句都是顺序执行的。一个结构体中可以包括多个进程语句,多个进程之间依靠信号(SIGNAL)来传递。,进程语句,进程语句的格式如下:标号:PROCESS(敏感信号表)说明语句;-定义一些局部变量BEGIN顺序语句;ENDPROCESS标号:;,敏感信号表,进程赖以启动的敏感表。对于表中列出的任何信号的改变,都将启动进程,执行进程内相应顺序语句.一些VHDL综合器,综合后对应进程的硬件系统对进程中的所有输入的信号都是敏感的,不论在源程序的进程中是否把所有的信号都列人敏感表中.为了使软件仿真与综合后的硬件仿真对应起来,应当将进程中的所有输入信号都列入敏感表中.,LIBRARYieee;USEieee.std_logic_1164.all;ENTITYif_caseISPORT(a,b,c,d:INStd_Logic;sel:INStd_Logic_Vector(1downto0);y,z:OUTStd_Logic);ENDif_case;ARCHITECTURElogicOFif_caseISBEGINif_label:PROCESS(a,b,c,d,sel)BEGINIFsel=00THENy=a;ELSIFsel=01THENy=b;ELSIFsel=10THENy=c;ELSEyzzzzz=0;ENDCASE;ENDPROCESScase_label;ENDlogic;,进程语句举例,敏感表举例,if_label:PROCESS(oe)BEGINIFoe=1THENy=a;ENDIF;ENDPROCESSif_label;,敏感表举例,if_label:PROCESS(oe,a)BEGINIFoe=1THENydddNULL;EndCase;EndProcess;,3、进程必须由一个敏感信号表中定义的任一敏感信号的变化来启动,否则必须有一个显示的WAIT语句来激励。4、进程语句本身是并行语句。即同一结构体中的不同进程是并行运行的,后者是根据敏感信号独立运行的。5、信号是多个进程间的通信线。6、在同一进程中只能放置一个含有时钟边沿检测语句的条件语句。,2.块语句,块语句将结构体中的并行语句结合在一起,其主要目的是改善并行语句极其结构的可读性,一般用于较复杂的VHDL程序。其格式如下:块名称:BLOCK(表达式)块声明项;BEGIN并行语句;ENDBLOCK块名称;,3.并行信号赋值语句,(1)简单(并行)信号赋值语句格式:赋值目标=表达式;如q=b+c;(2)条件信号赋值语句格式:赋值目标=表达式WHEN赋值条件ELSE表达式;注意:由于条件测试的顺序性,第一句具有最高赋值优先级,第二句次之,以此类推。,ARCHITECTUREar_6OFfzh_1ISBEGINyy(1),ci=cm(1),sum=s(1),co=cm(2);yj2:adde_1PORTMAP(x(2),y(2),cm(2),sum=s(2),co=cm(3);yj3:adde_1PORTMAP(x(3),y(3),cm(3),s(3),co);ENDar_9;,*一位加法器的描述*LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYadd_1ISPORT(x,INstd_logic;y:INstd_logic;ci:INstd_logic;sum:OUTstd_logic;co:OUTstd_logic;ENDadd_1;ARCHITECTUREar_10OFadd_1ISBEGINsumd(3);U3:dffPORTMAP(D=d(3),clk=clk,Q=d(4);doutX,C1=Z,B1=Y);ENDa;,LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYyf2ISPORT(A1,B1:INstd_logic;C1:OUTstd_logic);ENDyf2;ARCHITECTUREbOFyf2ISBEGINC1=A1NANDB1;ENDb;,5.生成语句,生成语句具有复制作用,可以生成与某个元件或设计单元电路完全相同的一组并行元件或设计单元电路结构。格式1:标号:FOR循环变量IN取值范围GENERATE说明语句;BEGIN并行语句;ENDGENERATE标号;,格式2:标号:IF条件GENERATE说明语句;BEGIN并行语句;ENDGENERATE标号;,练习:用D触发器构成4位移位寄存器,用生成语句进行设计。,LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYshifterISPORT(din,clk:INstd_logic;dout:OUTstd_logic);ENDshifter;ARCHITECTUREaOFshifterISCOMPONENTdffPORT(D,clk:INstd_logic;Q:OUTstd_logic);ENDCOMPONENT;SIGNALd:std_logic_vector(0TO4);,BEGINd(0)=din;G:ForiIN0TO3GENERATEU:dffPORTMAP(d(i),clk,d(i+1);ENDGENERATEG;dout=d(4);ENDa;,6.断言语句,断言语句是面向仿真的语句,综合器通常忽略此语句。并行断言语句等价一个进程语句,但不作任何操作,仅用于判断某一条件是否成立。格式为:ASSERT条件REPORT报告信息SEVERITY出错级别;当判断条件为Fause时报告错误。,Note:用在仿真时传递信息。Warning:用于非平常情形,仿真仍继续,结果不可预知。Error:仿真不能继续。Failure:致命错误,必须立即停止。,错误级别为四级:,LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_arith.ALL;USEieee.std_logic_unsigned.ALL;ENTITYrs_1ISPORT(s,r:INstd_logic;q,nq:OUTstd_logic);ENDrs_1;ARCHITECTUREar_11OFrs_1ISBEGINPROCESSVARIABLEblh_1:bit:=0;BEGINASSERTNOT(s=1ANDr=1)REPORTBOTHsANDrEQUALTO1!“SEVERITYERROR;,IFs=0ANDr=0THENblh_1:=blh_1;ELSIFs=0ANDr=1THENblh_1:=0;ELSEblh_1:=1;ENDIF;q=blh_1after2ns;nq=NOTblh_1WAITONr,s;ENDPROCESS;ENDar_11;,返回,第五节子程序,子程序由一组顺序语句组成,是为了在程序中重复使用而设立的。子程序不是一个独立的编译单位,只能置于实体或程序包中。在结构体中定义的子程序对于该结构体来说是局部的,即不能被其它设计层次的结构体调用。如果要在其它结构体中调用同一个子程序,就需要把子程序定义到程序包中。,VHDL中的子程序有两类:过程子函数:过程通过其接口返回0个或多个值。函数子函数:函数直接返回单个值。子程序包含两部分:即子程序声明和主体部分。在程序包中声明子程序时,子程序声明必须要放在程序包声明中,子程序主体必须要放在程序包体中。,一、函数的定义与引用,函数语句的作用是输入若干参数,通过函数运算求值,最后返回直接一个值。函数语句的格式为:FUNCTION函数名参数表RETURN类型;-函数头FUNCTION函数名参数表-函数体RETURN类型IS程序声明项;BEGIN顺序语句;END函数名;,函数头是程序包与函数的接口界面。如果要将一个函数组织成程序包入库,则必须定义函数头,且函数头应放在程序包的说明部分,而函数体应放在程序包的包体内。如果只在一个结构体中定义并调用函数,则只需定义函数体即可。其中:函数表中为参数名、参数类别及数据类型,函数的参数为信号或常数,默认情况为常数;在RETURN后面的数据类型为函数返回值的类型;子程序声明项用来说明函数体内引用的对象和过程;顺序语句就是函数体,用来定义函数的功能。,LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYfunISPORT(A:INstd_logic_Vector(0TO2);M:OUTstd_logic_Vector(0TO2);ENDfun;ARCHITECTUREartOFfunISFUNDTIONsam(X,Y,Z:BIT)RETURNBITISBEGINRETURN(XANDY)ORZ;ENDsam;,函数应用实例,PROCESS(A)BEGINM(0)=sam(A(0),A(1),A(2);M(1)=sam(A(2),A(0),A(1);M(2)=sam(A(1),A(2),A(0);ENDPROCESS;ENDart;,二、过程的定义与引用,过程的作用是传递信息,即通过参数进行内外的信息传递。其中参数需说明(信号、变量及常量)类别、类型及传递方向。过程定义的格式为:PROCEDURE过程名参数声明IS子程序声明项;BEGIN顺序语句;ENDPROCEDURE过程名;其中:参数声明指明了输入、输出端口的数目和类型。参数声明的语法格式为:参数名:方式方式参数类型有inoutinoutbuffer等四种。,过程的调用是一条语句,调用时通过其接口返回0个或多个值。根据环境的不同,过程调用有两种方式,即顺序语句方式和并行语句方式。在一般的顺序语句自然执行过程中,一个过程被执行,则属于顺序语句方式;当某个过程处于并行语句环境中时,其过程体中定义的任一IN或INOUT的目标参量发生改变时,将启动过程的调用,这时的调用属于并行语句方式。,过程的调用,LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYfunISPORT(A:INstd_logic_Vector(0TO2;M:OUTstd_logic_Vector(0TO2);ENDfun;ARCHITECTUREart1OFfunISPROCEDUREsam1(X,Y,Z:INBIT;N:OUTBIT)ISBEGINN:=(XANDY)ORZ;ENDsam1;,过程应用实例,BEGINsam1(A(0),A(1),A(2),N(0);sam1(A(2),A(0),A(1),N(1);sam1(A(1),A(2),A(0),N(2);M(0)=N(0);M(1)=N(1);M(2)=N(2);-等效于:M=N(2),三、子程序重载,子程序重载(SubprogramsOverload)的特性使函数或过程子程序中,允许多个子程序具有相同的子程序名,但参数不同,以便在调用时分辨不同功能的子程序,使子程序输出不同的数据。决定引用子程序的因素如下:1)子程序调用出现的参数个数;2)调用中出现的参数类型;3)子程序为函数时返回值的类型;4)调用时参数采用名字关联方式时形参的名字。,注意:子程序与进程不同,它不能从结构体的其余部分直接读取信号或向信号赋值,所有通信必须通过子程序的界面端口进行。子程序与元件例化也不同,当子程序被实体或另一个子程序调用时,综合后将嵌入其中;而不是像元件例化语句那样,产生一个新的设计层次。,第六节库和程序包,库(Library):用于存放预先编译好的程序包(PACKAGE)和数据集合体。常用的库有IEEE、STD、WORK、用户库等。这些设计单元可用作其它VHDL描述的资源。用户编写的设计单元既可以访问多个设计库,又可以加入到设计库中,被其他单元所访问。使用格式为:LIBRARY库名称;,一、设计库,二、程序包,在VHDL中数据类型、常量及子程序在实体说明和结构体内定义,而这些数据类型、常量及子程序对其他设计实体是不可见的。为使它们对其他设计实体可见,VHDL提供了程序包(Package)。用程序包可定义一些公用的子程序、常量以及自定义数据类型等。各种VHDL编译系统都含有多个标准程序包,如Std-Logic-1164和Standard程序包。用户也可已自行设计程序包(保存到WORK下)。程序包由两个独立的单元组成:程序包声明单元和程序包体单元构成。,(1)程序包声明单元的一般格式:PACKAGE程序包名IS说明语句END程序包名;其中说明语句为:类型定义、常量定义、子程序声明、信号声明及元件声明等。(2)程序包体单元的一般格式:PACKAGEBODY程序包名IS包体语句END程序包名;,PACKAGEfunISSUBTYPESEGMENTISBIT_Vector(0to6);TYPEBCDISRANGE0to9;ENDfun;ENTITYDECODERISPORT(INPUT:BCD;DRIVE:OUTSEGMENT);ENDDECODER;ARCHITECTUREartOFDECODERISBEGINWITHINPUTSELECT,例:在现行WORK库中定义程序包并立即使用实例。,DRIVE=B“1111110”WHEN0,B“0110000”WHEN1,B“1101101”WHEN2,B“1111001”WHEN3,B“0110011”WHEN4,B“1011011”WHEN5,B“1011111”WHE

温馨提示

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

评论

0/150

提交评论