我想要一个VHDL的RAM (可以在Xilinx,Altera上合成)带着下面的'catch‘-
我必须按块写入,按位读取。
我该如何实现这一点?
发布于 2011-05-05 11:01:01
你应该只从RAM块中读取,然后移出你读出的向量,以得到它的位数。
例如,如果ram_do是您读出的向量,则只需使用ram_data <= '0' & ram_data(9 downto 1)一次移出位1,其中ram_data(0)是您可以在每个时钟周期中取的位值。
你将得到的硬件是一个RAM加上一个移位寄存器。
发布于 2011-05-05 22:28:17
你可以实例化一个特定于供应商的ram块,它是这样工作的。
或者,您可以使用一些合成工具来推断。例如,XST允许这样做(请参阅UG687的第201页以获取代码示例,只需更改示例代码to use numeric_std.all !)我不知道这个方法是否可以移植到Altera的Quartus。
发布于 2011-05-16 15:32:31
您应该阅读Recommended HDL Coding Style中的混合宽度双端口内存部分(Altera Quartus手册)。我不确定这段代码的可移植性如何,但下面的示例展示了如何在Altera设备上做到这一点:
library ieee;
use ieee.std_logic_1164.all;
package ram_types is
type word_t is array (0 to 3) of std_logic_vector(7 downto 0);
type ram_t is array (0 to 255) of word_t;
end ram_types;
library ieee;
use ieee.std_logic_1164.all;
library work;
use work.ram_types.all;
entity mixed_width_ram is
port (
we, clk : in std_logic;
waddr : in integer range 0 to 255;
wdata : in word_t;
rdata : in integer range 0 to 1023;
q : out std_llgic_vector(7 downto 0));
end mixed_width_ram;
architecture rtl of mixed_width_ram is
signal ram : ram_t;
begin -- rtl
process(clk, we)
begin
if (rising_edge(clk)) then
if(we = '1') then
ram(waddr) <= wdata;
end if;
q <= ram(raddr / 4 )(raddr mod 4);
end if;
end process;
end rtl;https://stackoverflow.com/questions/5892155
复制相似问题