打印

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

[复制链接]
2705|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
比如说在一个项目中需要调用多个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 | 只看该作者
嗯,他是固定的,无论你怎么选,他都是要占满他那块空间的。

使用特权

评论回复
5
AutoESL| | 2011-8-2 14:45 | 只看该作者
你可以用不core generator,用language template的方式可以实现你想要的效果

使用特权

评论回复
6
AutoESL| | 2011-8-2 14:46 | 只看该作者
CORE GENERATOR 是定制的,设置好就定死了。

使用特权

评论回复
7
aa_001| | 2011-8-2 16:36 | 只看该作者
我也很弱

使用特权

评论回复
8
wahahaabc|  楼主 | 2011-8-2 21:59 | 只看该作者
5# AutoESL
请给个例子

使用特权

评论回复
9
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;

使用特权

评论回复
10
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" ;

使用特权

评论回复
11
GoldSunMonkey| | 2011-8-2 22:21 | 只看该作者
这个和用参考设计没有关系。如果该块RAM被占用了,不可能被别人占用。

使用特权

评论回复
12
wahahaabc|  楼主 | 2011-8-2 22:24 | 只看该作者
11# GoldSunMonkey
不理解“如果该块RAM被占用了,不可能被别人占用。”

使用特权

评论回复
13
GoldSunMonkey| | 2011-8-2 22:34 | 只看该作者
无论你占用多少,这块block RAM都被你占用了。
其他程序无法使用该RAM了。

使用特权

评论回复
14
SuperX-man| | 2011-8-2 22:45 | 只看该作者
你用FPGA EDIT看一下结构应该会明白点.

使用特权

评论回复
15
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的剩余空间是否也无法被其它程序使用???

使用特权

评论回复
16
SuperX-man| | 2011-8-3 12:12 | 只看该作者
会自动拼接.
没填满的那个,其他程序也无法使用了.

使用特权

评论回复
17
mowo| | 2011-8-4 22:33 | 只看该作者
路过学习下

使用特权

评论回复
18
mowo| | 2011-8-4 22:33 | 只看该作者
:P版主都很热心 赞一个

使用特权

评论回复
19
AutoESL| | 2011-8-5 08:51 | 只看该作者
5# AutoESL  
请给个例子
wahahaabc 发表于 2011-8-2 21:59


例子你自己找到了.
另外, 我记得在ISE还是EDK的GUI里面的工具栏里面有language template,你可以打开,然后选择一下你想要的ram类型,就会自动生成例子

使用特权

评论回复
20
AutoESL| | 2011-8-5 08:54 | 只看该作者
另外,用户手册文档里面也有. 比如:xst_v6s6-ug.pdf

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

119

主题

627

帖子

0

粉丝