ise10.1综合问题:run out of memory...

2020-02-28 18:23发布

本帖最后由 machairodus 于 2013-7-30 20:03 编辑

            我设计了一个将20x20的图片放大为39x39的程序,思路是这样的,先将图片的信息存入rom中,然后随着addra的增加依次读出并放入存储器reg[23:0]datreg1[399:0]中,而后通过计算得到放大后图片的信息,并放入 存储器reg[23:0]datreg2[1520:0]中,最后随着addr的增加,依次从送给输出端口q。(会不会是存储器用的太多的原因?但是我想不到其它的算法。)
            程序综合了4、5个小时,最后还错了:This Xilinx application has run out of memory or has encountered a memory conflict.  Current memory usage is 2xxxxxx kb.  You can try increasing your system's physical or virtual memory。。。。令我费解的是,这错误是在4g内存(3.2g可用)的32位xp实验机上出现的,而在我64位win8的xp虚拟机(2g)上反而综合成功了!内存小的反而成功了,这与报错信息不符合啊!那么问题究竟出在哪儿呢?
            从综合时间来看,我知道即使不报错,这个设计也是不合格的,所以大家别笑话我了。一般这种图像缩放的情况是怎么设计的呢? 希望大家多多指点!如果大家有关于图像放大的程序(最好是基于 ise10.1, verilog的),希望能发给我,邮箱:1024049029@qq.com
           下面是部分设计程序,问题就是应该出在这部分!
//数据&地址
reg [8:0] addra;
wire [23:0] douta;
reg [23:0] datreg1[399:0];
reg [23:0] datreg2[1520:0];
reg [5:0] m,n;
reg [2:0] s,n_s;
       rom ROM        (
                        .clka(clk),
                        .addra(addra),
                        .douta(douta)
                        );//引用一个深度400,位宽24bit的rom,导入了20x20的图片信息
        parameter IDLE = 3'b001;
        parameter READ = 3'b010;
        parameter WRITE = 3'b100;
        //state machine
        always@(posedge clk)
        begin
                if(rst)
                        s<=IDLE;
                else
                        s<=n_s;
        end
        //===============
        always@(s or addra)
        begin
                n_s = IDLE;
                case(s)
                        IDLE : n_s = READ;
                        READ : if(addra==399)
                                                n_s = WRITE;
                                         else
                                                n_s = READ;
                        WRITE: n_s = WRITE;
                        default:n_s = IDLE;        
                endcase
        end
        //================
        
        always@(posedge clk)
        begin
                case(n_s)
                        IDLE : begin
                                                addra<=0;
                                                m<=0;
                                                n<=0;
                                         end
                        READ : begin
                                                datreg1[addra]<=douta;
                                                addra<=addra+1;
                                         end
                        WRITE: begin
                                                if((h_count>=h_front+h_syn+h_back)&(h_count<h_front+h_syn+h_back+39)
                                                        &(v_count>=v_front+v_syn+v_back)&(v_count<v_front+v_syn+v_back+39))
                                                        begin
                                                                m<=h_count-(h_front+h_syn+h_back);
                                                                n<=v_count-(v_front+v_syn+v_back);
                                                                addr <= n*39+m;
                                                                q<=datreg2[addr];


                                                end                        //将地址与有效区域结合,以显示图片
                                                else begin
                                                                        m<=0;
                                                                        n<=0;
                                                                        q<=0;
                                                                        addr <= 0;
                                                          end

                                           case({(m%2==0),(n%2==0)})                   //计算放大后图片的对应的信息
                                                        2'b11 : datreg2[addr]<=datreg1[(20*n+m)/2];
                                                        2'b01 : datreg2[addr]<=(datreg1[(20*n+m-1)/2]+datreg1[(20*n+m+1)/2])/2;
                                                        2'b10 : datreg2[addr]<=(datreg1[(20*n+m-20)/2]+datreg1[(20*n+m+20)/2])/2;
                                                        default:datreg2[addr]<=(datreg1[(20*n+m-21)/2]+datreg1[(20*n+m+21)/2]+datreg1[(20*n+m-19)/2]+datreg1[(20*n+m+19)/2])/4;
                                                endcase
                                         end
                        default:begin
                                                        addra<=0;
                                                        m<=0;
                                                        n<=0;
                                          end
                endcase
        end

endmodule
deal.rar (1.16 KB, 下载次数: 0) 2013-7-30 19:57 上传 点击文件名下载附件
部分程序

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
GoldSunMonkey
1楼-- · 2020-02-29 19:54
结帖啊
machairodus
2楼-- · 2020-03-01 00:09
GoldSunMonkey 发表于 2013-7-31 20:26
结帖啊

    不好意思啊,前几天出去玩了,没时间上网,现在结贴!:L
    暂时不纠结内存方面的问题了,不过猴哥你知道一般做图像缩放是怎么设计的么?给小弟点经验吧,我这种设计动不动就综合5、6个小时,太折腾人了!
GoldSunMonkey
3楼-- · 2020-03-01 05:18
machairodus 发表于 2013-8-6 12:44
不好意思啊,前几天出去玩了,没时间上网,现在结贴!
    暂时不纠结内存方面的问题了,不过猴哥 ...

我的大设计都是10几个小时。
5~6小时正常啊
machairodus
4楼-- · 2020-03-01 09:31
GoldSunMonkey 发表于 2013-8-6 14:32
我的大设计都是10几个小时。
5~6小时正常啊

    可能是以前的设计都比较小,10分钟都搞定的缘故把!
    其实我开始的设想是放大个300x300的图片的,但是综合了一天一夜也没半点结束的意思,所以换了个小的图片20x20,还是用了5、6个小时,那么弄个300x300的岂不是要综合个4、5天?就想着是不是有什么方法可以节省时间!猴哥能不能给点做图像缩放的建议呢?最好用什么方法做?
GoldSunMonkey
5楼-- · 2020-03-01 10:26
 精彩回答 2  元偷偷看……
GoldSunMonkey
6楼-- · 2020-03-01 10:31
估计讲一个月都不带重样的

一周热门 更多>