Arrays 获取vhdl中数组子类型的范围属性
给定数组类型:Arrays 获取vhdl中数组子类型的范围属性,arrays,attributes,range,vhdl,Arrays,Attributes,Range,Vhdl,给定数组类型: type enc is array (integer 0 to 1) of std_logic_vector(3 downto 0); 是否可以访问数组子类型(std_逻辑_向量)的属性 我本以为这样的事情是可能的: enc(0)范围->3到0(取元素编号0的范围) 这是我的模拟器中的一个错误 查看LRM(14.1),数组元素有一个范围属性: A'RANGE [(N)] 此属性似乎只能返回数组维度的范围,即“0到10”,而不能返回子类型 一种解决方案是使该类型的常数: con
type enc is array (integer 0 to 1) of std_logic_vector(3 downto 0);
是否可以访问数组子类型(std_逻辑_向量)的属性
我本以为这样的事情是可能的:
enc(0)范围
->3到0(取元素编号0的范围)
这是我的模拟器中的一个错误
查看LRM(14.1),数组元素有一个范围属性:
A'RANGE [(N)]
此属性似乎只能返回数组维度的范围,即“0到10”,而不能返回子类型
一种解决方案是使该类型的常数:
constant tmp : enc :=(
0 => "0000",
1 => "0001"
)
取该常数的范围:
tmp(0)'range
这是可行的,但是我觉得应该可以单独使用类型,因为它是完全受限的。您的问题是您试图在类型上使用属性。但是,范围仅为数组定义(因此在原型中为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
这意味着您将需要使用实际数组,即使您的数组类型受到约束
-- 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
——声明
--约束数组类型
enc类型是标准逻辑向量(3到0)的数组(整数0到1);
--无约束数组类型(VHDL 2008之前版本)
enc_alt类型是标准逻辑向量(3到0)的数组(整数范围);
--具有无约束元素类型的无约束数组类型(VHDL 2008)
enc2008型是标准逻辑向量的数组(整数范围);
亚型enc2008_sub为enc2008(开放型)(3至0);
信号测试0:enc;
信号测试1:enc_alt(0到1);
信号测试2:enc2008(0比1)(3比0);
--数组属性(VHDL 2002及以前版本)
test0(0)的范围——获取元素0并检查其范围
测试1(0)范围
测试2(0)范围
--数组属性(仅限VHDL 2008)
test0'element'range——获取元素类型并检查其范围
test1‘元素’范围
test2‘元素’范围
--类型属性(仅限VHDL 2008)
enc“元素”范围
enc_alt'element'范围
enc2008“元素”范围
enc2008_子“元素”范围
您必须使用模拟器和合成工具检查它们是否支持VHDL 2008属性的元素和无约束数组元素类型
Xilinx ISE不支持VHDL-2008,我相信Modelsim最近才在10.1a中启动。据说Altera在他们的Quartus套件中对VHDL-2008有很好的支持,尽管我最近没有使用过它。在以不同方式使用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\u logic\u 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);
模拟或合成工具将从函数中解析表达式
在编译时,因此最终的模拟或电路相当于使用
常数