1、VHDL语言概述,VHDL语言程序的结构,结构组成,一个完整的VHDL语言程序通常被称为实体。,一个设计中通常包括的几个部分,(1)库(Library) (2)程序包(Package) (3)实体说明(Entity Declaration) (4)结构体(Architecture Body) (5)配置(Configuration),库(Library),库(Library):用来存放已经编译过的实体说明、结构体、程序包和配置。 库中的各元素可以用做其他设计的资源 若要引用库中已编译好的单元,需在VHDL设计的程序开始说明引用的库。格式如下: LIBRARY ,库(Library),说明引用库后,还要说明要使用库中的哪一个设计单元,用USE语句。 USE ALL 程序包名就是实际设计要使用的库中的设计单元。 ALL表示使用程序包中的所有项目。,库(Library),专门存放预先编译好的程序包的地方 库对应着一个目录,在这个目录中有许多预编译好的程序包 用户自建的库即为设计文件所在的目录,默认为当前的工作库:WORK库。 库名与目录名的对应关系可在编译软件中指定 VHDL中的两个符合IE
2、EE的标准库“STD”和“ieee”,标准库中的程序包,关于库的说明,std库是默认的标准库,即默认是可见的,因此可以省去库的声明 ieee库虽得到了IEEE的认可,却常常被认为是用户的库,因此使用时需要声明 LIBRARY ieee; USE ieee.std_logic_1164.all;,关于库的说明,在MAX+PLUS II软件系统中,在ALTERA库中提供了如下两个程序包: maxplus2定义了74系列各模块 megacore定义了如FFT、8255、8251、图象格式转换等大的模块。 在Quartus II软件系统中,提供了更丰富的程序包: Megafunctions Primitives others,关于库的说明,LPM库:参数化的模块库 使用不同的端口 指定不同的参数 Library lpm; Use lpm.lpm_components.all,LPM库举例,LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_signed.all;
3、LIBRARY lpm; USE lpm.lpm_components.all; ENTITY tst_mux IS PORT (a : in std_logic_2d (3 downto 0, 15 downto 0); sel : in std_logic_vector(1 downto 0); y : out std_logic_vector (15 downto 0); END tst_mux; ARCHITECTURE behavior OF tst_mux IS BEGIN u1: lpm_mux GENERIC MAP(lpm_width = 16, lpm_size = 4, lpm_widths = 2) PORT MAP (data = a, sel = sel, result = y); END behavior;,实体说明(Entity Declaration),描述一个设计的外貌,即定义对外的输入输出接口以及一些参数定义 格式如下: ENTITY 实体名 IS GENERIC ( 类属表 ); PORT ( 端口表 ); END ENTITY 实体名;,实体说
4、明之 类属参数说明,为设计实体指定参数,如用来定义端口宽度、器件延时参数等 格式如下: GENERIC(CONSTANT参数名:数据类型:=静态表达式,); 例如:GENERIC(delay : time);表示参数名delay是时间类型的,在结构体中将delay初始化成不同的数值从而满足实际的需要。 例如:GENERIC(n : INTEGER ); 表示参数名n是整数类型的,实体说明之 PORT(端口)说明,对一个设计实体界面的说明及对设计实体与外部电路的接口通道的说明,包括对每一接口的输入输出模式和数据类型的定义。 格式如下: PORT ( 端口名 : 端口模式 数据类型 ; 端口名 : 端口模式 数据类型 ) ; 端口名是设计者为实体的每一个对外通道所取的名字 端口模式用于定义端口上数据的流动方向和方式,端口模式,IN:IN定义的通道为单向只读模式,规定数据只能通过此端口被读入实体中。 OUT:OUT定义的通道为单向输出模式,规定数据只能通过此端口从实体向外流出,或者说可以将实体中的数据向此端口赋值。 INOUT:INOUT定义的通道确定为输入输出双向端口 即从端口的内部看,可
5、以对此端口进行赋值,也可以通过此端口读入外部的数据信息 从端口的外部看,信号既可以从此端口流出,也可以向此端口输入信号,如RAM的数据端口,单片机的I/O口。在实际电路描述中,INOUT模式的正确使用还应该考虑其它因素。,端口模式,BUFFER:BUFFER的功能与INOUT类似,区别在于当需要输入数据时,只允许内部回读输出的信号,即允许反馈。如计数器的设计,可将计数器输出的计数信号回读,以作下一计数值的初值。与INOUT模式相比,BUFFER回读(输入)的信号不是由外部输入的,而是由内部产生,向外输出的信号。,数据类型,VHDL作为一种强类型语言,任何一种数据对象(信号、变量、常数)必须严格限定其取值范围,即对其传输或存储的数据类型作明确的界定。 常见的数据类型主要有STD_LOGIC(标准逻辑位)、STD_LOGIC_vector(标准逻辑位向量)、BIT(逻辑位)、BIT_VECTOR(位向量)。 BIT数据类型的信号规定的取值范围是逻辑位1和0。在VHDL中,逻辑位0和1的表达必须加单引号 ,否则VHDL综合器将0和1解释为整数数据类型INTEGER。,数据类型,BIT数据类型
6、可以参与逻辑运算或算术运算,其结果仍是位的数据类型。VHDL综合器用一个二进制位表示BIT。 BIT数据类型的定义或者说是解释包含在VHDL标准程序包STANDARD中,而程序包STANDARD包含于VHDL标准库STD中。这是系统默认的库,在开始处可以不要说明。 STD_LOGIC(标准逻辑位)、STD_LOGIC_vector(标准逻辑位向量)数据类型的定义包含在IEEE库的包集合STD_LOGIC_1164中,因此需要用包集合的说明语句说明:USE STD_LOGIC_1164.ALL;,“实体说明”的几点说明,以VHD为后缀名的文件名要求与实体名一致。 端口定义的每一行以“;”结尾,但最后一行定义完后没有分号,分号在括号的外面。 以“-”开始到本行结束为注释行,“实体说明”举例,触发器的实体: ENTITY DFF1 IS PORT( CLK:IN STD_LOGIC; D:IN STD_LOGIC; Q:OUT STD_LOGIC ); END DFF1;-87标准,也可以写成END ENTITY DFF1,这是93标准,“实体说明”举例,3-8译码器的实体: ENTITY
7、decoder IS PORT( datain: IN STD_LOGIC_VECTOR(2 DOWNTO 0); g1,g2a,g2b: IN STD_LOGIC; y:OUT STD_LOGIC_vector(7 downto 0); END decoder;,“实体说明”举例,流水线加法器 ENTITY add_lp is GENERIC(WIDTH :integer:=15; WIDTH1:integer:=7; WIDTH2:integer:=8; ONE : integer:=1); PORT(x,y:IN STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0); sum: out STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0); clk:IN std_logic); END ENTITY add_lp;,结构体(Architecture Body),能被仿真的实体都包含有结构体 一个实体和其对应的结构体构成一个完整的VHDL设计,一个实体可以有多个结构体。 不同的结构体可以采用不同的描述方式 结构体的命名只要符合标识符的规定就可以。但是
8、结构体一般采用行为/寄存器/结构描述方式,因此按照见名知义的要求,其名字一般为behave/rtl/structure。,结构体(Architecture Body),结构体一般包括声明区(Declarations)和并发语句区两个部分组成。 声明区用于声明该结构体内使用的类型、常数、元件、子程序等。 并发语句区用来描述结构体的行为和连接关系。并发语句的类型主要有块语句、进程语句、信号赋值、子程序调用、元件例化语句。 结构体部分包含了VHDL的很多元素,掌握好它们是灵活应用VHDL的关键。,结构体的一般形式,ARCHITECTURE OF IS -声明区,声明结构体内所用的内部信号及数据类型 -若使用元件例化,则声明所用的元件 BEGIN -CONCURRENT SIGNAL ASSIGNMENTS; -PROCESS; -COMPONENT INSTANTIATIONS; END ;,结构体举例十进制计数器,ARCHITECTURE BEHAVE OF COUNTER IS SIGNAL CNT STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(
9、CLK) BENGIN IF(RISING_EDGE(CLK) IF(CNT = ”1001”) THEN CNT = ”0000”; ELSE CNT = CNT + 1; END IF; END IF; END PROCESS; END BEHAVE;,结构体举例二选一电路,二选一电路mux21a的实体和结构体如下面的图所示。,结构体举例二选一电路,ENTITY mux21a IS PORT ( a, b : IN BIT; s : IN BIT; y : OUT BIT ); END ENTITY mux21a; ARCHITECTURE STRUCTURE OF mux21a IS SIGNAL d,e : BIT; BEGIN d = a AND (NOT S) ; e = b AND s ; y = d OR e ; END STRUCTURE ;,程序包(Package),程序包定义了一组数据类型说明、常量说明、元件说明和子程序说明,以供其他多个设计引用。如同C语言中的头文件(*.H)。 通过引用程序包,使得程序包中的说明对引用的实体成为可见 程序包有事先定义好的,也有用户定义的。 引用程序包时,使用USE语句,放在设计的开始。 如 USE IEEE.STD_LOGIC_1164.ALL;,VHDL的元素,VHDL的元素,(1)VHDL语言的词法和标识符 (2)VHDL语言的对象 (3)VHDL语言的数据类型 (4)VHDL语言的运算符,词法和标识符,短标识符 VHDL-93接收了VHDL-87关于标识符的全部标准,VHDL-87标准中的标识符称为短标识符,VHDL-93标准中的标识符称为扩展标识符。 短标识符的组成:英文字母、数字、下划线 短标识符的开始:必须以英文字母开始 短标识符不敏感大小写 短标识符的最后一个字符不能是下划线 下划线不能连续出现 不能采用保留字作为短标识符,词法和标识符,扩展标识符 扩展标识符用反斜杠来界定,例如:data_bus 扩展标识符的两个反斜杠之间可以使用保留字。ENTITY 扩展标识符区分大小写 扩展标识符允许下划线连续使用 同名的扩展标识符和短标识符是不一样的。例如:data_bus和data_bus不一样,词法和
《vhdl语言&quartusii》由会员tia****nde分享,可在线阅读,更多相关《vhdl语言&quartusii》请在金锄头文库上搜索。