//VHDL
[数据类型]
在VHDL中,
必须在信号声明(信号),变量声明(变量)和常量声明(constant)的所有情况下指定数据类型。
如果此类型不同,则诸如赋值之类的表达式将作为错误翻转。
VHDL不仅具有多种类型的数据,
还可以自己创建新类型。
此外,还有在这些不同类型之间转换的函数。 [VHDL的标准类型]
//下表中的类型是VHDL标准预先提供的,
[用户定义类型]
用户可以定义新的数据类型。
那时,使用了称为type和subtype的声明语句。 (1)类型定义
用于新类型定义的类型语句的格式如下。
<<对于枚举类型>> 类型数据类型名称为(element,element,...);
示例周类型WEEK的定义类型WEEK
类型为(SUN,MON,TUE,WED,THU,FRI,SAT);
示例std_logic
std_logic 的定义是最常用的类型,在名为std_logic_1164的
IEEE程序包中键入如下。
std_logic类型为('U','X','0','1','Z','W','L','H','-');
<<对于整数类型>>对于
整数类型用范围指定值的范围。如果不这样做,则
可能会创建32位类型,并且可能导致电路增大。 type数据类型名称是i到j的整数范围;
示例BCD数字类型数字
type digit is integer range 0 to 9; (2)子类型定义
子类型是可以
使用描述性名称重新定义的一系列现有数据类型。
为此,请使用子类型语句,其格式如下。 subtype子类型名称是数据类型名称[range | range];
std_logic_vector的子类型名定义:
subtype IOBUS is std_logic_vector(7 downto 0);
subtype DIGIT is integer range 0 to 9;
[数组类型]
数组是一种新的类型定义,它收集相同类型的数据并将其
定义为新类型。格式如下。
type数据类型名称是原始类型名称的数组范围;
可以在此范围部分中指定各种类型。如果未指定类型,则将其
视为integer 。
示例以下内容相同。
type WORD is array(1 to 8) of std_logic;
type WORD2 is array(integer 1 to 8) is std_logic;
示例std_logic_vector类型定义
在IEEE std_logic_1164中定义如下。
type std_logic_vector is array (Natural range <>) of std_logic;
多维数组>>
范围由两个或多个的组合指定以创建多维数组。
示例二维数组示例
type memarray is array (0 to 5, 7 downto 0) of std_logic;
使用上述类型
常量ROMDATA的示例ROM创建示例:
memarray:=((''0','0','0 ','0','0','0','0','0'),
('0','1','1','1','0','0','0','1'),
('0','0','0','0' ,'0','1','0','1'),
('1','1','0','0','0','1','1','0' ),
('1','1','1','1','1','1','1','1')))
(注)必须在常量语句中设置初始值然后,
使用符号“:=” 在数据类型名称后定义初始值。
constant AAA : std_logic := "0";
(注)使用上述多维数组的ROM定义时,
无法生成实际的逻辑电路。因此,上述ROM数据
用于创建用于仿真模式的数据。
<<数组重载>>在
定义类型时,定义数组的原始类型和新数组
称为数组重载。
例如,在下面的示例中,定义了
最初具有数组std_logic_vector类型的WAVE类型,并且基于该WAVE类型重载了新的阵列ROM。
在下面的示例中,此新的ROM类型定义了常量SINE。和
实际的初始值被定义为:下面=,但由于它是std_logic_vector
,64个阵列的6位长度被布置并限定。此内容是一个6位分辨率正弦波
周期的数据。
因为由过载限定的ROM可以作为逻辑电路中产生在
这种方式,有可能对许多恒定字符串与逻辑电路相结合。
示例:生成6位正弦波的sin值的二进制数组
[类型转换]
VHDL需要精确的类型匹配。因此,
无法进行不同类型之间的操作和分配。为了执行分配,必须将其转换为分配侧的类型。
有用于转换此类型的语法,并且提供了类型转换功能。
功能名称