arrays - 在 VHDL 中创建其元素宽度递增的通用数组

标签 arrays generics vhdl

是否可以创建一个元素宽度不断增加的数组。例如,假设 X 是一个包含 10 个元素的数组;

X(0) 是 std_logic_vector(3 降到 0)
X(1) 是 std_logic_vector(4 降到 0)
...
X(9) 是 std_logic_vector(12 降到 0)

最佳答案

按照您的要求,没有解决方案可以解决您的问题,但除了 Morten 的回答之外,我将尝试提供另一种解决方案。

我会用你的例子: X 是一个由 10 个元素组成的数组,每个元素的长度从 4 增加到 13。

我的解决方案将所有向量放入一个一维向量中,并通过函数简化对位的访问。以下几行尝试展示这些位是如何组织的。

--bit 84              bit 19      bit 13       bit 8       bit 4       bit 0
[X(9)(12..0)]...[X(4)(7..0)][X(3)(6..0)][X(2)(5..0)][X(1)(4..0)][X(0)(3..0)]

逐步:

  1. 创建一个 INTEGER 向量 (T_INTVEC) 或更受约束的 NATURAL 向量 (T_NATVEC)。

    type T_NATVEC is array (NATURAL range <>) of NATURAL;
    
  2. 创建此类型的实例并用数组长度填充它。

    constant MY_BITS : T_NATVEC := (
      0 => 4,
      1 => 5,
      [...]
      9 => 13
    );
    

    或者使用函数来计算:

    function generateVectorLengths return T_NATVEC is
      constant Count        : NATURAL              := 10;
      constant Startlength  : NATURAL              := 4;
      variable Result : T_NATVEC(0 to Count - 1);
    begin
      for i in 0 to Count - 1 loop
        Result(i) := StartLength + i;
      end loop;
      return Result;
    end function;
    
    constant MY_BITS : T_NATVEC := generateVectorLengths;
    
  3. 创建一些辅助函数来:

    • 对所有向量长度求和

      function isum(vec : T_NATVEC) return NATURAL is
        variable Result : NATURAL := 0;
      begin
        for i in vec'range loop
          Result := Result + vec(i);
        end loop;
        return Result;
      end function;
      
    • 获取嵌入向量的上限

      function low(VectorBits : T_POSVEC; index : NATURAL) return NATURAL is
        variable pos : NATURAL := 0;
      begin
        for i in VectorBits'low to index - 1 loop
          pos := pos + VectorBits(i);
        end loop;
        return pos;
      end function;
      
    • 获取嵌入向量的下界

      function high(VectorBits : T_POSVEC; index : NATURAL) return NATURAL is
        variable pos : NATURAL := 0;
      begin
        for i in lenvec'low to index loop
          pos := pos + VectorBits(i);
        end loop;
        return pos - 1;
      end function;
      
    • 获取整个嵌入向量

      function getSubvector(vector : STD_LOGIC_VECTOR; VectorBits : T_POSVEC; index : NATURAL) return STD_LOGIC_VECTOR is
      begin
        return vector(high(VectorBit, index) downto low(VectorBit, index));
      end function;
      
    • 将子向量分配给大向量

       procedure assignSubVector(signal slm : out T_SLM; slv : STD_LOGIC_VECTOR; constant VectorBits : T_POSVEC; constant index : NATURAL) is
       begin
          for i in slv'range loop
            slm(high(VectorBit, index) downto low(VectorBit, index)) <= slv;
          end loop;
       end procedure;
      
  4. 现在您可以使用此函数创建一个一维向量,如下所示:

    signal Vector_1 : STD_LOGIC_VECTOR(isum(MY_BITS) - 1 downto 0)  := (others => 'Z');
    -- initialize this vector with 'Z'; this is needed for simulation!
    
  5. 您可以将此向量与 high 和 low 函数或 forlast 辅助函数一起使用(请参阅函数 getSubvector)。

    signal Vector_X3 : STD_LOGIC_VECTOR(MY_BITS(3) - 1 downto 0);
    ...
    Vector_X3 <= getSubvector(My_Vector, MY_BITS, 3);
    
  6. 最后,您可以使用 assignSubVector 将向量分配给大向量:

    signal Vector_X4 : STD_LOGIC_VECTOR(MY_BITS(4) - 1 downto 0);
    ...
    assignSubvector(My_Vector, Vector_X4, MY_BITS, 4);
    

如果您发现向量和矩阵的这些位移动和扭曲函数很有趣,这里是 complete file :)。

关于arrays - 在 VHDL 中创建其元素宽度递增的通用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27960367/

相关文章:

c - 一种比较 C 中未排序数组值的优雅方法?

arrays - 如何检查任何子数组是否不包含其他子数组中的项目? ruby

java - 返回从类型扩展的通用列表时出现编译错误

java - 获取泛型类的泛型参数的类型名称

case - VHDL:使用是否正确无关?

VHDL if 语句 - 文本附近的语法错误

syntax - => 和 <= 之间的 VHDL 区别

python - 如何在每次 while 循环通过时创建一个新数组

java - 如何为抽象类覆盖方法创建通用返回类型

java - 像 Java 中的对象一样打印数组