在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3348|回复: 6

[求助] 占资源过大是由于扇出太大造成的吗?

[复制链接]
发表于 2012-6-18 18:57:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
大家好。为了提高RAM读取速度,用21个小RAM组成了一个大RAM,可以在一个周期内读取不同小RAM来实现读取多个数据。读端口有8个,写端口有两个。控制方法为每个小RAM单独判断这些读写信号是否有效,是否与本RAM相关。若读写是自己,该读的时候读,该写的时候写,读写同时时先缓冲写数据,读完毕后写入。因为都是独立判断读写,所以每一个小RAM都用到了这些读写信号,而且在内部判断是否与自己相关时也会用到。综合完毕后,这个模块占的资源很大,是不是就是因为读写信号扇出太大造成的吗?如果把这些读写信号分别保存到七组寄存器中,会不会解决这个问题呢?
reg [4:0] address_a1;
reg [16:0] data_a1;
reg wren_a1;
wire [16:0] q_a1;
reg [4:0] address_b1;
reg [16:0] data_b1;
reg wren_b1;
wire [16:0] q_b1;

Line line1(
        clk,
        reset_n,
        address_a1,
        address_b1,
        data_a1,
        data_b1,
        wren_a1,
        wren_b1,
        q_a1,
        q_b1);

reg [4:0] addr_a1;
reg [16:0] unsave_a1;
reg  ij_a1;

reg [4:0] addr_b1;
reg [16:0] unsave_b1;
reg  ij_b1;

wire read_line1_1,read_line1_2;
assign read_line1_1=read_en_1&&(address1_a1[9:5]==0||address1_d1[9:5]==0);
assign read_line1_2=read_en_1&&(address2_a1[9:5]==0||address2_d1[9:5]==0);

