VHDL中的单端口RAM?

时间:2011-05-05 02:58:58

标签: vhdl

我想要一个VHDL的RAM(可以在Xilinx上合成,Altera ..)以及以下'catch' -

我必须按顺序写它并按位读取它。

我如何实现这一目标?

3 个答案:

答案 0 :(得分:1)

你应该只是从RAM块中读取,然后移出你读出的向量以使其按位进行。

例如,如果ram_do是您读出的向量,那么只需使用ram_data <= '0' & ram_data(9 downto 1)一次移出位1,其中ram_data(0)是每个时钟周期可以采用的位值。

您将获得的硬件是RAM和移位寄存器。

答案 1 :(得分:0)

您可以实例化以这种方式工作的特定于供应商的ram块。

或者,您可以使用一些综合工具推断出一个。例如,XST允许这样做(请参阅UG687的第201页以获取代码示例,请更改示例代码to use numeric_std.all!)我不知道这种方法是否可以移植到Altera的Quartus中。

答案 2 :(得分:0)

您应该阅读Recommended HDL Coding Style中的混合宽度双端口RAM部分(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;