跳转到内容

可编程逻辑/VHDL 数据类型

来自维基教科书,开放的书籍,开放的世界

本页将讨论一些 VHDL 的基本数据类型。

std.standard

[编辑 | 编辑源代码]

0 和 1

Boolean 是另一种预定义类型,其值是 FALSE 和 TRUE。

此整数的值范围为 -2147483648 到 2147483648。

实数范围为 �1.0E38 到 þ1.0E38。不可综合。

Character

[编辑 | 编辑源代码]

单个 ASCII 字符或此类字符的字符串。不可综合。

用于告知物理量,如时间、电压等。在仿真中很有用。不可综合。

用户定义类型

[编辑 | 编辑源代码]

枚举类型

[编辑 | 编辑源代码]

数组允许创建许多相同的数据类型。这些数据类型使用称为索引的数字访问。一个数组声明示例如下

type tIntegerArray is array ( 7 downto 0 ) of integer;

此声明将创建一个新的数据类型,该数据类型是一个数组。此数组将包含 8 个整数,索引为数字 7、6、5、... 1、0。

声明后,数组可以像任何数据类型一样使用

signal sBunchOfInts: tIntegerArray;

数组的单个元素可以使用 () 访问

sBunchOfInts(2) <= 4;

许多更新的综合工具会将数组扩展为许多信号,并将数组作为后缀追加到信号名称的末尾。这有助于组织重复的 VHDL 代码,并允许 std_logic_vectors 在 VHDL 代码的 for generate 和 for loop 中使用。这减少了代码行数,有助于组织代码并使其更易于维护。

记录允许将相关数据类型组合在一起。它类似于 C 编程中的“struct”。虽然记录不会向模块添加任何其他功能,但它们确实有助于组织代码并使其更易于维护。以下是一个记录声明示例

type rStatus is record
   read_failure: std_logic;
   write_failure: std_logic;
   failure_count: std_logic_vector( 7 downto 0 );
end record;

声明记录后,可以使用记录作为类型来声明端口、信号或变量

decoder_status : in rStatus;
signal sStatus:      rStatus;
signal sStatus_next: rStatus;
variable vStatus: rStatus;

可以使用“.”访问记录类型

sStatus_next.failure_count <= sStatus.failure_count + x"01";

虽然它们以前仅限于测试平台和其他仅仿真 VHDL 模块,但许多更新的综合工具会将记录类型正确扩展到其各个部分。这使得记录类型的组织和可维护性优势能够在 RTL 和其他可综合代码中使用。

子类型

[编辑 | 编辑源代码]

常用库

[编辑 | 编辑源代码]

ieee.std_logic_1164

[编辑 | 编辑源代码]

ieee.std_logic_1164 库旨在为数字电路逻辑值提供标准表示。它定义了类型 std_logic 以及 std_logic 的各种操作(以及、或、非等)。在为可综合电路编写 VHDL 时,这通常是必需的库。

定义的数据类型

[编辑 | 编辑源代码]
名称 范围 可综合的值 描述
std_logic 'U' - 未初始化
'X' - 强制未知
'0' - 强制 0
'1' - 强制 1
'Z' - 高阻抗
'W' - 弱未知
'L' - 弱 0
'H' - 弱 '1'
'-' - 不关心
'1', '0', 'Z' std_logic 是一个枚举,它表示逻辑电路中信号的各种可能状态。
std_logic_vector 一个 std_logic 字符串,例如“01001XZ” 包含 '1'、'0' 和/或 'Z' 的字符串 std_logic_vector 是一个 std_logic 值的字符串。它允许轻松表示总线和其他多个信号值。

ieee.numeric_std

[编辑 | 编辑源代码]

ieee.numeric_std 定义了带符号和无符号类型及其算术运算。它基于 std_logic_vector,因此它与整数不同。

ieee.std_logic_arith

[编辑 | 编辑源代码]

这不是一个标准库,尽管它位于“ieee”库中。始终使用 numeric_std 代替。

更多详细信息请参见此处

华夏公益教科书