我想要一个VHDL的RAM(可以在Xilinx上合成,Altera ..)以及以下'catch' -
我必须按顺序写它并按位读取它。
我如何实现这一目标?
答案 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;