VHDL - std_logic_vectors 数组转换为 std_logic_vector

VHDL - array of std_logic_vectors convert into std_logic_vector

意向:

我正在从 ZedBoard 上的 RAM 读取数据,RAM 由 32 位长字组成,所以我使用以下缓冲区

type mem_word   is array (0 to 127) of std_logic_vector(31 downto 0);
signal buffer_word   : mem_word;

但是,我想在中间线性缓冲区中以线性方式处理数据

signal buffer_linear : std_logic_vector(4095 downto 0);
buffer_linear <= buffer_word; -- !!! PROBLEM

所以我可以轻松地寻址缓冲区中的任何位,而无需重新计算特定字(buffer_word)中的位置。

问题:

如何从 std_logic_vectors 的数组变成 1 长的 std_logic_vector ?有没有办法避免在一个循环中连接 128 个单词? (类似上面 buffer_linear <= buffer_word;

您需要一个函数来将矢量-矢量转换为一维矢量。

我下面的示例使用类型名称 T_SLVV_32 来表示它是向量的向量,其中内部向量是 32 位长。 (请参阅我的链接源文件,了解真正的二维 STD_LOGIC 矩阵类型 T_SLM)。所以 T_SLVV_32 等同于你的 mem_word 类型。

subtype T_SLV_32  is STD_LOGIC_VECTOR(31 downto 0);
type    T_SLVV_32 is array(NATURAL range <>) of T_SLV_32;

function to_slv(slvv : T_SLVV_32) return STD_LOGIC_VECTOR is
  variable slv : STD_LOGIC_VECTOR((slvv'length * 32) - 1 downto 0);
begin
  for i in slvv'range loop
    slv((i * 32) + 31 downto (i * 32))      := slvv(i);
  end loop;
  return slv;
end function;

用法:

buffer_linear <= to_slv(buffer_word);

此函数不创建逻辑,只创建接线。
注意:一次访问内存的所有位,防止综合工具推断 RAM 或 ROM 内存块!

来源:PoC.vectors

在 GitHub 查看我的矢量包,了解更多关于前后变换矢量和矩阵的示例。