库和包
-
一组相关的过程和函数可以汇集在一起,组成一个包;
-
一个包可以在一些VHDL模型中共享;
-
一个包可以包含用户定义的数据类型和约束;
-
库是包的集合; 包和库可视为函数、过程和数据类型的容器;
-
包的另外一个重要特征是可包含不同用户定义的元件。
Library(库)
库是经编译后的数据的集合,包含一个或多个包
库的分类
设计库: STD库 ;Work库
资源库: IEEE库 ;Vital库(面向ASIC的VHDL模型基准库) ;用户自定义库
package(包)
包的主要用途是实现整个设计工程中信息的共享。
包的组成
包的声明
类型声明
子程序声明
包体
子程序定义
VHDL 的标准库(std)有两个内嵌包
标准包
TEXTIO
(1) IEEE库
VHDL设计中最为常用的库。
4个程序包:std_logic_1164,std_ logic_ arith, std_ logic_ signed和std_ logic_ unsigned。
std_logic_1164程序包:包含std_logic、std_logic_vector等类型定义及其相关逻辑类运算子程序定义。
std_logic_arith程序包:包含std_logic类型数据的算术运算子程序定义。(如+-*移位比较等)
std_logic_signed程序包:std_logic_vector类型的符号数算术运算子程序定义。
std_logic_unsigned程序包: std_logic_vector类型的无符号数算术运算子程序定义。
使用这4个程序包必须在设计实体前显式表达出来.
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
(2) std库
std库是VHDL语言的标准库.库中定义了standard和textio两个标准程序包.
standard程序包中定义了VHDL的基本的数据类型.
用户在程序中可以随时调用standard包中的内容,不需要作任何说明.
textio程序包中定义了对文本文件的读和写控制的数据类型和子程序.
用户在程序中调用textio程序包中的内容时,需要用use语句加以说明.
library std; use std.textio.all;
(3)work库
work库是现行的作业库,设计者所描述的VHDL语句经过编译后在缺省状态下将全部存放在work库中.
当使用该库时,不需要作任何说明.
但使用该库中的程序包,需要用USE语句进行说明.
自定义程序包
程序包也叫包集合,主要用来存放各个设计都能共享的数据类型、常数、子程序说明和元件说明等部分。
设计者使用时只要用USE语句进行说明即可。
程序包由两部分组成:
程序包首和程序包体。
程序包结构中,程序包体并非必须的。程序包首可以独立定义和使用。
一个完整的程序包中,程序包首名和程序包体名是同一个名字.
1.程序包首
格式:
PACKAGE 程序包名 IS 程序包首说明语句 END [PACKAGE] 程序包名;
程序包首说明部分包括程序包中的数据类型、信号、常量、子程序及元件说明。
这些说明是公用的,可供外部引用。
例5-38:
PACKAGE pacl IS type byte is range 0 to 255; subtype nibble is byte range 0 to 15; constant byte_ff: byte:=255; signal addend: nibble; component byte_adder is port(a,b:in byte; c:out byte; overflow:out boolean); end component; function my_function(a: byte)return byte; end pacl;
2.程序包体
程序包体格式如下:
package body 程序包名 IS 程序包体说明语句及包体内容 end [package body] 程序包名;
程序包体规定子程序的实际功能,存放程序包首中说明的子程序.这些内容是专用的,不能被其他设计单元引用.
如果程序包首中没有子程序的说明,则程序包体可以省去。
程序包体说明部分可以是USE语句,数据类型说明、子类型说明、子程序定义、子程序体及常数说明。
包体
包体用来存储函数和过程的定义或实现。
包体通常和包声明是联系在一起的。
主要包括子程序的实现代码。
工作库 包含一个名为my_pack的包;
有一个名为 myadd 声明在包中;
包体是可选的. 元件 myadd 在另外一个vhd中实现.
如下图:
Myadd.vhd的实现
一个自定义的库
库名mylib
一般库名设置为库文件夹名或者文件名
包: mypack
库文件需要添加到当前工程,实质库为work库,库名不重要 应用
子程序
类似于其他语言中的子程序
可使代码重复利用,不用重写
每一次调用生成相对于的一个电路
与普通软件中子程序调用的区别:
普通软件子程序调用增加处理时间;
VHDL中每调用一次子程序,其综合后都将对应一个相应的电路模块。子程序调用次数与综合后的电路规模成正比。
设计中应严格控制子程序调用次数。
子程序的类型:
(1)函数(Function)
(2)过程(Procedure)
类似于其他语言中的子程序
可使代码重复利用,不用重写
每一次调用生成相对于的一个电路
VHDL提供函数和过程
子程序中的VHDL代码是顺序语句,这意味着在子程序中只允许使用顺序语句,并发语句、进程语句等是不允许出现的。
在子程序中,只能声明变量,不能声明信号。
在子程序中,不能使用wait语句。
函数
产生一个返回值
参数只能为in模式
传递的参数在函数内部只能使用不能修改(因为参数为in)
允许的参数数据类型为 constant或signal,默认constant
需要一个RETURN 语句
格式:
函数特征
函数由实参调用
Example:
rising_edge(enable);
形参和实参必须匹配.
形参为constant,则实参可以是variable、signal、constant或表达式;形参为signal,实参要为signal.
过程
与函数类似
参数可以是 in, out, inout 模式
输入参数(in)的默认数据类型是constant
输出参数(out)或者inout参数默认数据类型variable
参数对象可为 constant, variable and signal
其特征是过程中可以修改参数值(out,inout模式参数)
不需要RETURN语句
过程特征
过程调用参数需要一一对应,形参为constant,实参可以为signal、constant或variable;
形参若为signal或variable,则实参需对应一致的类型
作为独立的语句进行调用
函数和过程