我这个程序怎么占用逻辑单元3万多个,太多了!
本帖最后由 lig82 于 2011-12-17 21:52 编辑我用QuartusII编译下面这个模块,结果竟然耗用了30000多LE,太多了,而且综合时间特别长,器件资源不够啊。什么原因啊,是我用的数组太多?怎么优化呢?是编程方式不对吗? 请人解决一下。
附件为这个程序的文件。
module bpblock_rd_ctr(
reset,
rdclk,
mb_wrdone,
bpblock_rden,
bpblock_rd_addr,
bpblock_data,
mb_rden,
mb_rd_addr,
mb_data,
match_done,
x_offset,
y_offset
);
`include "edge_para.v"
input reset;
input rdclk;
input mb_wrdone;
input bpblock_data;
input mb_data;
output bpblock_rden;
output mb_rden;
output bpblock_rd_addr;
output mb_rd_addr;
output x_offset;
output y_offset;
output match_done;
wire offset_data;
genvari;
generate for(i=0; i<65; i=i+1)
begin: offsetbus
assign offset_data = bpblock_data;
end
endgenerate
`define idle 0
`define reading_a_mb 1
`define searching_min_sum 2
`define move_to_next_row 3
`define search_done 4
reg current_state;
reg next_state;
reg bpblock_rd_addr;
reg mb_rd_addr;
reg min_sum;
reg x_offset, y_offset;
reg bpblock_rden;
reg mb_rden;
reg match_done;
reg row_num;
reg mb_offset_sum;
reg xor_result;
reg hamming_step;
reg compare_step;
reg min_x_index;
always@(negedge rdclk, negedge reset)
begin
if(!reset) current_state <= `idle;
else current_state <= next_state;
end
always@(mb_wrdone, current_state, mb_rd_addr, hamming_step, compare_step, row_num)
begin
mb_rden = 0;
bpblock_rden = 0;
match_done = 0;
next_state = current_state;
case(current_state)
`idle: if(mb_wrdone) next_state = `reading_a_mb;
`reading_a_mb: begin
mb_rden = 1;
bpblock_rden = 1;
if(&mb_rd_addr && hamming_step==8) next_state = `searching_min_sum;
end
`searching_min_sum: if(&compare_step) next_state = `move_to_next_row;
`move_to_next_row: if(row_num==64) next_state = `search_done;
elsenext_state = `reading_a_mb;
`search_done: begin
match_done = 1;
next_state = `idle;
end
endcase
end
integer j;
always@(negedge rdclk)
begin
case(current_state)
`idle: begin
bpblock_rd_addr <= 0;
mb_rd_addr <= 0;
row_num <= 0;
hamming_step <= 0;
compare_step <= 0;
min_sum <= 12'hFFF;
x_offset <= 32;
y_offset <= 32;
for(j=0; j<65; j=j+1)
mb_offset_sum <= 0;
for(j=0; j<32; j=j+1)
min_x_index <= j;
end
//////////////////////////////////////////////////////////////////////////////////////////////
`reading_a_mb: begin
if(hamming_step==8) hamming_step <= 0;
else hamming_step <= hamming_step + 1;
case(hamming_step)
1: for(j=0; j<65; j=j+1)
xor_result <= offset_data^mb_data;
//////////////////////////////////////////////////////////////
2: for(j=0; j<65; j=j+1)
xor_result <= (xor_result&64'h5555_5555_5555_5555)+((xor_result>>1)&64'h5555_5555_5555_5555);
3: for(j=0; j<65; j=j+1)
xor_result <= (xor_result&64'h3333_3333_3333_3333)+((xor_result>>2)&64'h3333_3333_3333_3333);
4: for(j=0; j<65; j=j+1)
xor_result <= (xor_result&64'h0f0f_0f0f_0f0f_0f0f)+((xor_result>>4)&64'h0f0f_0f0f_0f0f_0f0f);
5: for(j=0; j<65; j=j+1)
xor_result <= (xor_result&64'h00ff_00ff_00ff_00ff)+((xor_result>>8)&64'h00ff_00ff_00ff_00ff);
6: for(j=0; j<65; j=j+1)
xor_result <= (xor_result&64'h0000_ffff_0000_ffff)+((xor_result>>16)&64'h0000_ffff_0000_ffff);
7: for(j=0; j<65; j=j+1)
xor_result <= (xor_result&64'h0000_0000_ffff_ffff)+((xor_result>>32)&64'h0000_0000_ffff_ffff);
//////////////////////////////////////////////////////////////
8: begin
for(j=0; j<65; j=j+1)
mb_offset_sum <=mb_offset_sum + xor_result;
if(!(&mb_rd_addr))begin
mb_rd_addr <= mb_rd_addr + 1;
bpblock_rd_addr <= bpblock_rd_addr + 1;
end
end
//default:
endcase
end
///////////////////////////////////////////////////////////////////////////////////////////////
`searching_min_sum: begin
compare_step <= compare_step + 1;
case(compare_step)
0: begin
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 64;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 63;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 62;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 61;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 60;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 59;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 58;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 57;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 56;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 55;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 54;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 53;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 52;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 51;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 50;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 49;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 48;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 47;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 46;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 45;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 44;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 43;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 42;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 41;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 40;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 39;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 38;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 37;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 36;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 35;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 34;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 33;
end
end
1: begin
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
end
2: begin
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
end
3: begin
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
end
4: begin
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
end
5: begin
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= min_x_index;
end
end
6: begin
if(mb_offset_sum>mb_offset_sum)begin
mb_offset_sum <= mb_offset_sum;
min_x_index <= 32;
end
end
7: begin
if(min_sum>mb_offset_sum)begin
min_sum <= mb_offset_sum;
x_offset <=min_x_index;
y_offset <= row_num;
end
end
endcase
end
`move_to_next_row: begin
mb_rd_addr <= 0;//lg, 地址归零
bpblock_rd_addr <= row_num + 1;
row_num <= row_num + 1;
for(j=0; j<65; j=j+1)
mb_offset_sum <= 0;
for(j=0; j<32; j=j+1)
min_x_index <= j;
end
endcase
end
endmodule 程序中的for语句太多了,硬件与软件是有很大区别的,程序中还有大量的不可综合语句,还有大量的错去,例如min_x_index <= 38;很显然的错误,先理解再去做,不然写得再多也没用
页:
[1]
