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);
模拟或合成工具将从函数中解析表达式 在编译时,因此最终的模拟或电路相当于使用 常数