VHDL通用包的深入解析与应用
立即解锁
发布时间: 2025-08-16 01:28:53 阅读量: 4 订阅数: 11 


VHDL设计指南:从入门到精通
### VHDL 通用包的深入解析与应用
#### 1. 通用包概述
在 VHDL 中,我们可以在包声明中包含通用列表,使包能够针对不同的实际类型和操作进行复用。当我们有一个使用通用项指定的抽象数据类型(ADT)包,并且想要提供一个扩展该 ADT 类型和操作的包时,为了使扩展包可复用,我们需要为 ADT 的命名类型指定一个通用类型实例,以及为 ADT 的每个操作提供通用子程序。但如果 ADT 有很多操作,在扩展包的每个实例中指定它们作为实际通用子程序会非常繁琐。为避免这种情况,VHDL 允许我们将 ADT 包的实例指定为扩展包的形式通用包。
#### 2. 形式通用包的三种形式
形式通用包在通用列表中有三种声明形式,下面分别进行介绍:
- **第一种形式**
- **语法**:
```plaintext
interface_declaration ⇐
package identifier is new uninstantiated_package_name
generic map ( <> )
```
- **说明**:这种形式下,形式包表示命名未实例化包的一个实例,用于包含通用列表的封闭单元。封闭单元通常是未实例化的包,但也可以在实体和子程序的通用列表中指定形式通用包。当实例化封闭单元时,我们提供一个与形式通用包对应的实际包,实际包必须是命名未实例化包的实例。形式通用包的通用映射中使用的“<>”符号表示实际包可以是命名未实例化包的任何实例。当封闭单元不依赖于为实际通用包定义的特定实际通用项时,使用这种形式。
- **第二种形式**
- **语法**:
```plaintext
interface_declaration ⇐
package identifier is new uninstantiated_package_name
generic map ( generic_association_list )
```
- **说明**:同样,形式包表示命名未实例化包的一个实例。形式通用包的通用映射中提供的实际通用项指定实际包必须是具有相同实际通用项的命名未实例化包的实例。当封闭单元在其通用列表中较早定义了另一个形式通用包时,通常使用这种形式。
- **第三种形式**
- **语法**:
```plaintext
interface_declaration ⇐
package identifier is new uninstantiated_package_name
generic map ( default )
```
- **说明**:这种形式的用法与第二种形式类似,但用保留字“default”替换了实际通用项。当命名未实例化包的所有形式通用项都有默认值时,可以使用这种形式。实际包必须是所有实际通用项都与命名未实例化包的通用列表中的默认值相同的实例。
#### 3. 示例分析
下面通过具体的示例来进一步理解通用包的使用。
- **固定点复数包示例**
- **固定点包 `fixed_generic_pkg`**:该标准包定义了以 `std_ulogic` 元素向量表示的固定点数字的 ADT。它是一个未实例化的包,包含用于指定结果舍入方式、溢出处理方式、用于保持精度的保护位数以及是否发出警告的通用常量。
```vhdl
library ieee; use ...;
package fixed_generic_pkg is
generic (
fixed_round_style : fixed_round_style_type
:= fixed_round;
fixed_overflow_style : fixed_overflow_style_type
:= fixed_saturate;
fixed_guard_bits : natural := 3;
no_warning : boolean := false
);
...
end package fixed_generic_pkg;
```
- **固定点复数包 `complex_generic_pkg`**:我们希望在固定点包的基础上定义固定点复数,其实部和虚部具有相同的左右索引边界。因此,在复数包的通用列表中包含了一个形式通用包。
```vhdl
library ieee;
package complex_generic_pkg is
generic ( left, right : integer;
package fixed_pkg_for_complex is
new ieee.fixed_generic_pkg
generic map (<>) );
use fixed_pkg_for_complex.all;
type complex is record
re, im : sfixed(left downto right);
end record;
function "-" ( z : complex ) return complex;
function conj ( z : complex ) return complex;
function "+" ( l : complex; r : complex ) return complex;
function "-" ( l : complex; r : complex ) return complex;
function "*" ( l : complex; r : complex ) return complex;
function "/" ( l : complex; r : complex ) return complex;
end package complex_generic_pkg;
```
- **包体实现**:
```vhdl
package body fixed_complex_pkg is
function "-" ( z : complex ) return complex is
begin
return ( -z.re, -z.im );
end function "-";
...
end package body fixed_complex_pkg;
```
- **实例化示例**:
```vhdl
package dsp_fixed_pkg is new ieee.fixed_generic_pkg
generic map ( fixed_rounding_style => fixed_round,
fixed_overflow_style => fixed_saturate,
fixed_guard_bits => 2,
no_warning => false );
package dsp_complex_pkg is new work.complex_generic_pkg
generic map ( le
```
0
0
复制全文
相关推荐










