VHDL中的单端口RAM?

VHDL中的单端口RAM?,vhdl,Vhdl,我想要一个VHDL中的RAM(可以在Xilinx、Altera….上合成),具有以下“捕获”- 我必须逐块写入,逐点读取 如何实现这一点?您应该只按块读取RAM,然后将读取的向量移出,以获得逐位的结果 例如,如果ram_do是您读取的向量,那么只需使用ram_data一次移出位1,您应该只按块读取ram,然后移出您读取的向量以获得位 例如,如果ram_do是您读取的向量,那么只需使用ram_data一次移出位1,您就可以实例化一个供应商特定的ram块,它以这种方式工作 或者,你可以用一些合成工具

我想要一个VHDL中的RAM(可以在Xilinx、Altera….上合成),具有以下“捕获”-

我必须逐块写入,逐点读取


如何实现这一点?

您应该只按块读取RAM,然后将读取的向量移出,以获得逐位的结果


例如,如果ram_do是您读取的向量,那么只需使用
ram_data一次移出位1,您应该只按块读取ram,然后移出您读取的向量以获得位


例如,如果ram_do是您读取的向量,那么只需使用
ram_data一次移出位1,您就可以实例化一个供应商特定的ram块,它以这种方式工作


或者,你可以用一些合成工具推断一个。例如,XST允许这样做(参见UG687第201页之后的代码示例,请更改示例代码!)但我不知道该方法是否可移植到Altera的Quartus。

您可以实例化一个供应商特定的ram块,该块以这种方式工作


或者,你可以用一些合成工具推断一个。例如,XST允许这样做(参见UG687第201页之后的代码示例,请更改示例代码!)但我不知道该方法是否可移植到Altera的Quartus。

您应该阅读(Altera Quartus手册)中的混合宽度双端口RAM一节。我不确定这段代码的可移植性,但下面的示例说明了如何在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;
ieee库;
使用ieee.std_logic_1164.all;
包ram_类型为
类型字是标准逻辑向量(7到0)的数组(0到3);
类型ram_t是单词的数组(0到255);
端部闸板类型;
图书馆ieee;
使用ieee.std_logic_1164.all;
图书馆工作;
使用work.ram_types.all;
实体混合\u宽度\u ram为
港口(
我们,clk:标准逻辑;
waddr:在0到255的整数范围内;
wdata:word\t;
rdata:在0到1023的整数范围内;
q:输出标准向量(7到0);
端部混合_宽度_闸板;
混合_-width_-ram的体系结构rtl是
信号ram:ram\u t;
开始——rtl
过程(clk,we)
开始
如果(上升沿(clk)),则
如果(we='1'),那么

ram(waddr)您应该阅读(Altera Quartus手册)中的混合宽度双端口ram一节。我不确定这段代码的可移植性,但下面的示例说明了如何在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;
ieee库;
使用ieee.std_logic_1164.all;
包ram_类型为
类型字是标准逻辑向量(7到0)的数组(0到3);
类型ram_t是单词的数组(0到255);
端部闸板类型;
图书馆ieee;
使用ieee.std_logic_1164.all;
图书馆工作;
使用work.ram_types.all;
实体混合\u宽度\u ram为
港口(
我们,clk:标准逻辑;
waddr:在0到255的整数范围内;
wdata:word\t;
rdata:在0到1023的整数范围内;
q:输出标准向量(7到0);
端部混合_宽度_闸板;
混合_-width_-ram的体系结构rtl是
信号ram:ram\u t;
开始——rtl
过程(clk,we)
开始
如果(上升沿(clk)),则
如果(we='1'),那么

ram(waddr)谢谢-我不熟悉1'b0语法或表达式。那是什么意思?对不起。我修正了答案。1'b0是一种verilog文字,这是我一直使用的语言。我觉得奇怪的是,这个答案被接受了,因为最初的问题是一个混合宽度的RAM,而这里描述的解决方案假设各个位是按顺序访问的。谢谢-我不熟悉1'b0语法或表达式。那是什么意思?对不起。我修正了答案。1'b0是一种verilog文本,这是我一直使用的语言。我觉得奇怪的是,这个答案被接受了,因为最初的问题是一个混合宽度的RAM,而这里描述的解决方案假设各个位是按顺序访问的。