意向:
我在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; )
答案 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上的向量包。