Ignore:
Timestamp:
Feb 25, 2011, 5:49:51 PM (14 years ago)
Author:
demin
Message:

add 4th stage

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sandbox/MultiChannelUSB/deconv.v

    r129 r130  
    88        (
    99                input   wire                                            clock, frame, reset,
    10                 input   wire    [3*size*6-1:0]          del_data,
    11                 input   wire    [3*size*6-1:0]          amp_data,
    12                 input   wire    [3*size*16-1:0]         tau_data,
    13                 input   wire    [3*size*width-1:0]      inp_data,
    14                 output  wire    [3*size*widthr-1:0]     out_data
     10                input   wire    [4*size*6-1:0]          del_data,
     11                input   wire    [4*size*6-1:0]          amp_data,
     12                input   wire    [4*size*16-1:0]         tau_data,
     13                input   wire    [4*size*width-1:0]      inp_data,
     14                output  wire    [4*size*widthr-1:0]     out_data
    1515        );
    1616
     
    2020
    2121        reg                                                     int_wren_reg, int_wren_next;
     22        reg                                                     int_flag_reg, int_flag_next;
    2223        reg             [1:0]                           int_chan_reg, int_chan_next;
    2324        reg             [2:0]                           int_case_reg, int_case_next;
     
    2829        wire    [7:0]                           int_addr_wire;
    2930
    30         reg             [size*widthr-1:0]       out_data_reg [2:0], out_data_next [2:0];
     31        reg             [size*widthr-1:0]       out_data_reg [4:0], out_data_next [4:0];
    3132        wire    [size*widthr-1:0]       out_data_wire;
    3233
     
    3536        wire    [size*width3-1:0]       mul_data_wire [1:0];
    3637
    37         reg             [size*width2-1:0]       acc_data_reg [3:0], acc_data_next [3:0];
     38        reg             [size*width2-1:0]       acc_data_reg [4:0], acc_data_next [4:0];
    3839        wire    [size*width2-1:0]       acc_data_wire;
    3940
    4041        wire    [size*width1-1:0]       sub_data_wire;
    4142
    42         reg             [size*width-1:0]        inp_data_reg [2:0], inp_data_next [2:0];
    43         wire    [size*width-1:0]        inp_data_wire [3:0];
     43        reg             [size*width-1:0]        inp_data_reg [3:0], inp_data_next [3:0];
     44        wire    [size*width-1:0]        inp_data_wire [4:0];
    4445
    4546        reg             [size*6-1:0]            amp_data_reg, amp_data_next;
    46         wire    [size*6-1:0]            amp_data_wire [2:0];
     47        wire    [size*6-1:0]            amp_data_wire [3:0];
    4748
    4849        reg             [size*16-1:0]           tau_data_reg, tau_data_next;
    49         wire    [size*16-1:0]           tau_data_wire [2:0];
     50        wire    [size*16-1:0]           tau_data_wire [3:0];
    5051
    5152        integer i;
     
    5556                for (j = 0; j < size; j = j + 1)
    5657                begin : INT_DATA
    57                         assign inp_data_wire[0][j*width+width-1:j*width] = inp_data[(3*j+0)*width+width-1:(3*j+0)*width];
    58                         assign inp_data_wire[1][j*width+width-1:j*width] = inp_data[(3*j+1)*width+width-1:(3*j+1)*width];
    59                         assign inp_data_wire[2][j*width+width-1:j*width] = inp_data[(3*j+2)*width+width-1:(3*j+2)*width];
    60                         assign amp_data_wire[0][j*6+6-1:j*6] = amp_data[(3*j+0)*6+6-1:(3*j+0)*6];
    61                         assign amp_data_wire[1][j*6+6-1:j*6] = amp_data[(3*j+1)*6+6-1:(3*j+1)*6];
    62                         assign amp_data_wire[2][j*6+6-1:j*6] = amp_data[(3*j+2)*6+6-1:(3*j+2)*6];
    63                         assign tau_data_wire[0][j*16+16-1:j*16] = tau_data[(3*j+0)*16+16-1:(3*j+0)*16];
    64                         assign tau_data_wire[1][j*16+16-1:j*16] = tau_data[(3*j+1)*16+16-1:(3*j+1)*16];
    65                         assign tau_data_wire[2][j*16+16-1:j*16] = tau_data[(3*j+2)*16+16-1:(3*j+2)*16];
     58                        assign inp_data_wire[0][j*width+width-1:j*width] = inp_data[(4*j+0)*width+width-1:(4*j+0)*width];
     59                        assign inp_data_wire[1][j*width+width-1:j*width] = inp_data[(4*j+1)*width+width-1:(4*j+1)*width];
     60                        assign inp_data_wire[2][j*width+width-1:j*width] = inp_data[(4*j+2)*width+width-1:(4*j+2)*width];
     61                        assign inp_data_wire[3][j*width+width-1:j*width] = inp_data[(4*j+3)*width+width-1:(4*j+3)*width];
     62                        assign amp_data_wire[0][j*6+6-1:j*6] = amp_data[(4*j+0)*6+6-1:(4*j+0)*6];
     63                        assign amp_data_wire[1][j*6+6-1:j*6] = amp_data[(4*j+1)*6+6-1:(4*j+1)*6];
     64                        assign amp_data_wire[2][j*6+6-1:j*6] = amp_data[(4*j+2)*6+6-1:(4*j+2)*6];
     65                        assign amp_data_wire[3][j*6+6-1:j*6] = amp_data[(4*j+3)*6+6-1:(4*j+3)*6];
     66                        assign tau_data_wire[0][j*16+16-1:j*16] = tau_data[(4*j+0)*16+16-1:(4*j+0)*16];
     67                        assign tau_data_wire[1][j*16+16-1:j*16] = tau_data[(4*j+1)*16+16-1:(4*j+1)*16];
     68                        assign tau_data_wire[2][j*16+16-1:j*16] = tau_data[(4*j+2)*16+16-1:(4*j+2)*16];
     69                        assign tau_data_wire[3][j*16+16-1:j*16] = tau_data[(4*j+3)*16+16-1:(4*j+3)*16];
    6670                                                                                         
    6771                        lpm_mux #(
    68                                 .lpm_size(3),
     72                                .lpm_size(4),
    6973                                .lpm_type("LPM_MUX"),
    7074                                .lpm_width(8),
     
    7276                                .sel(int_chan_next),
    7377                                .data({
    74                                         2'd2, del_data[(3*j+2)*6+6-1:(3*j+2)*6],
    75                                         2'd1, del_data[(3*j+1)*6+6-1:(3*j+1)*6],
    76                                         2'd0, del_data[(3*j+0)*6+6-1:(3*j+0)*6]}),
     78                                        2'd3, del_data[(4*j+3)*6+6-1:(4*j+3)*6],
     79                                        2'd2, del_data[(4*j+2)*6+6-1:(4*j+2)*6],
     80                                        2'd1, del_data[(4*j+1)*6+6-1:(4*j+1)*6],
     81                                        2'd0, del_data[(4*j+0)*6+6-1:(4*j+0)*6]}),
    7782                                .result(int_addr_wire));
    7883
     
    9499                                .lpm_width(width1)) sub_unit_1 (
    95100                                .dataa({{(width1-width){1'b0}}, inp_data_reg[0][j*width+width-1:j*width]}),
    96                                 .datab({{(width1-width){1'b0}}, inp_data_wire[3][j*width+width-1:j*width]}),
     101                                .datab({{(width1-width){1'b0}}, inp_data_wire[4][j*width+width-1:j*width]}),
    97102                                .result(sub_data_wire[j*width1+width1-1:j*width1]));
    98103
     
    111116                                .lpm_representation("SIGNED"),
    112117                                .lpm_type("LPM_MULT"),
    113                                 .lpm_pipeline(3),
     118                                .lpm_pipeline(4),
    114119                                .lpm_widtha(width1),
    115120                                .lpm_widthb(17),
     
    125130                                .lpm_representation("UNSIGNED"),
    126131                                .lpm_type("LPM_MULT"),
    127                                 .lpm_pipeline(3),
     132                                .lpm_pipeline(4),
    128133                                .lpm_widtha(width2),
    129134                                .lpm_widthb(6),
     
    185190                .address_b({int_addr_wire[7:6], del_addr_wire}),
    186191                .data_a(inp_data_reg[0]),
    187                 .q_b(inp_data_wire[3]),
     192                .q_b(inp_data_wire[4]),
    188193                .aclr0(1'b0),
    189194                .aclr1(1'b0),
     
    209214        begin
    210215                        int_wren_reg <= 1'b1;
     216                        int_flag_reg <= 1'b0;
    211217                        int_chan_reg <= 2'd0;
    212218                        int_case_reg <= 3'd0;
     
    215221                        amp_data_reg <= 6'd0;
    216222                        tau_data_reg <= 16'd0;
    217                         for(i = 0; i <= 2; i = i + 1)
     223                        for(i = 0; i <= 3; i = i + 1)
    218224                        begin
    219225                                inp_data_reg[i] <= {(size*width){1'b0}};
     226                        end
     227                        for(i = 0; i <= 4; i = i + 1)
     228                        begin
     229                                acc_data_reg[i] <= {(size*width2){1'b0}};
    220230                                out_data_reg[i] <= {(size*widthr){1'b0}};
    221                         end
    222                         for(i = 0; i <= 3; i = i + 1)
    223                         begin
    224                                 acc_data_reg[i] <= {(size*width2){1'b0}};
    225231                        end
    226232                end
     
    228234                begin
    229235                        int_wren_reg <= int_wren_next;
     236                        int_flag_reg <= int_flag_next;
    230237                        int_chan_reg <= int_chan_next;
    231238                        int_case_reg <= int_case_next;
     
    234241                        amp_data_reg <= amp_data_next;
    235242                        tau_data_reg <= tau_data_next;
    236                         for(i = 0; i <= 2; i = i + 1)
     243                        for(i = 0; i <= 3; i = i + 1)
    237244                        begin
    238245                                inp_data_reg[i] <= inp_data_next[i];
     246                        end                 
     247                        for(i = 0; i <= 4; i = i + 1)
     248                        begin
     249                                acc_data_reg[i] <= acc_data_next[i];
    239250                                out_data_reg[i] <= out_data_next[i];
    240                         end                 
    241                         for(i = 0; i <= 3; i = i + 1)
    242                         begin
    243                                 acc_data_reg[i] <= acc_data_next[i];
    244251                        end                 
    245252                end             
     
    249256        begin
    250257                int_wren_next = int_wren_reg;
     258                int_flag_next = int_flag_reg;
    251259                int_chan_next = int_chan_reg;
    252260                int_case_next = int_case_reg;
     
    255263                amp_data_next = amp_data_reg;
    256264                tau_data_next = tau_data_reg;
    257                 for(i = 0; i <= 2; i = i + 1)
     265                for(i = 0; i <= 3; i = i + 1)
    258266                begin
    259267                        inp_data_next[i] = inp_data_reg[i];
    260                         out_data_next[i] = out_data_reg[i];
    261268                end                 
    262                 for(i = 0; i <= 3; i = i + 1)
     269                for(i = 0; i <= 4; i = i + 1)
    263270                begin
    264271                        acc_data_next[i] = acc_data_reg[i];
     272                        out_data_next[i] = out_data_reg[i];
    265273                end                 
    266274
     
    274282                                amp_data_next = 6'd0;
    275283                                tau_data_next = 16'd0;
    276                                 for(i = 0; i <= 2; i = i + 1)
     284                                for(i = 0; i <= 3; i = i + 1)
    277285                                begin
    278286                                        inp_data_next[i] = {(size*width){1'b0}};
    279                                         out_data_next[i] = {(size*widthr){1'b0}};
    280287                                end                 
    281                                 for(i = 0; i <= 3; i = i + 1)
     288                                for(i = 0; i <= 4; i = i + 1)
    282289                                begin
    283290                                        acc_data_next[i] = {(size*width2){1'b0}};
     291                                        out_data_next[i] = {(size*widthr){1'b0}};
    284292                                end                 
    285293
     
    293301                                begin
    294302                                        int_wren_next = 1'b0;
     303                                        int_flag_next = 1'b0;
    295304                                        int_chan_next = 2'd0;
    296305                                        int_case_next = 3'd2;
     
    299308                        2: // frame
    300309                        begin
     310                                int_flag_next = 1'b0;
     311                                int_wren_next = frame;
    301312                                if (frame)
    302313                                begin
    303                                         int_wren_next = 1'b1;
    304 
    305314                                        int_addr_next[7:6] = 2'd0;
    306315                                       
     
    308317                                        int_chan_next = 2'd1;
    309318
    310                                         // register input data for 2nd and 3rd sums
     319                                        // register input data for 2nd, 3rd and 4th sums
    311320                                        inp_data_next[1] = inp_data_wire[1];
    312321                                        inp_data_next[2] = inp_data_wire[2];
     322                                        inp_data_next[3] = inp_data_wire[3];
    313323
    314324                                        // prepare registers for 1st sum                                       
     
    321331                                        int_case_next = 3'd3;
    322332                                end
    323 
     333                                if (int_flag_reg) // register 4th sum
     334                                begin
     335                                        int_addr_next[5:0] = del_addr_reg;
     336                                        // register 4th sum
     337                                        acc_data_next[4] = acc_data_wire;
     338                                        out_data_next[3] = out_data_wire;
     339                                end
    324340                        end
    325341                        3:  // 1st sum
     
    346362                        begin
    347363                                int_addr_next[7:6] = 2'd2;
     364
     365                                // set read addr for 4th pipeline
     366                                int_chan_next = 2'd3;
    348367
    349368                                // prepare registers for 3rd sum       
     
    364383                        5:  // 3rd sum
    365384                        begin                           
    366                                 int_wren_next = 1'b0;
    367 
     385                                int_flag_next = 1'b1;
     386
     387                                int_addr_next[7:6] = 2'd3;
     388                                       
    368389                                // set read addr for 1st pipeline
    369390                                int_chan_next = 2'd0;
    370391
     392                                // prepare registers for 4th sum       
     393                                inp_data_next[0] = inp_data_reg[3];
     394                                acc_data_next[0] = acc_data_reg[4];
     395
     396                                tau_data_next = tau_data_wire[3];
     397                                amp_data_next = amp_data_wire[3];
     398                               
    371399                                // register 3rd sum
    372400                                acc_data_next[3] = acc_data_wire;
    373401                                out_data_next[2] = out_data_wire;
    374402                                             
    375                                 int_addr_next[5:0] = del_addr_reg;
     403                                // register 4th output
     404                                out_data_next[4] = out_data_next[3];
    376405
    377406                                int_case_next = 3'd2;
     
    384413        end
    385414
    386         assign out_data = {out_data_reg[2], out_data_reg[1], out_data_reg[0]};
     415        assign out_data = {out_data_next[4], out_data_reg[2], out_data_reg[1], out_data_reg[0]};
    387416
    388417endmodule
Note: See TracChangeset for help on using the changeset viewer.