VHDL中别名与泛型的使用详解
立即解锁
发布时间: 2025-08-16 01:28:52 阅读量: 3 订阅数: 11 


VHDL设计指南:从入门到精通
### VHDL中别名与泛型的使用详解
#### 1. VHDL早期版本中的别名限制
在VHDL - 87、-93和 - 2002这些早期版本中,不允许对多维数组对象使用别名。例如以下代码在早期版本中是非法的:
```vhdl
type bit_matrix is
array (natural range <>, natural range <>) of bit;
signal s : bit_matrix(15 downto 0, 15 downto 0);
alias bigendian_s : bit_matrix(0 to 15, 0 to 15) is s;
```
在VHDL - 87中,别名声明必须包含子类型指示。
#### 2. 非数据项的别名
我们不仅可以为常量、变量和信号等数据对象声明别名,还能为类型、子程序、包、实体等不代表存储数据的命名项声明别名。不过,标签、循环参数和生成参数不能声明别名。非数据项别名声明的语法规则如下:
```plaintext
alias_declaration ⇐
alias ( identifier I character_literal I operator_symbol )
is name [ signature ] ;
```
- **类型别名**:为类型定义别名后,可在原类型名能使用的任何上下文中使用该别名,且原类型值的所有预定义操作都可直接使用,无需重新声明。例如:
```vhdl
alias binary_string is bit_vector;
variable s1, s2 : binary_string(0 to 7);
s1 := s1 and not s2;
```
声明类型别名与声明新类型不同,声明新类型时必须声明运算符的新重载版本,而别名只是现有类型的另一个名称。
- **枚举类型别名**:为枚举类型定义别名后,原类型的所有枚举文字都可直接使用,无需为文字定义别名或使用全选名称。例如:
```vhdl
type system_status is (idle, active, overloaded);
alias status_type is work.system_types.system_status;
```
此时可直接引用`idle`、`active`和`overloaded`,而无需使用`work.system_types.overloaded`等。
- **物理类型别名**:为物理类型声明别名后,所有单位名称都可直接使用,无需别名或选择。
- **签名的使用**:别名声明中的可选签名部分仅用于子程序和枚举文字的别名。由于这些项可能会重载,仅名称可能不足以确定别名所指向的项,签名用于唯一标识一个项。签名的语法规则如下:
```plaintext
signature ⇐ [ [ type_mark { , … } ] [ return type_mark ] ]
```
- **子程序别名**:为子程序声明别名时,签名标识别名所指向的子程序名称的重载版本。签名按子程序声明中参数出现的顺序列出每个参数的类型。例如:
```vhdl
procedure increment ( bv : inout bit_vector; by : in integer := 1 );
procedure increment ( int : inout integer; by : in integer := 1 );
alias bv_increment is
work.arithmetic_ops.increment [ bit_vector, integer ];
alias int_increment is
work.arithmetic_ops.increment [ integer, integer ];
```
- **函数别名**:如果子程序是函数,签名还需在`return`关键字后包含返回值的类型。例如:
```vhdl
alias "*" is "and" [ bit, bit return bit ];
alias "+" is "or" [ bit, bit return bit ];
alias "-" is "not" [ bit return bit ];
```
这样就可以使用这些运算符来表达布尔方程,如:
```vhdl
s <= a * b + (-a) * c;
```
- **枚举文字别名**:为枚举类型的单个文字定义别名时,由于文字可能属于多个不同的枚举类型,可使用签名来区分特定含义。例如:
```vhdl
alias high is std.standard.'1' [ return bit ];
```
签名将文字区分出来为`bit`类型,而不是其他字符类型。
#### 3. 别名在组合包中的应用
非数据项别名的一个有用应用是通过收集其他包中声明的多个项来组合一个包。例如,在DMA控制器设计中使用的以下包为从`cpu_types`包导入的两种类型和从提供位向量算术运算的包导入的一个函数定义了别名:
```vhdl
package DMA_controller_types_and_utilities is
alias word is work.cpu_types.word;
alias status_value is work.cpu_types.status_value;
alias "+" is work.bit_vector_unsigned_arithmetic."+"
[ bit_vector, bit_vector return bit_vector ];
...
end package DMA_controller_types_and_utilities;
```
在DMA控制器的架构体中可以导入这些别名并使用:
```vhdl
architecture behavioral of DMA_controller is
use work.DMA_controller_types_and_utilities.all;
begin
behavior : process is
variable address_reg0, address_reg1 : word;
variable count_reg0, count_reg1 : word;
...
begin
...
address_reg0 := address_reg0 + X"0000_0004";
...
end process behavior;
end architecture behavioral;
```
#### 4. 练习题
以下是一些关于别名的练习题:
1. 给定以下声明,为变量的各个元素编写别名声明:
```vhdl
subtype byte is bit_vector(0 to 7);
type data_array is array (0 to 31) of byte;
type network_packet is record
source, dest, flags : byte;
payload : data_array;
checksum : byte;
end record network_packet;
variable received_packet : network_packet;
```
2. 对于网络数据包`flags`元素中的信息布局,为`received_packet`变量的`flags`元素的各个字段编写别名声明。`ACKNO`和`SEQNO`字段的别名应将这些字段视为从2到0索引的位向量。
3. 编写一个别名声明,将名称`cons`定义为预定义操作`&`的别名,该操作左参数为字符,右参数为字符串,结果为字符串。在报告语句中使用该别名,报告由变量`grade_char`的值与字符串`–grade`连接而成的字符串。
4. 开发一个位反转模块的行为模型,其实体接口如下:
```vhdl
entity reverser is
port ( d_in : in std_ulogic_vector;
d_out : out std_ulogic_vector );
end entity reverser;
```
当实体实例化时,实际信号必须长度相同,但索引边界和方向可能不同。输出是输入使用传输延迟延迟500 ps,并且位的顺序从左到右反转。
下面用mermaid流程图展示别名使用的一般流程:
```mermaid
graph TD;
A[确定需要使用别名的项] --> B{项是否为数据项};
B -- 是
```
0
0
复制全文
相关推荐








