Arrays VHDL-标准逻辑向量数组转换为标准逻辑向量

Arrays VHDL-标准逻辑向量数组转换为标准逻辑向量,arrays,vector,vhdl,fpga,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 <

意图:

我在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
信号缓冲区线性:标准逻辑向量(4095向下至0);

buffer_linear您需要一个函数来将向量转换为一维向量

下面的示例使用类型名
T_SLVV_32
表示它是一个向量向量,而内部向量是32位长的。(有关名为
T\u 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;
子类型T_SLV_32是标准逻辑向量(31到0);
T_SLVV_32型是T_SLV_32的阵列(自然范围);
返回标准逻辑向量的函数是
变量slv:STD_逻辑_向量((slvv'长度*32)-1到0);
开始
对于slvv范围循环中的i
slv((i*32)+31向下至(i*32)):=slvv(i);
端环;
返回slv;
末端功能;
用法:

buffer_linear <= to_slv(buffer_word);

buffer\u linear在什么条件下可以使用RAM块?“一次访问的位有限制吗?”MartinG你最好的选择是查看你的合成工具内存推理模式。例如,在此第95页及以后,条件可能包括读和写过程都是同步的,即时钟过程,因为块RAM是同步RAM,并且同时读取一些上限(32或64)位。