我必须在一个相当大的缓冲区中缓冲一些数据。它不是通常的移位寄存器或FIFO,因为我必须能够从缓冲区的中间读取数据。我设法实施……
如果您想使用Block RAM,则需要考虑Block RAM只有2个端口。您无法自由查看RAM中的数据:您需要通过任一端口访问它。
此外,读取和/或写入需要一个时钟周期来处理。
因此,如果我们查看您的代码,它已经开始出现问题:
entity deriv_buffer is [...] port( [...] deriv_buf : out t_deriv_array( buf_size * NSAMPLES - 1 downto 0 )
您将整个RAM连接到输出端口!我不知道你在使用这个组件的实体中的内容做了什么,但正如我所说:你没有可以自由访问Block RAM的内容。您需要遵循适当的Block RAM设计指南。
参考 Xilinx综合用户指南 例如,适当的块RAM实例化。 (第4章HDL编码技术,RAM HDL编码技术部分)
下一个问题:重置
if rst = '1' then deriv_buf_s <= ( others => ( others => '0' ) );
无法重置RAM。如果你 真 想要清除RAM,你需要写一个 (others=>'0') 到每个单独的地址位置。因此,您需要控制逻辑来执行此操作。但现在,使用此重置代码将不允许实例化块RAM。
(others=>'0')
然后在你的代码中你有了这个部分
deriv_buf_s( (buf_size - 1) * NSAMPLES - 1 downto (buf_size - 2) * NSAMPLES ) <= deriv_s; deriv_buf_s( (buf_size - 2) * NSAMPLES - 1 downto (buf_size - 3) * NSAMPLES ) <= deriv_buf_s( (buf_size - 1) * NSAMPLES - 1 downto (buf_size - 2) * NSAMPLES ); deriv_buf_s( (buf_size - 3) * NSAMPLES - 1 downto (buf_size - 4) * NSAMPLES ) <= deriv_buf_s( (buf_size - 2) * NSAMPLES - 1 downto (buf_size - 3) * NSAMPLES ); deriv_buf_s( (buf_size - 4) * NSAMPLES - 1 downto (buf_size - 5) * NSAMPLES ) <= deriv_buf_s( (buf_size - 3) * NSAMPLES - 1 downto (buf_size - 4) * NSAMPLES );
此代码有两个大问题:
您可以实现代码以使用4个块RAM实例。但是,这些Block RAM的所有端口仍将被占用。因此,没有任何端口可以像您希望的那样随机访问RAM中的所有数据。
最后:我认为你应该重新考虑你的要求。您想要的是块RAM中不可能的。如果要使用Block RAM,则应更改算法。