首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VHDL中的单端口RAM?

VHDL中的单端口RAM?
EN

Stack Overflow用户
提问于 2011-05-05 10:58:58
回答 3查看 2.5K关注 0票数 1

我想要一个VHDL的RAM (可以在Xilinx,Altera上合成)带着下面的'catch‘-

我必须按块写入,按位读取。

我该如何实现这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-05 11:01:01

你应该只从RAM块中读取,然后移出你读出的向量,以得到它的位数。

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

你将得到的硬件是一个RAM加上一个移位寄存器。

票数 1
EN

Stack Overflow用户

发布于 2011-05-05 22:28:17

你可以实例化一个特定于供应商的ram块,它是这样工作的。

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

票数 0
EN

Stack Overflow用户

发布于 2011-05-16 15:32:31

您应该阅读Recommended HDL Coding Style中的混合宽度双端口内存部分(Altera Quartus手册)。我不确定这段代码的可移植性如何,但下面的示例展示了如何在Altera设备上做到这一点:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5892155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档