给定数组类型:
type enc is array (integer 0 to 1) of std_logic_vector(3 downto 0);
是否可以访问数组子类型的属性(std_logic_vector)?
我原以为这样的事情是可能的:
enc(0)'range
- > 3 downto 0(取元素编号0的范围)
这是我的模拟器中的一个错误。
查看LRM(14.1),数组元素有一个范围属性:
A'RANGE [(N)]
此属性似乎只能返回数组维度的范围,即“0到10”,而不是子类型。
一种解决方案可以是制作该类型的常量:
constant tmp : enc :=(
0 => "0000",
1 => "0001"
)
取这个常数的范围:
tmp(0)'range
这是有效的,但是我认为应该可以单独使用该类型,因为它是完全受约束的。
答案 0 :(得分:6)
您的问题是您尝试在类型上使用属性。但是,范围仅为数组定义(因此原型中为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
您必须检查模拟器和综合工具是否支持VHDL 2008属性'元素和无约束数组元素类型。
我相信,Xilinx ISE不支持VHDL-2008,而且最近才开始在10.1a开始使用。据说Alterra在他们的Quartus Suite中对VHDL-2008有很好的支持,尽管我最近没有使用它。
答案 1 :(得分:0)
在使用VHDL-2002时,可以以不同的方式避免信号/常数。
第一个建议,也是最直接的,是分割enc
的声明
在两个中,因此enc
数组的元素是单独声明的
属性可以用于类型。
subtype enc_ele_t is std_logic_vector(3 downto 0);
type enc_t is array (integer range 0 to 1) of enc_ele_t;
subtype enc_ele_dup_t is std_logic_vector(enc_ele_t'range);
begin
report "enc_ele_t'left.: " & integer'image(enc_ele_t'left);
report "enc_ele_t'right: " & integer'image(enc_ele_t'right);
report "enc_ele_dup_t'left.: " & integer'image(enc_ele_dup_t'left);
report "enc_ele_dup_t'right: " & integer'image(enc_ele_dup_t'right);
替代方案,对于不希望或不可能拆分的情况
声明enc
,然后是std_logic_vector
对象,具有相同的属性
作为enc
的元素,可以通过函数创建,属性可以
直接应用于函数的结果:
type enc is array (integer range 0 to 1) of std_logic_vector(3 downto 0);
function enc_ele return std_logic_vector is
variable enc_v : enc;
begin
return enc_v(enc'left);
end function;
subtype enc_ele_dup is std_logic_vector(enc_ele'range);
begin
report "enc_ele'left.: " & integer'image(enc_ele'left);
report "enc_ele'right: " & integer'image(enc_ele'right);
report "enc_ele_dup'left.: " & integer'image(enc_ele_dup'left);
report "enc_ele_dup'right: " & integer'image(enc_ele_dup'right);
模拟或综合工具将解析函数的表达式 在编译时,所以最终的模拟或电路相当于使用 常数。