版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.1实体1.2结构体1.3块、子程序和进程1.4库和程序包1.5配置第一章VHDL根本结构总目录章目录第一节第二节第三节第四节第五节
一个完整的VHDL程序或设计实体,要求能为VHDL综合器所支持,并能作为一个独立的设计单元,即元件的形式而存在的VHDL程序。
实体和结构体是必需的——可构成最简单VHDL程序。通常VHDL程序包含五个局部:〔1〕实体〔ENTITY〕〔2〕结构体〔ARCHITECTURE〕〔3〕包集合〔PACKAGE〕〔4〕库〔LIBRARY〕〔5〕配置〔CONFIGURATION〕章目录第一节第二节第三节第四节第五节总目录实体是VHDL语言设计的根本单元。1.1实体
实体说明是对设计实体与外部电路的接口描述,它规定了设计单元的输入输出接口信号或引脚,是设计实体对外的一个通信界面。
结构体用于描述此设计实体的逻辑结构和逻辑功能。章目录第一节第二节第三节第四节第五节总目录【例1】ENTITYmux21aISPORT(a,b:INBIT;s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINy<=aWHENs='0'ELSEb;ENDARCHITECTUREone;实体说明结构体1.1设计实体图1-1mux21a实体图1-2mux21a结构体设计实体总由实体说明和结构体两局部构成2选1多路选择器的VHDL描述实体语句结构如下:例:ENTITYor2ISPORT〔a,b:INSTD_LOGIC;C:OUTSTD_LOGIC);ENDENTITYor2;ENTITY实体名IS[GENERIC〔类属表〕;][PORT〔端口表〕;]ENDENTITY实体名;章目录第一节第二节第三节第四节第五节总目录在层次化系统中,实体说明是整个模块或整个系统的输入输出〔I/O〕接口在器件级设计中实体说明是芯片的输入输出〔I/O〕章目录第一节第二节第三节第四节第五节总目录类属参量〔GENERIC〕
类属参量是实体说明组织中的可选项,放在端口说明之前,其一般格式为:GENERIC[CONSTANT]名字表:[IN]子类型标识[:=静态表达式],…]
类属参量〔GENERIC〕类属参量是实体说明组织中的可选项,放在端口说明之前,其一般格式为:GENERIC[CONSTANT]名字表:[IN]子类型标识[:=静态表达式],…]
类属参量用来规定端口的大小、实体中子元件数目及实体的定时特性等。它和常数不同,常数只能从设计实体的内部得到赋值且不能改变;而类属参量的值可由设计实体的外部提供。
章目录第一节第二节第三节第四节第五节总目录这里类属参量中参数trise为上升沿宽度,tfall为下降沿宽度,用于仿真模块的设计;定义地址总线的宽度为Addrwidth位,类属值Addrwidth的改变将使结构体中所有相关的总线定义同时改变,由此使整个设计实体的硬件结构发生变化。例:GENERIC〔trise,tfall:TIME:=1ns;Addrwidth:INTEGER:=16);PORT(a0,a1:INSTD_LOGIC;Add_bus:OUTSTD_LOGIC_VECTOR(addrwidth-1DOWNTO0);章目录第一节第二节第三节第四节第五节总目录端口说明〔PORT〕端口是对根本设计单元与外部接口的描述。其功能相当电路图符号的外部引脚。端口可以被赋值,也可以当做逻辑变量用在逻辑表达式中。章目录第一节第二节第三节第四节第五节总目录
其中端口名是设计者为实体的每一个对外通道所取的名字,通常为英文字母加数字,名字的定义有一定的惯例,如clk表示时钟,D开头的端口名表示数据,A开头的端口名表示地址。端口模式是指这些通道上的数据流动的方式,如输入或输出等。端口模式有以下几种类型:1.输入〔IN〕允许信号进入实体,主要用于时钟输入、控制输入〔如load、reset、enable、clk〕和单向的数据输入〔如地址数据信号address〕等。章目录第一节第二节第三节第四节第五节总目录2.输出〔OUT〕输出模式只允许信号离开实体,常用于计数输出、单向数据输出、被设计实体产生的控制其他实体的信号等。注意:输出模式不能用于被设计实体的内部反响,因为输出端口在实体内不能看做是可读的。3.双向模式〔INOUT〕双向模式允许信号双向传输〔既可以进入实体,也可以离开实体〕,双向模式端口允许引入内部反响。章目录第一节第二节第三节第四节第五节总目录4.缓冲〔BUFFER〕缓冲模式允许信号输出到实体外部,但同时也可以在实体内部引用该端口的信号。缓冲端口既能用于输出也能用于反响。缓冲模式用于在实体内部建立一个可读的输出端口,例如计数器输出、计数器的现态用来决定计数器的次态。端口模式可用以下图说明,图中方框代表一个设计实体或模块。章目录第一节第二节第三节第四节第五节总目录在VHDL设计中,通常将输入信号端口指定为输入模式,输出信号端口指定为输出模式,而双向数据通信信号,如计算机PCI总线的地址/数据复用总线,DMA控制器数据总线等纯双向的信号采用双向端口模式。从端口的名称、模式就能一目了然地指导信号的用途、性质、来源和去向。章目录第一节第二节第三节第四节第五节总目录结构体是对实体功能的具体描述,因此它一定要跟在实体的后面。行为描述〔根本设计单元的数学模型描述〕、存放器传输描述〔数据流描述〕和结构描述〔逻辑元件连接描述〕1.2结构体
结构体也叫构造体,结构体描述了根本设计单元〔实体〕的结构、行为、元件及内部连接关系,也就是说它定义了设计实体的功能,规定了设计实体的数据流程,制定了实体内部元件的连接关系。结构体对其根本设计单元的输入和输出关系可用以下三种方式进行描述,即:章目录第一节第二节第三节第四节第五节总目录图VHDL程序设计根本结构图结构体构造图结构体一般由两大局部组成:ARCHITECTURE结构体名OF实体名IS[定义语句]BEGIN[功能描述语句]END结构体名;〔1〕对数据类型、常数、信号、子程序和元件等因素进行说明的局部;〔2〕描述实体的逻辑行为、以各种不同的描述风格表达的功能描述语句,包括各种顺序语句和并行语句。结构体的语句格式为:章目录第一节第二节第三节第四节第五节总目录1.2.1结构体名
结构体名由设计者自行定义,OF后面的实体名指明了该结构体所对应的是哪个实体。有些设计实体有多个结构体,这些结构体的结构体名不可相同,通常用dataflow〔数据流〕、behavior〔行为〕、structural〔结构〕命名。这3个名称表达了3种不同结构体的描述方式,使得阅读VHDL语言程序时,能直接了解设计者采用的描述方式。章目录第一节第二节第三节第四节第五节总目录结构体信号定义语句必须放在关键词ARCHITECTURE和BEGIN之间,用于对结构体内部将要使用的信号、常数、数据类型、元件、函数和过程加以说明。结构体中的信号定义和端口说明一样,应有信号名称和数据类型定义。因为它是内部连接用的信号,因此不需要方向说明。
1.2.2结构体信号定义语句
需要注意的是:实体说明中定义的信号是外部信号,而结构体定义的信号为该结构体的内部信号,它只能用于这个结构体中。章目录第一节第二节第三节第四节第五节总目录ARCHITECTURErtlOFmujISSIGNALs1:BITSIGNALs2,s3:STD_LOGIC_VECTOR(0TO3);
┇
BEGIN
┇ENDrtl;
例:结构体的信号定义实例。结构体名实体名结构体信号定义语句功能描述语句章目录第一节第二节第三节第四节第五节总目录1.2.3结构体功能描述语句
结构体功能描述语句位于BEGIN和END之间,具体地描述了构造体的行为及其连接关系。结构体的功能描述语句可以含有5种不同类型的并行语句,如下图。每一语句结构内部可以使用并行语句,也可以是顺序语句。章目录第一节第二节第三节第四节第五节总目录结构体构造图:
结构体〔ARCHITECTURE)说明语句功能描述语句块语句〔BLOCK)进程语句(PROCESS)信号赋值语句子程序调用语句元件例化语句由一系列并行语句构成的组合体,它的功能是将结构体中的并行语句组成一个或多个子模块定义顺序语句模块,用以将从外部获得的信号值或内部运算数据向其他的信号进行赋值将设计实体内的处理结果向定义的信号或界面端口进行赋值可以调用进程或参数,并将获得的结果赋值于信号对其他的设计实体做元件调用说明,并将此元件的端口与其他元件、信号或高层实体的界面端口进行连接章目录第一节第二节第三节第四节第五节〔Flash演示〕总目录ENTTITYmux2ISPORT〔d0,d1:INBIT;sel:INBIT;s:OUTBIT〕;ENDmux2;ARCHITECTUREdataflowOFmux2ISSIGNALsig:BIT;BEGINSig<=(d0ANDsel)OR(NOTselANDd1);S<=sig;ENDdataflow;例:2选1数据选择器信号定义语句〔内部信号,无方向〕功能描述语句章目录第一节第二节第三节第四节第五节总目录块语句〔BLOCK〕在较大规模的电子系统设计中,传统的硬件电路设计通常包括一张系统总电路原理图和假设干张子原理图。在VHDL程序设计中,结构体是由多个BLOCK块构成的,如果将结构体比做总电路原理图,那么,每个BLOCK块那么相当于一张子原理图。1.3块、子程序和进程
章目录第一节第二节第三节第四节第五节总目录BLOCK块语句的结构:
块标号:BLOCK接口说明类属说明BEGIN并行块语句ENDBLOCK〔块标号〕;章目录第一节第二节第三节第四节第五节总目录例:B1:BLOCKSIGNALs1:BIT;BEGINs1<=aANDb;B2:BLOCKSIGNALs2:BIT;BEGINs2<=cANDd;B3:BLOCKBEGINZ<=s2;ENDBLOCKB3;
ENDBLOCKB2;y<=s1;ENDBLOCKB1;
章目录第一节第二节第三节第四节第五节总目录PROCESS结构是最能表达VHDL语言特色的语句。与BLOCK语句一样,利用PROCESS语句结构可以描述一个功能独立的电路。与BLOCK语句不同之处是,在系统仿真时,PROCESS结构中的语句是按顺序逐条向下执行的,而不像BLOCK语句那样并发执行。一个结构体中可以有多个并行运行的进程结构,每一个进程内部是由一系列顺序语句来构成的。1.3.2进程〔PROCESS〕章目录第一节第二节第三节第四节第五节总目录PROCESS语句的结构:注意:〔1〕在多个进程的结构体描述中,进程标号是区分各个进程的标志。但是进程标号并不是必需的。〔2〕单进程以PROCESS开始,以ENDPROCESS结束。[进程标号]PROCESS[〔敏感信号表〕][IS][进程说明语句]BEGIN顺序描述语句ENDPROCESS[进程标号];章目录第一节第二节第三节第四节第五节总目录LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYnor2_v2ISPORT(a,b:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDnor2_v2;ARCHITECTUREbehaveOFnor2_v2ISBEGINPROCESS(a,b)VARIABLEcomb:STD_LOGIC_VECTOR(1DOWNTO0);例:两输入或非门y<=NOT〔aORb〕;章目录第一节第二节第三节第四节第五节总目录BEGINcomb:=a&b;CASEcombISWHEN"00"=>y<='1';WHEN"01"=>y<='0';WHEN"10"=>y<='0';WHEN"11"=>y<='0';WHENOTHERS=>y<='X';ENDCASE;ENDPROCESS;ENDbehave;
‘X’:不定章目录第一节第二节第三节第四节第五节总目录D触发器的VHDL描述D触发器【例】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF1ISPORT(CLK:INSTD_LOGIC;D:INSTD_LOGIC;Q:OUTSTD_LOGIC);ENDDFF1;ARCHITECTUREbhvOFDFF1ISSIGNALQ1:STD_LOGIC;--类似于在芯片内部定义一个数据的暂存节点BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ1<=D;ENDIF;Q<=Q1;--将内部的暂存数据向端口输出ENDPROCESS;ENDbhv;章目录第一节第二节第三节第四节第五节总目录VHDL描述的语言现象说明1.标准逻辑位数据类型STD_LOGICBIT数据类型定义:
TYPEBITIS('0','1');STD_LOGIC数据类型定义:TYPESTD_LOGICIS('U','X','0','1','Z','W','L','H','-');STD_LOGIC所定义的9种数据的含义是:‘U’表示未初始化的;‘X’表示强未知的;‘0’表示强逻辑0;‘1’表示强逻辑1;‘Z’表示高阻态;‘W’表示弱未知的;‘L’表示弱逻辑0;‘H’表示弱逻辑1;‘-’表示忽略。章目录第一节第二节第三节第四节第五节总目录VHDL描述的语言现象说明2.设计库和标准程序包3.SIGNAL信号定义和数据对象【例】ARCHITECTUREbhvOFDFF1IS
SIGNALQ1:STD_LOGIC;
BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ1<=D;ENDIF;Q<=Q1;ENDPROCESS;
ENDbhv;使用库和程序包的一般定义表式是:
LIBRARY<设计库名>;USE<设计库名>.<程序包名>.ALL;三种类型数据对象:信号signal变量variable常数constant章目录第一节第二节第三节第四节第五节总目录VHDL描述的语言现象说明4.上升沿检测表达式关键词EVENT是信号属性,VHDL通过以下表式来测定某信号的跳变边沿:信号名'EVENTAND(信号名='1')AND(信号名'LAST_VALUE='0')信号名=‘1’AND信号名’LAST_VALUE=’0’rising_edge(信号名)--信号的数据类型必须是STD_LOGIC信号名’EVENT--如CLK’EVENTwaituntil信号名='1’;--利用wait语句章目录第一节第二节第三节第四节第五节总目录实现时序电路的VHDL不同表达方式【例】...PROCESS(CLK)BEGINIFCLK'EVENTAND(CLK='1')AND(CLK'LAST_VALUE='0')THENQ<=D;--确保CLK的变化是一次上升沿的跳变ENDIF;ENDPROCESS;【例】...PROCESS(CLK)BEGINIFCLK=‘1’ANDCLK’LAST_VALUE=‘0’--同上例THENQ<=D;ENDIF;ENDPROCESS;章目录第一节第二节第三节第四节第五节总目录实现时序电路的VHDL不同表达方式【例】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF3ISPORT(CLK:INSTD_LOGIC;D:INSTD_LOGIC;Q:OUTSTD_LOGIC);ENDENTITYDFF3;ARCHITECTUREbhvOFDFF3ISSIGNALQ1:STD_LOGIC;BEGINPROCESS(CLK)BEGINIFrising_edge(CLK)--CLK的数据类型必须是STD_LOGICTHENQ1<=D;ENDIF;Q<=Q1;ENDPROCESS;ENDARCHITECTUREbhv;章目录第一节第二节第三节第四节第五节总目录
在VHDL中,数据对象(DataObjects)类似于一种容器,它接受不同数据类型的赋值。数据对象有三种,即常量(CONSTANT)、变量(VARIABLE)和信号(SIGNAL)。前两种可以从传统的计算机高级语言中找到对应的数据类型,其语言行为与高级语言中的变量和常量十分相似。但信号是具有更多的硬件特征的特殊数据对象,是VHDL中最有特色的语言要素之一。VHDL数据对象〔DataObjects〕章目录第一节第二节第三节第四节第五节总目录1.常量(CONSTANT)常量的定义和设置主要是为了使设计实体中的常数更容易阅读和修改。例如,将位矢的宽度定义为一个常量,只要修改这个常量就能很容易地改变宽度,从而改变硬件结构。在程序中,常量是一个恒定不变的值,一旦作了数据类型的赋值定义后,在程序中不能再改变,因而具有全局意义。常量的定义形式如下:CONSTANT常量名:数据类型﹕=表达式;例如:CONSTANTFBUS﹕BIT_VECTOR﹕=“01011〞;CONSTANTVCC﹕REAL﹕=5.0;CONSTANTDELY﹕TIME﹕=25ns;章目录第一节第二节第三节第四节第五节总目录
VHDL要求所定义的常量数据类型必须与表达式的数据类型一致。常量的数据类型可以是标量类型或复合类型,但不能是文件类型(File)或存取类型(Access)。常量定义语句所允许的设计单元有实体、结构体、程序包、块、进程和子程序。在程序包中定义的常量可以暂不设具体数值,它可以在程序包体中设定。章目录第一节第二节第三节第四节第五节总目录常量的可视性,即常量的使用范围取决于它被定义的位置。在程序包中定义的常量具有最大全局化特征,可以用在调用此程序包的所有设计实体中;定义在设计实体中的常量,其有效范围为这个实体定义的所有的结构体;定义在设计实体的某一结构体中的常量,那么只能用于此结构体;定义在结构体的某一单元的常量,如一个进程中,那么这个常量只能用在这一进程中。章目录第一节第二节第三节第四节第五节总目录VHDL数据对象〔DataObjects〕常量〔Constant〕固定值,不能在程序中被改变增强程序的可读性,便于修改程序可在Package、Entity、Architecture、Process、Function、Procedure中进行定义,其有效范围也相应限定书写格式:Constant常量名[,常量名…]:数据类型[:=表达式];例:Constantdata_bus_width:integer:=8;章目录第一节第二节第三节第四节第五节总目录2.变量(VARIABLE)在VHDL语法规那么中,变量是一个局部量,只能在进程和子程序中使用。变量不能将信息带出对它作出定义的当前设计单元。变量的赋值是一种理想化的数据传输,是立即发生,不存在任何延时的行为。VHDL语言规那么不支持变量附加延时语句。变量常用在实现某种算法的赋值语句中。章目录第一节第二节第三节第四节第五节总目录定义变量的语法格式如下:VARIABLE变量名:数据类型:=初始值;例如:VARIABLEA:INTEGER;--定义A为整数型变量VARIABLEB,C:INTEGER:=2;--定义B和C为整型变量,初始值为2章目录第一节第二节第三节第四节第五节总目录
变量作为局部量,其适用范围仅限于定义了变量的进程或子程序中。仿真过程中惟一的例外是共享变量。变量的值将随变量赋值语句的运算而改变。变量定义语句中的初始值可以是一个与变量具有相同数据类型的常数值,也可以是一个全局静态表达式,这个表达式的数据类型必须与所赋值变量一致。此初始值不是必需的,综合过程中综合器将略去所有的初始值。变量数值的改变是通过变量赋值来实现的,其赋值语句的语法格式如下:目标变量名:=表达式;章目录第一节第二节第三节第四节第五节总目录VHDL数据对象〔DataObjects〕变量〔Variable〕临时数据,没有物理意义只能在Process、Function、Procedure中定义,并只在其内部有效,要使其全局有效,先转换为Signal。用:=进行赋值用:=进行初始化variableresult:std_logic:=‘0’;章目录第一节第二节第三节第四节第五节总目录3.信号(SIGNAL)信号是描述硬件系统的根本数据对象,它类似于连接线。信号可以作为设计实体中并行语句模块间的信息交流通道。在VHDL中,信号及其相关的信号赋值语句、决断函数、延时语句等很好地描述了硬件系统的许多根本特征。如硬件系统运行的并行性;信号传输过程中的惯性延时特性;多驱动源的总线行为等。信号作为一种数值容器,不但可以容纳当前值,也可以保持历史值。这一属性与触发器的记忆功能有很好的对应关系。信号的定义格式如下:SIGNAL信号名:数据类型﹕=初始值;章目录第一节第二节第三节第四节第五节总目录信号初始值的设置不是必需的,而且初始值仅在VHDL的行为仿真中有效。与变量相比,信号的硬件特征更为明显,它具有全局性特性。例如,在程序包中定义的信号,对于所有调用此程序包的设计实体都是可见的;在实体中定义的信号,在其对应的结构体中都是可见的。事实上,除了没有方向说明以外,信号与实体的端口(PORT)概念是一致的。相对于端口来说,其区别只是输出端口不能读入数据,输入端口不能被赋值。信号可以看成是实体内部的端口。反之,实体的端口只是一种隐形的信号,端口的定义实际上是作了隐式的信号定义,并附加了数据流动的方向。信号本身的定义是一种显式的定义,因此,在实体中定义的端口,在其结构体中都可以看成一个信号,并加以使用而不必另作定义。以下是信号的定义例如:章目录第一节第二节第三节第四节第五节总目录SIGNALS1:STD_LOGIG﹕=0;--定义了一个标准位的单值信号S1,初始值为低电平SIGNALS2,S3:BIT; --定义了两个位BIT的信号S2和S3SIGNALS4:STD_LOGIC_VECTOR(15DOWNTO0); --定义了一个标准位矢的位矢量--(数组、总线)信号,共有16个信号元素以下例如定义的信号数据类型是设计者自行定义的,这是VHDL所允许的:TYPEFOURIS(‘X’,‘0’,‘I’,‘Z’);SIGNALS1﹕FOUR;SIGNALS2﹕FOUR﹕=‘X’;SIGNALS3﹕FOUR﹕=‘L’;章目录第一节第二节第三节第四节第五节总目录
其中,信号S1的初始值取为默认值,VHDL规定初始值取值以取LEFT'MOST项(即数组中的最左项)为默认值。在此例中是‘X’(任意状态)。信号的使用和定义范围是实体、结构体和程序包。在进程和子程序中不允许定义信号。信号可以有多个驱动源,或者说赋值信号源,但必须将此信号的数据类型定义为决断性数据类型。在进程中,只能将信号列入敏感表,而不能将变量列入敏感表。可见进程只对信号敏感,而对变量不敏感。章目录第一节第二节第三节第四节第五节总目录VHDL数据对象〔DataObjects〕信号〔Signals〕代表连线,Port也是一种信号没有方向性,可给它赋值,也可当作输入在Package、Entity、Architecture中定义设定的初始值在综合时没有用,只是在仿真时在开始设定一个起始值。用<=进行赋值用:=进行初始化signalcount:bit_vector(3downto0):=“0011〞;章目录第一节第二节第三节第四节第五节总目录4.三者的使用比较(1)从硬件电路系统来看,常量相当于电路中的恒定电平,如GND或VCC接口,而变量和信号那么相当于组合电路系统中门与门间的连接及其连线上的信号值。(2)从行为仿真和VHDL语句功能上看,二者的区别主要表现在接受和保持信号的方式、信息保持与传递的区域大小上。例如信号可以设置延时量,而变量那么不能;变量只能作为局部的信息载体,而信号那么可作为模块间的信息载体。变量的设置有时只是一种过渡,最后的信息传输和界面间的通信都靠信号来完成。章目录第一节第二节第三节第四节第五节总目录(3)从综合后所对应的硬件电路结构来看,信号一般将对应更多的硬件结构,但在许多情况下,信号和变量并没有什么区别。例如在满足一定条件的进程中,综合后它们都能引入存放器。这时它们都具有能够接受赋值这一重要的共性,而VHDL综合器并不理会它们在接受赋值时存在的延时特性。(4)虽然VHDL仿真器允许变量和信号设置初始值,但在实际应用中,VHDL综合器并不会把这些信息综合进去。这是因为实际的FPGA/CPLD芯片在上电后,并不能确保其初始状态的取向。因此,对于时序仿真来说,设置的初始值在综合时是没有实际意义的。章目录第一节第二节第三节第四节第五节总目录信号与变量的区别architecturertlofstartissignalcount:integerrange0to7;beginprocess(clk,count)beginif(clk'eventandclk='1')thencount<=count+1;if(count=0)thencarryout<='1';elsecarryout<='0';endif;endif;endprocess;endrtl;architecturertlofstartisbeginprocess(clk)variablecount:integerrange0to7;beginif(clk'eventandclk='1')thencount:=count+1;if(count=0)thencarryout<='1';elsecarryout<='0';endif;endif;endprocess;endrtl;章目录第一节第二节第三节第四节第五节总目录信号与变量的区别architectureaofstartissignaltmp:std_logic;beginprocess(a_bus)begintmp<='1';foriin3downto0loop
tmp<=a_bus(i)andtmp;endloop;carryout<=tmp;endprocess;enda;architectureaofstartisbeginprocess(a_bus)variabletmp:std_logic;begintmp:='1';foriin3downto0loop
tmp:=a_bus(i)andtmp;endloop;carryout<=tmp;endprocess;enda;章目录第一节第二节第三节第四节第五节总目录子程序被调用时,首先要初始化,执行处理功能后,将处理结果传递给主程序。子程序内部的值不能保持,子程序返回后才能被再次调用并初始化。子程序〔SUBPROGRAM〕VHDL程序与其他软件语言程序中应用子程序的目的是相似的,即能够更有效地完成重复性的工作。子程序模块是利用顺序语句定义和完成算法的,但子程序不能像进程那样可以从本结构体的其他块或进程结构中读取信号值或向信号赋值,只能通过子程序调用与子程序的界面端口进行通信。章目录第一节第二节第三节第四节第五节总目录子程序有两种类型:1.过程〔PROCEDURE〕过程〔PROCEDURE〕和函数〔FUNCTION〕过程语句的书写格式为:PROCEDURE过程名〔参数表〕IS[说明局部]BEGIN过程语句局部ENDPROCEDURE过程名;章目录第一节第二节第三节第四节第五节总目录2、过程设计实例Procedureexample(signald:instd_logic;signalclk:instd_logic;signalreset:instd_logic;signalq,qb:outstd_logic)isBeginif(reset=‘0’)thenq<=‘0’;qb<=‘1’;elsif(clk’eventandclk=‘1’)thenq<=d;qb<=notd;endif;Endexample;章目录第一节第二节第三节第四节第五节总目录2.函数函数的语言书写格式为:
FUNCTION函数名〔参数表〕RETURN数据类型IS[说明局部];BEGIN顺序语句;RETURN[返回变量名];ENDRETURN函数名;章目录第一节第二节第三节第四节第五节总目录例:用VHDL构造的选择最大值的函数程序。
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEbpacISFUNCTIONmax(a:STD_LOGIC_VECTOR;b:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTOR;ENDbpac;PACKAGEBODYbpacISFUNCTIONmax(a:STD_LOGIC_VECTOR;b:STD_LOGIC_VECTOR)章目录第一节第二节第三节第四节第五节总目录RETURNSTD_LOGIC_VECTORISVARIABLEtmp:STD_LOGIC_VECTOR(a’RANGE);BEGINIF(a>b)THENtmp:=a;ELSEtmp:=b;ENDIF;RETURNtmp;END;ENDbpac;章目录第一节第二节第三节第四节第五节总目录
VHDL语言在进行任何操作的过程中,对数据的类型都有严格的要求,但是,对名称的要求并不严格,同一名称可以定义成使用不同类型数据参数的子程序或类型。这样就可以对VHDL的子程序进行重载。子程序的重载
所谓重载就是允许设计人员编写更加可读的VHDL源代码,在多个子程序或类型有同一名称时,该名称被重载。这样在应用到具体设计中时,VHDL编译器就将会选择相适应的一个目标。重载可以使设计人员防止为了重复操作而书写多个不同名字的子程序,使VHDL源代码易于维护,易于使用。
子程序重载就是允许设计人员编写相同名字的两个或两个以上的子程序,并且允许这些子程序的参数使用不同的数据类型。
子程序重载分为函数的重载和过程的重载。章目录第一节第二节第三节第四节第五节总目录过程的重载
子程序重载的过程重载类似于函数的重载。在调用过程中使用哪一个子程序由以下条件决定的:
1、子程序调用过程中的参数的数目;2、子程序调用过程中参数的数据类型;3、子程序调用过程中使用的带名字的参数关联时参数的名字;4、子程序为函数时返回值的类型。章目录第一节第二节第三节第四节第五节总目录函数的重载
设计人员在定义函数时,可以使用相同的函数名定义多个函数,但是在调用时具体使用哪一个函数是由以下条件决定的:
1、子程序调用函数时参数的数目;2、子程序调用函数时参数的数据类型;3、子程序调用函数时使用的带名字的参数关联时参数的名字;4、子程序调用函数时返回值的类型。章目录第一节第二节第三节第四节第五节总目录库和程序包用来描述和保存元件、类型说明函数、子程序等,以便在其它设计中可以随时引用这些信息,提高设计效率。1.4.1库〔LIBRARY〕库语句的格式为:
LIBRARY库名;
库是经编译后的数据的集合,它存放包集合定义、实体定义、结构定义和配置定义。1.4库和程序包
章目录第一节第二节第三节第四节第五节总目录USE语句指明库中的程序包。一旦说明了库和程序包,整个设计实体都可以进入访问或调用,但其作用范围仅限于所说明的设计实体。USE语句的使用将使所说明的程序包对本设计实体局部或全部开放。USE语句有以下两种常用的格式:第一种语句格式的作用是向本设计实体开放指定库中的特定程序包内的所选定的工程。第二种语句格式的作用是向本设计实体开放指定库中的特定程序包内的所有内容。〔1〕USE库名.程序包名.工程名;〔2〕USE库名.程序包名.ALL;章目录第一节第二节第三节第四节第五节总目录例如:
LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_1164.STD_ULOGIC;
STD_ULOGIC:可枚举数据类型此例中,第一个USE语句说明翻开IEEE库中的STD_LOGIC_1164程序包,并使程序包中的所有公共资源对本语句后面的VHDL设计实体程序全部开放,关键词ALL代表程序包中的所有资源。第二个USE语句开放了程序包STD_LOGIC_1164中的STD_ULOGIC数据类型。章目录第一节第二节第三节第四节第五节总目录
注意:库说明语句的作用范围从一个实体说明开始到它所属的结构体、配置为止,当一个源程序中出现两个以上实体时,两条作为使用库的说明语句应在每个设计实体说明语句前重复书写。例:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYandIS
┇ENDand;ARCHITECTUREdataflowOFandIS
┇ENDdataflow;库使用说明章目录第一节第二节第三节第四节第五节总目录CONFIGURATIONc1OFandIS
┇ANDc1;LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;ENTITYorISCONFIGURATIONc2OFandIS
┇ANDc2;CONFIGURATION〔配置〕库使用说明
章目录第一节第二节第三节第四节第五节总目录程序包也叫包集合,主要用来存放各个设计都能共享的数据类型、子程序说明、属性说明和元件说明等局部。设计者使用时只要用USE子句进行说明即可。程序包的一般书写格式如下:PACKAGE程序包名ISEND[PACKAGE]程序包名;——程序包首PACKAGEBODY程序包名IS
┇——程序包体END[PACKAGEBODY][程序包名];
程序包由两局部组成:程序包首和程序包体。1.4.2程序包章目录第一节第二节第三节第四节第五节总目录例:;PACKAGEmathISTYPEtw16 ISARRAY〔0TO15〕OFT_WLOGIC;FUNCTIONadd〔a,b:INtw16〕RETURNtw16;FUNCTIONsub〔a,b:INtw16〕RETURNtw16;ENDmath;PACKAGEBODYmathISFUNCTIONvect_to_int〔s:tw16〕;RETURNINTEGERISVARIBLEresult:INTEGER:=0;章目录第一节第二节第三节第四节第五节总目录BEGINFORiIN0TO7LOOPresult:=result*2;IFs(i)=’1’THENresult:=result+1ENDIF;ENDLOOP;RETURNresult;ENDvect_to_int;FUNCTIONint_to_tw16(s:INTEGER);RETURNtw16ISVARIBLEresult:tw16;VARIBLEdigit:INTEGER:=2**15;VARIBLElocal:INTEGER;章目录第一节第二节第三节第四节第五节总目录BEGINlocal:=s;FORiIN15DOWNTO0LOOPIFlocal/digit>=1THENLocal:=local-digit;ELSEresult(i):=0;ENDIF;digit:=digit/2;ENDLOOP;RETURNresult;ENDint_to_tw16;章目录第一节第二节第三节第四节第五节总目录FUNCTIONadd(a,b:INtw16);RETURNtw16ISVARIBLEresult:INTEGER;BEGINresult:=vect_to_int(a)+vect_to_int(b);RETURNint_to_tw16(result);ENDadd;FUNCTIONsub(a,b:INtw16);RETURNtw16ISVARIBLEresult:INTEGER;BEGINresult:=vect_to_int(a)+vect_to_int(b);RETURNint_to_tw16(result);ENDsub;ENDmath;章目录第一节第二节第三节第四节第五节总目录此例的程序包是由程序包首和程序包体两局部组成。(1)程序包首定义了数据类型和函数的调用说明(2)程序包体中才具体描述实现该函数功能的语句和数据的赋值。分开描述的好处是:当函数的功能需要做某些调整或数据赋值需要变化时,只要改变程序包体的相关语句就可以了,而无需改变程序包首的说明,这样就使得需要重新编译的单元数目尽可能的减少了。章目录第一节第二节第三节第四节第五节总目录1.5配置
在用VHDL描述硬件电路时,常常采用结构描述方式和混合描述方式。在这两种描述方式中,常常需要将其他设计实体作为元件进行引用,这时就需要将不同元件通过配置安装到不同的设计实体中。VHDL提供了配置语句用于描述各种设计实体和元件之间连接关系以及设计实体和结构体之间的连接关系。章目录第一节第二节第三节第四节第五节总目录例:与、或、与非、或非、异或,5个结构体共用一个实体。默认配置语句的根本格式为:CONFIGURATION配置名OF实体名IS
FOR选配结构体名ENDFOREND配置名;1.5.1默认配置章目录第一节第二节第三节第四节第五节总目录ARCHITECTUREor2_arcOFexample_vISBEGINy<=aORb;ENDor2_arc;ARCHITECTUREand2_arcOFexample_vISBEGINy<=aANDb;ENDand2_arc;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYexample_vISPORT(a:INSTD_LOGIC;b:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDexample_v;章目录第一节第二节第三节第四节第五节总目录ARCHITECTURExor2_arcOFexample_vISBEGINy<=aXORb;ENDxor2_arc;ARCHITECTUREnor2_arcOFexample_vISBEGINy<=NOT(aORb);ENDnor2_arc;ARCHITECTUREnand2_arcOFexample_vISBEGINy<=NOT(aANDb);ENDnand2_arc;章目录第一节第二节第三节第四节第五节总目录CONFIGURATIONcfg3OFexample_vISFORnand2_arcENDFOR;ENDcfg3;CONFIGURATIONcfg2OFexample_vISFORor2_arcENDFOR;ENDcfg2;CONFIGURATIONcfg1OFexample_vISFORand2_arcENDFOR;ENDcfg1;cfg1将与逻辑结构体配置给实体cfg2将或逻辑结构体配置给实体cfg3将与非逻辑结构体配置给实体章目录第一节第二节第三节第四节第五节总目录CONFIGURATIONcfg5OFexample_vISFORxor2_arcENDFOR;ENDcfg5;在上例〔example_v〕中,有5个不同的结构体,分别用来完成二输入的逻辑与、或、与非、或非和逻辑异或的运算操作。CONFIGURATIONcfg4OFexample_vISFORnor2_arcENDFOR;ENDcfg4;cfg4将与非逻辑结构体配置给实体cfg5将异或逻辑结构体配置给实体章目录第一节第二节第三节第四节第五节总目录在程序中使用了5个默认配置语句来指明设计实体example_v和哪个结构体一起组成一个完整的设计,见程序过程中的标注。在进行模拟的时候,将根据所编译的是上面的哪个配置来决定要进行模拟的结构体,也就是说最后一个被编译的结构体〔异或逻辑〕将被模拟,以下图就是异或逻辑的仿真波形。章目录第一节第二节第三节第四节第五节总目录
异或门仿真波形章目录第一节第二节第三节第四节第五节总目录结构体的配置主要是用来对结构体中引用的元件进行配置。结构体的配置的书写格式:FOR<元件例化标号>:<元件名>USEENTITY<库名>.<实体名(结构体名)>;1.5.2结构体的配置以1位全加器的构成为例说明结构体的配置的用法:将两输入与门、或门、异或门设置成通用例化元件由结构体引用。章目录第一节第二节第三节第四节第五节总目录LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYand2_vISPORT(a:INSTD_LOGIC;b:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDand2_v;二输入与门源代码:ARCHITECTUREand2_arcOFand2_vISBEGINy<=aANDb;ENDand2_arc;CONFIGURATIONand2_cfgOFand2_vISFORand2_arcENDfor;ENDand2_cfg;章目录第一节第二节第三节第四节第五节总目录与门and2_v仿真波形章目录第一节第二节第三节第四节第五节总目录LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYor2_vISPORT(a:INSTD_LOGIC;b:INSTD_LOGIC;y:OUTSTD_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论