Kla*_*sen 2 arrays attributes range vhdl
给定一个数组类型:
type enc is array (integer 0 to 1) of std_logic_vector(3 downto 0);
Run Code Online (Sandbox Code Playgroud)
是否可以访问数组子类型的属性(std_logic_vector)?
我本以为这样的事情是可能的:
enc(0)'range- > 3 downto 0(取元素编号0的范围)这是我模拟器中的一个错误.
查看LRM(14.1),有一个数组元素的范围属性:
A'RANGE [(N)]
Run Code Online (Sandbox Code Playgroud)
此属性似乎只能返回数组维度的范围,即"0到10",而不是子类型.
一种解决方案可以是使该类型的常量:
constant tmp : enc :=(
0 => "0000",
1 => "0001"
)
Run Code Online (Sandbox Code Playgroud)
并采取该常数的范围:
tmp(0)'range
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我认为应该可以单独使用该类型,因为它是完全约束的.
您的问题是您尝试在类型上使用属性.但是,范围仅定义为数组(因此原型中为A).
这意味着,即使数组类型受到约束,也需要使用实际数组.
-- Declarations
-- Constrained Array Type
type enc is array (integer 0 to 1) of std_logic_vector(3 downto 0);
-- Unconstrained Array Type (pre-VHDL 2008)
type enc_alt is array (integer range <>) of std_logic_vector(3 downto 0);
-- Unconstrained Array Type with Unconstrained Element Type (VHDL 2008)
type enc2008 is array (integer range <>) of std_logic_vector;
subtype enc2008_sub is enc2008(open)(3 downto 0);
signal test0 : enc;
signal test1 : enc_alt(0 to 1);
signal test2 : enc2008(0 to 1)(3 downto 0);
-- Array Attributes (VHDL 2002 and prior)
test0(0)'range -- get element 0 and check its range
test1(0)'range
test2(0)'range
-- Array Attributes (VHDL 2008 only)
test0'element'range -- get element type and check its range
test1'element'range
test2'element'range
-- Type Attributes (VHDL 2008 only)
enc'element'range
enc_alt'element'range
enc2008'element'range
enc2008_sub'element'range
Run Code Online (Sandbox Code Playgroud)
您必须与模拟器和综合工具一起检查它们是否支持VHDL 2008属性'元素和无约束数组元素类型.
Xilinx ISE不支持VHDL-2008,而且我认为它最近只在10.1a开始使用.据说Alterra在他们的Quartus Suite中对VHDL-2008有很好的支持,尽管我最近没有使用它.