打印

隔壁的问题

[复制链接]
2088|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
atua|  楼主 | 2011-3-8 16:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
RAM, ck, ip, ldpc, pc
本帖最后由 izefei 于 2011-3-8 15:30 编辑

小弟在用xilinx 的XC3S400芯片做LDPC,需要很多个小块RAM(30个字节左右)用来存储数据。而XC3S400利用IP核最多只能生成16个block RAM(与大小无关),而我又不能用Distributed RAM,因为需要的小块RAM很多,会占用很多逻辑资源。
     请教过路大侠:我怎么能把block RAM分割成很小的RAM块。谢谢啦!

相关帖子

沙发
SuperX-man| | 2011-3-8 17:34 | 只看该作者
你可以换一种想法.
1. 通过定义一个首地址来解决,数据可以放在同一个RAM中
例如:bram为8位,64字节。那么BRAM的ADDRA应该是[5:0],现在分成两段x"00"-x"1f",  x"20-2f".
分别定义两个起始地址signal ram1 : std_logic_vector(5 downto 0):=x"00";
                              signal ram2 : std_lgoic_vector(5 downto 0):=x"20";
然后定义一个或者多个指针signal ram_ad : std_logic_vector(5 downto 0):=x"00";
那么通过 ADDRA<= ram1+ram_ad 就可以实现了。
不过别忘记定义一个库use IEEE.STD_LOGIC_UNSIGNED.ALL;否则会报错。
优点:有效利用资源,节约空间。
缺点:一次只能读或写一个RAM。如果不需要多个同步的话,可以使用。

2.自定义一个类型:type ram_30 is array(29 downto 0) of std_logic_vector(7 downto 0);
然后定义你需要的signal ram1 : ram_30;
定义指针:signal ram_ad : integer range 0 to 29:=0;

读的话,例: ram_ad<=3;  data<=ram1(ram_ad_r);
写的话,例: ram_ad<=3;  ram1(ram_ad_r)<=data;  其中data为 signal data : std_logic_vector(7 downto 0);
优点:自定义的一个非常简单的RAM,如果只是作为简单数据存储的话,还是可以一用的。

小版我的方法仅供参考,有不对的也请大家指出,另期待楼下高手出现。

使用特权

评论回复
板凳
izefei| | 2011-3-8 21:50 | 只看该作者
1# atua 我是新手,万分感谢版主atua帮我把问题搬到这儿!

使用特权

评论回复
地板
izefei| | 2011-3-8 22:08 | 只看该作者
2# SuperX-man   万分感激版主SuperX-man的热情回答,版主真得很强大。      版主说到我心坎上了,我就是想创建很多个小块dual_RAM(>>16),并把这些dual_RAM分成n组,每一组的数目都>16,而且每一组的dual_RAM要能够同时访问。
      自定义简单的RAM我也试过,但是自定义的RAM占用LUT资源,由于需要的RAM数量大,所以会耗费很多LUT资源。我之所以想着分割芯片内部的Block_RAM,就是希望节省LUT资源,供其它模块使用。

使用特权

评论回复
5
SuperX-man| | 2011-3-8 23:46 | 只看该作者
这个还有很多方法来规避这个问题的.小版我提供点我的想法.
1. BRAM的clk 和你别的逻辑的CLK分开.如果你正常运行在1K.如果你有需要读16个BRAM数据,就可以用DCM生成一个16K的BRAM数据.那么对于你正常工作的CLK来说,等于同步.不过clk有器件支持上限.
2.用以下方法写自定义RAM的话,小版我自认为占用资源很少,你可以拿去试试看,不过我就写了4个只读.其它功能,你可以根据你自己实际功能加入.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity bram_test1 is
port(
     clk : in std_logic;
          ram1_ad : in std_logic_vector(5 downto 0);
          ram2_ad : in std_logic_vector(5 downto 0);
          ram3_ad : in std_logic_vector(5 downto 0);
          ram4_ad : in std_logic_vector(5 downto 0);
          ram1_out : out std_logic_vector(7 downto 0);
          ram2_out : out std_logic_vector(7 downto 0);
          ram3_out : out std_logic_vector(7 downto 0);
          ram4_out : out std_logic_vector(7 downto 0)
          );
end bram_test1;

architecture Behavioral of bram_test1 is
type ram_30 is array(5 downto 0) of std_logic_vector(7 downto 0);
signal ram1 : ram_30;
signal ram2 : ram_30;
signal ram3 : ram_30;
signal ram4 : ram_30;

signal ram1_n : integer range 0 to 31;
signal ram2_n : integer range 0 to 31;
signal ram3_n : integer range 0 to 31;
signal ram4_n : integer range 0 to 31;

begin
read_ram : process(clk) is
begin
If clk='1' and clk'event then
   ram1_n<=conv_INTEGER (ram1_ad);
   ram2_n<=conv_INTEGER (ram2_ad);
   ram3_n<=conv_INTEGER (ram3_ad);
   ram4_n<=conv_INTEGER (ram4_ad);         
   ram1_out<=ram1(ram1_n);
        ram2_out<=ram2(ram2_n);
        ram3_out<=ram3(ram3_n);
        ram4_out<=ram1(ram4_n);
end if;
end process read_ram;

end Behavioral;

使用特权

评论回复
6
foreverly| | 2011-3-10 16:06 | 只看该作者
21IC很强大,X版很强大啊,我不是拍那个啥啊,大实话啊。:P

使用特权

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

本版积分规则

个人签名:“能做”与“做好”的关系

0

主题

250

帖子

1

粉丝