【问题标题】:Slice from a matrix to a vector in VHDL2008在VHDL2008中从矩阵切片到向量
【发布时间】:2019-12-13 19:07:15
【问题描述】:

我有一个“std_logic_vector”类型的二维矩阵,我需要对其一列或一行进行切片以提取“std_logic_vector”类型的(一维)数组。 我使用 VHDL2008 标准时遇到了这个问题。我知道嵌套数组可以解决我的问题,但我很好奇是否存在使用矩阵的解决方案。

试图只给矩阵一个索引并没有给我一个数组,而是导致无法解析类型的错误。

矩阵的定义:

library IEEE;
    use IEEE.STD_LOGIC_1164.all;

package package1 is
    type MATRIX_TYPE is array (natural range <>, natural range <>) of std_logic_vector;

    type VECTOR_TYPE is array (natural range <>) of std_logic_vector;
end package1;

子组件的实体:

library IEEE;
   use IEEE.STD_LOGIC_1164.all;
library WORK;
   use WORK.PACKAGE1.ALL;

entity subcomponent is
   port (
       input_vector : in  VECTOR_TYPE;
   );
end subcomponent;

architecture arch of subcomponent is
begin
end architecture;

出现问题的顶级组件:

library IEEE;
   use IEEE.STD_LOGIC_1164.all;
library WORK;
   use WORK.PACKAGE1.ALL;

entity component1 is
end entity;

architecture arch of component1 is

   constant subcomponents : integer := 10;
   signal matrix : MATRIX_TYPE (0 to subcomponents - 1, 0 to 15) (31 downto 0);

begin

   SUBCOMPONENT_ARRAY : for i in 0 to subcomponents - 1 generate
       subcomponent_i : entity work.subcomponent(arch)
       port map (
           input_vector => matrix(i) --matrix(i) does not work!
       );
   end generate;

end architecture;

【问题讨论】:

  • --matrix(i) does not work! 不是一个特别具有描述性的错误声明,缺少 minimal reproducible example 无法复制。明显的错误是索引名称矩阵 (i) 的维数与 MATRIX 类型的维数不匹配(0 到子组件 - 1、0 到 15)。请注意,不完整类型 VECTOR_TYPE 的子类型指示缺失,它是实体子组件中 input_vector 的端口声明中的元素子类型。
  • @user1155120 感谢您完成我的示例。丢失的部分是微不足道的,但不可否认的是仍然丢失。如果您允许,我会将缺失的部分复制到我的问题中,以使示例正常工作。
  • 这两个答案都没有显示如何将解决方案应用于您尚不清楚的问题。清除“...切片一列或一行”的意思。那么这是否足以让未来的读者使用您的问题和已接受的答案作为搜索资源来理解您的问题,然后将您接受的解决方案应用于他们自己的问题?这个想法是问题,他们接受的答案是搜索资源。就目前而言,如何将已接受的答案应用于不清楚的问题。

标签: matrix multidimensional-array vhdl slice


【解决方案1】:

不幸的是,您不能在 VHDL 中对 2+ D 数组进行切片。因此,您要么必须坚持使用嵌套的一维数组以便于切片,要么创建切片函数来做您想做的事情。

function slice_row(m : MATRIX_TYPE; row : integer) return VECTOR_TYPE is
  variable r : VECTOR_TYPE(m'range(2))(m'element'range);
begin
  for i in r'range loop
    r(i) := m(row, i);
  end loop;

  return r;
end function;

【讨论】:

  • 谢谢。尽管我选择了其他解决方案,但我认为您的解决方案具有更通用的方法。
【解决方案2】:

我认为这样的事情可能会奏效:

SUBCOMPONENT_ARRAY : for i in 0 to subcomponents - 1 generate
   block_label : block
      signal temp_vector : VECTOR_TYPE(0 to 15) (31 downto 0);
   begin
      SUBVECTOR_ARRAY : for j in 0 to 15 generate
         temp_vector(j) <=  matrix(i,j);
      end generate;

      subcomponent_i : entity work.subcomponent(arch)
         port map (
            input_vector => temp_vector
         );
   end block block_label;
end generate;

你一个一个地提取矩阵元素并将它们分配给一个时间向量,然后将时间向量传递给子组件。

【讨论】:

  • 这里是一个问题为什么应该包含minimal reproducible example的例子。
  • 此解决方案有效。每次需要这种切片时,此解决方案都会生成额外的代码。我选择了这个解决方案,因为这个问题在我的项目中只发生过一次。
猜你喜欢
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 2014-07-06
相关资源
最近更新 更多