always @(posedge clk or negedge reset_n)
        if(!reset_n)
                begin
                        ij_a1<=0;
                        addr_a1<=0;
                        unsave_a1<=0;
                       
                        address_a1<=0;
                        data_a1<=0;
                        wren_a1<=0;

                        ij_b1<=0;
                        addr_b1<=0;
                        unsave_b1<=0;
                       
                        address_b1<=0;
                        data_b1<=0;
                        wren_b1<=0;
                end
        else if(read_line1_1 || read_line1_2 || (iwrite_en_a && iaddress_a[9:5]==0) || (iwrite_en_b && iaddress_b[9:5]==0))
                begin
                        case({read_line1_1|read_line1_2,(iwrite_en_a && iaddress_a[9:5]==0) || (iwrite_en_b && iaddress_b[9:5]==0)})
                        2'b01:
                                begin
                                        if(iwrite_en_a && iaddress_a[9:5]==0)
                                                begin
                                                        address_a1<=iaddress_a[4:0];
                                                        data_a1<=idata_a;
                                                        wren_a1<=1;
                                                end
                                        if(iwrite_en_b && iaddress_b[9:5]==0)
                                                begin
                                                        address_b1<=iaddress_b[4:0];
                                                        data_b1<=idata_b;
                                                        wren_b1<=1;
                                                end
                                end
                        2'b10:
                                begin
                                        if(address1_a1[9:5]==0)
                                                begin
                                                        address_a1<=address1_a1[4:0];
                                                        wren_a1<=0;
                                                        address_b1<=address1_b1[4:0];
                                                        wren_b1<=0;
                                                end
                                        else if(address1_d1[9:5]==0)
                                                begin
                                                        address_a1<=address1_c1[4:0];
                                                        wren_a1<=0;
                                                        address_b1<=address1_d1[4:0];
                                                        wren_b1<=0;
                                                end
                                        else if(address2_a1[9:5]==0)
                                                begin
                                                        address_a1<=address2_a1[4:0];
                                                        wren_a1<=0;
                                                        address_b1<=address2_b1[4:0];
                                                        wren_b1<=0;
                                                end
                                        else if(address2_d1[9:5]==0)
                                                begin
                                                        address_a1<=address2_c1[4:0];
                                                        wren_a1<=0;
                                                        address_b1<=address2_d1[4:0];
                                                        wren_b1<=0;
                                                end
                                end
                        2'b11:
                                begin
                                        if(address1_a1[9:5]==0)
                                                begin
                                                        address_a1<=address1_a1[4:0];
                                                        wren_a1<=0;
                                                        address_b1<=address1_b1[4:0];
                                                        wren_b1<=0;
                                                end
                                        else if(address1_d1[9:5]==0)
                                                begin
                                                        address_a1<=address1_c1[4:0];
                                                        wren_a1<=0;
                                                        address_b1<=address1_d1[4:0];
                                                        wren_b1<=0;
                                                end
                                        else if(address2_a1[9:5]==0)
                                                begin
                                                        address_a1<=address2_a1[4:0];
                                                        wren_a1<=0;
                                                        address_b1<=address2_b1[4:0];
                                                        wren_b1<=0;
                                                end
                                        else if(address2_d1[9:5]==0)
                                                begin
                                                        address_a1<=address2_c1[4:0];
                                                        wren_a1<=0;
                                                        address_b1<=address2_d1[4:0];
                                                        wren_b1<=0;
                                                end
                                        if(iwrite_en_a && iaddress_a[9:5]==0)
                                        begin
                                                addr_a1<=iaddress_a[4:0];
                                                unsave_a1<=idata_a;
                                                ij_a1<=ij_a1+1;
                                        end
                                        if(iwrite_en_b && iaddress_b[9:5]==0)
                                        begin
                                                addr_b1<=iaddress_b[4:0];
                                                unsave_b1<=idata_b;
                                                ij_b1<=ij_a1+1;
                                        end
                                end
                        default:;
                        endcase
                end
        else
                begin
                                if(ij_a1>0)
                                        begin
                                                address_a1<=addr_a1;
                                                data_a1<=unsave_a1;
                                                wren_a1<=1;
                                                ij_a1<=ij_a1-1;
                                        end
                                else
                                        begin
                                                address_a1<=0;
                                                data_a1<=0;
                                                wren_a1<=0;
                                        end
                                if(ij_b1>0)
                                        begin
                                                address_b1<=addr_b1;
                                                data_b1<=unsave_b1;
                                                wren_b1<=1;
                                                ij_b1<=ij_b1-1;
                                        end
                                else
                                        begin
                                                address_b1<=0;
                                                data_b1<=0;
                                                wren_b1<=0;
                                        end
                end

每一个RAM的控制都类似,只是判断地址的前半部分的时候不一样。功能上没有问题,但综合时占的资源太多了。我也想不到为什么会占那么多,有什么好的方法来优化呢?谢谢各位了。
发表于 2012-6-18 22:56:36 | 显示全部楼层
如果是FPGA,使用IP时增加pipeline级数,应该就能跑在比较高的速度上
发表于 2012-6-19 09:32:27 | 显示全部楼层
你用的板卡有多少资源?资源占用很多是指什么资源?RAM?SLICE?小RAM你用的IP是怎么设置的?是分布式RAM还是BRAM?综合报告里最大扇出是多少?
发表于 2012-6-19 11:40:25 | 显示全部楼层
不知你说的是ram资源占用很大,还是你这个ram控制器资源占用多。。。
发表于 2012-6-20 10:16:25 | 显示全部楼层
占用资源大应该是控制逻辑比较大,而扇出大会影响到电路的工作速度,所以有时候会复制逻辑以减小扇出,也就是以面积换速度。
当然你这个做法也是以面积换速度的一个方法。
 楼主| 发表于 2012-6-20 18:31:13 | 显示全部楼层
谢谢各位。占的LE很多,大概5000多。我现在用了21个中间寄存器,寄存读写信号,这组中间寄存器和小的RAM一一对应。现在占2600多LE。小的RAM类型是自动,应该是BRAM吧。
发表于 2012-6-21 12:17:24 | 显示全部楼层
小RAM要看怎么设的,很可能不是BRAM。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-22 22:06 , Processed in 0.045864 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表