本帖最后由 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)
|