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-28 22:53
 精彩回答 2  元偷偷看……
GoldSunMonkey
2楼-- · 2020-02-29 01:37
增加内存,换到64位的系统
machairodus
3楼-- · 2020-02-29 03:30
GoldSunMonkey 发表于 2013-7-30 23:47
增加内存,换到64位的系统

     但是我2g的32位xp虚拟机却能综合成功,4g(3.2g可用)的实体机却不行,这是什么情况呢?:dizzy:难道虚拟机还能用到我没有分入虚拟机的那部分内存,这不大可能啊!而且报错时说用了2xxxxxxkb内存,超过了2g,但是绝对不超过3g,3.2g的内存在原理上是可以实现的;但是不成功,说明在综合时,我的机子很有可能只有2g内存是可用的,另外1.2g被和谐掉了:L。这是我根据实际情况推测的,但是不知道造成这种情况的原因是什么!:L
     不过还是谢谢你的回答!
GoldSunMonkey
4楼-- · 2020-02-29 08:37
machairodus 发表于 2013-7-31 12:27
但是我2g的32位xp虚拟机却能综合成功,4g(3.2g可用)的实体机却不行,这是什么情况呢?难道 ...

这个我就不懂了。这个需要操作系统的兄弟帮忙啦
GoldSunMonkey
5楼-- · 2020-02-29 13:19
:lol
GoldSunMonkey
6楼-- · 2020-02-29 17:13
 精彩回答 2  元偷偷看……