【问题标题】:Get range attribute of array subtype in vhdl获取 vhdl 中数组子类型的范围属性
【发布时间】:2014-03-21 09:06:00
【问题描述】:

给定一个数组类型:

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

这行得通,但是我觉得应该可以单独使用该类型,因为它是完全受限的。

【问题讨论】:

    标签: arrays attributes range vhdl


    【解决方案1】:

    您的问题是您尝试在类型上使用属性。但是,范围仅针对数组定义(因此原型中为 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 属性“元素和不受约束的数组元素类型”。

    我相信赛灵思 ISE 不支持那么出色的 VHDL-2008,而且 Modelsim 最近才开始在 10.1a 中启动。据说 Alterra 在他们的 Quartus Suite 中对 VHDL-2008 有很好的支持,尽管我最近没有使用它。

    【讨论】:

      【解决方案2】:

      在使用 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);
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-19
        • 2018-08-12
        • 2020-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-13
        相关资源
        最近更新 更多