弱弱的问题 CORE GENERATOR可否生成宽度和深度由用户调整的DPRAM

[复制链接]
4079|19
 楼主| wahahaabc 发表于 2011-8-1 11:30 | 显示全部楼层 |阅读模式
比如说在一个项目中需要调用多个DPRAM(简单的DPRAM,不是真DPRAM),每个DPRAM的宽度和深度不同,例如:一个512X8bit,一个8192×16bit。使用ISE13.1的CORE GENERATOR生成DPRAM,宽度和深度都必须固定,如下:

那么,要生成一个512X8bit,一个8192×16bit的DPRAM,岂不是要生成两个,每个的宽度和深度不同???

俺要的是下面这个效果:

这样,在调用时由用户指定宽度和深度即可。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| wahahaabc 发表于 2011-8-2 09:32 | 显示全部楼层
SuperX-man 发表于 2011-8-2 09:54 | 显示全部楼层
硬件是硬件,你定了以后就不可以改动的.
如同你的电脑硬盘..不能因为你存储的内容调整大小把.

就算你下面图中这样描述,一旦综合硬件大小就定了.

想动态的话,用控制地址的方式来实现吧.但是总的大小必须是一定的
GoldSunMonkey 发表于 2011-8-2 11:11 | 显示全部楼层
嗯,他是固定的,无论你怎么选,他都是要占满他那块空间的。
AutoESL 发表于 2011-8-2 14:45 | 显示全部楼层
你可以用不core generator,用language template的方式可以实现你想要的效果
AutoESL 发表于 2011-8-2 14:46 | 显示全部楼层
CORE GENERATOR 是定制的,设置好就定死了。
aa_001 发表于 2011-8-2 16:36 | 显示全部楼层
我也很弱
 楼主| wahahaabc 发表于 2011-8-2 21:59 | 显示全部楼层
5# AutoESL
请给个例子
 楼主| wahahaabc 发表于 2011-8-2 22:00 | 显示全部楼层
在XILINX的一个参考设计中看到了,像这样:

entity dpram_w_r is
    generic (
        ADDR_WIDTH : integer := 11;
        DATA_WIDTH : integer := 8
        );
    port (
        clka  : in  std_logic;
        ena   : in  std_logic;
        wea   : in  std_logic;
        addra : in  std_logic_vector(ADDR_WIDTH-1 downto 0);
        dina  : in  std_logic_vector(DATA_WIDTH-1 downto 0);
        
        clkb  : in  std_logic;      
        enb   : in  std_logic;
        addrb : in  std_logic_vector(ADDR_WIDTH-1 downto 0);
        doutb : out std_logic_vector(DATA_WIDTH-1 downto 0)
        );
end dpram_w_r;

architecture rtl of dpram_w_r is
    type ram_type is array(2**ADDR_WIDTH-1 downto 0) of std_logic_vector(DATA_WIDTH-1 downto 0);
    signal ram : ram_type;
    attribute syn_ramstyle : string;
    attribute syn_ramstyle of ram : signal is "block_ram" ;      
   
begin
    -- dual port block ram inference
    process (clka)
    begin
        if rising_edge(clka) then
            if ena = '1' then
                if wea = '1' then
                    ram(to_integer(unsigned(addra))) <= dina;
                end if;
            end if;
        end if;
    end process;
   
    process (clkb)
    begin
        if rising_edge(clkb) then
            if enb = '1' then
                doutb <= ram(to_integer(unsigned(addrb)));
            end if;
        end if;
    end process;
end rtl;
 楼主| wahahaabc 发表于 2011-8-2 22:01 | 显示全部楼层
本帖最后由 GoldSunMonkey 于 2011-8-2 22:21 编辑

行为描述,然后关键是:
attribute syn_ramstyle : string;
    attribute syn_ramstyle of ram : signal is "block_ram" ;
GoldSunMonkey 发表于 2011-8-2 22:21 | 显示全部楼层
这个和用参考设计没有关系。如果该块RAM被占用了,不可能被别人占用。
 楼主| wahahaabc 发表于 2011-8-2 22:24 | 显示全部楼层
11# GoldSunMonkey
不理解“如果该块RAM被占用了,不可能被别人占用。”
GoldSunMonkey 发表于 2011-8-2 22:34 | 显示全部楼层
无论你占用多少,这块block RAM都被你占用了。
其他程序无法使用该RAM了。
SuperX-man 发表于 2011-8-2 22:45 | 显示全部楼层
你用FPGA EDIT看一下结构应该会明白点.
 楼主| wahahaabc 发表于 2011-8-2 22:57 | 显示全部楼层
13# GoldSunMonkey
明白了
比如对于SPARTAN-6 18Kb的block RAM,就算是俺定义的这个dpram_w_r大小为128bit,整个18Kb的block RAM都被占用,剩余空间无法被其它程序使用。

再问一下,比如俺定义的这个dpram_w_r大小为50Kbit,超过了一个18Kb的block RAM的大小,
会不会自动占用多个block RAM???
那最后的那个没有填满的block ram的剩余空间是否也无法被其它程序使用???
SuperX-man 发表于 2011-8-3 12:12 | 显示全部楼层
会自动拼接.
没填满的那个,其他程序也无法使用了.
mowo 发表于 2011-8-4 22:33 | 显示全部楼层
路过学习下
mowo 发表于 2011-8-4 22:33 | 显示全部楼层
:P版主都很热心 赞一个
AutoESL 发表于 2011-8-5 08:51 | 显示全部楼层
5# AutoESL  
请给个例子
wahahaabc 发表于 2011-8-2 21:59


例子你自己找到了.
另外, 我记得在ISE还是EDK的GUI里面的工具栏里面有language template,你可以打开,然后选择一下你想要的ram类型,就会自动生成例子
AutoESL 发表于 2011-8-5 08:54 | 显示全部楼层
另外,用户手册文档里面也有. 比如:xst_v6s6-ug.pdf
您需要登录后才可以回帖 登录 | 注册

本版积分规则

119

主题

627

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部