在vhdl中获取数组子类型的范围属性

时间:2014-02-20 12:14:55

标签: arrays attributes range vhdl

给定数组类型:

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

这是有效的,但是我认为应该可以单独使用该类型,因为它是完全受约束的。

2 个答案:

答案 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);

模拟或综合工具将解析函数的表达式 在编译时,所以最终的模拟或电路相当于使用 常数。