VHDL - std_logic_vectors数组转换为std_logic_vector

时间:2016-04-15 10:46:23

标签: arrays vector vhdl fpga

意向:

我在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&lt; = buffer_word;

1 个答案:

答案 0 :(得分:4)

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

我的以下示例使用类型名称T_SLVV_32来表示它是向量的向量,内部向量是32位长。 (请参阅我的链接源文件,了解名为T_SLM的真正的二维STD_LOGIC矩阵类型)。因此,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上的向量包。