lig82 发表于 2011-12-17 21:30:30

我这个程序怎么占用逻辑单元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

至芯兴洪 发表于 2011-12-23 20:27:44

程序中的for语句太多了,硬件与软件是有很大区别的,程序中还有大量的不可综合语句,还有大量的错去,例如min_x_index <= 38;很显然的错误,先理解再去做,不然写得再多也没用
页: [1]
查看完整版本: 我这个程序怎么占用逻辑单元3万多个,太多了!