Ignore:
Timestamp:
Jun 27, 2011, 12:59:27 AM (14 years ago)
Author:
demin
Message:

new filter configuration for larger sensors

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sandbox/MultiChannelUSB/filter.v

    r131 r156  
    1010        );
    1111       
    12         localparam      widthr  =       width + 13;
    13 
     12        localparam      widthr  =       width + 7;
    1413        /*
    15         4-bit LFSR with additional bits to keep track of previous values
     14        5-bit LFSR with additional bits to keep track of previous values
    1615        */
    17         reg             [15:0]                          int_lfsr_reg, int_lfsr_next;
     16        reg             [23:0]                          int_lfsr_reg, int_lfsr_next;
    1817
    1918        reg                                                     int_wren_reg, int_wren_next;
    20         reg             [1:0]                           int_chan_reg, int_chan_next;
    21         reg             [2:0]                           int_case_reg, int_case_next;
    22         reg             [7:0]                           int_addr_reg, int_addr_next;
    23 
    24         wire    [9:0]                           int_addr_wire;
    25 
    26         reg             [size*widthr-1:0]       acc_data_reg [3:0], acc_data_next [3:0];
    27         reg             [size*widthr-1:0]       int_data_reg [8:0], int_data_next [8:0];
    28 
    29         wire    [size*widthr-1:0]       acc_data_wire [3:0], del_data_wire [1:0];
     19        reg                                                     int_flag_reg, int_flag_next;
     20        reg                                                     int_chan_reg, int_chan_next;
     21        reg             [1:0]                           int_case_reg, int_case_next;
     22        reg             [5:0]                           int_addr_reg, int_addr_next;
     23
     24        wire    [5:0]                           int_addr_wire;
     25
     26        reg             [size*widthr-1:0]       acc_data_reg [1:0], acc_data_next [1:0];
     27        reg             [size*widthr-1:0]       int_data_reg [2:0], int_data_next [2:0];
     28
     29        wire    [size*widthr-1:0]       acc_data_wire [1:0], del_data_wire;
    3030
    3131        integer i;
     
    3737                        assign acc_data_wire[0][j*widthr+widthr-1:j*widthr] = {{(widthr-width){1'b0}}, inp_data[j*width+width-1:j*width]};
    3838
    39                         // -2*del_data_1 + del_data_2 + inp_data + result
    40 
    4139                        assign acc_data_wire[1][j*widthr+widthr-1:j*widthr] =
    4240                                  acc_data_reg[0][j*widthr+widthr-1:j*widthr]
    43                                 + del_data_wire[1][j*widthr+widthr-1:j*widthr]
    44                                 - {del_data_wire[0][j*widthr+widthr-1],del_data_wire[0][j*widthr+widthr-3:j*widthr], 1'b0};
    45 
    46                         assign acc_data_wire[2][j*widthr+widthr-1:j*widthr] =
    47                                   acc_data_reg[1][j*widthr+widthr-1:j*widthr]
    48                                 + acc_data_reg[2][j*widthr+widthr-1:j*widthr];
    49 
    50                         assign acc_data_wire[3][j*widthr+widthr-1:j*widthr] =
    51                                   acc_data_reg[2][j*widthr+widthr-1:j*widthr]
    52                                 + acc_data_reg[3][j*widthr+widthr-1:j*widthr];
     41                                - del_data_wire[j*widthr+widthr-1:j*widthr]
     42                                + acc_data_reg[1][j*widthr+widthr-1:j*widthr];
    5343
    5444                end
    5545        endgenerate
    5646
    57         cic_pipeline #(
    58                 .width(size*widthr)) cic_pipeline_unit (
    59                 .clock(clock),
    60                 .data(acc_data_reg[0]),
    61                 .rdaddress_a({int_addr_wire[9:8], int_addr_wire[3:0]}),
    62                 .rdaddress_b({int_addr_wire[9:8], int_addr_wire[7:4]}),
    63                 .wraddress(int_addr_reg),
    64                 .wren(int_wren_reg),
    65                 .qa(del_data_wire[0]),
    66                 .qb(del_data_wire[1]));
     47        altsyncram #(
     48                .address_aclr_b("NONE"),
     49                .address_reg_b("CLOCK0"),
     50                .clock_enable_input_a("BYPASS"),
     51                .clock_enable_input_b("BYPASS"),
     52                .clock_enable_output_b("BYPASS"),
     53                .intended_device_family("Cyclone III"),
     54                .lpm_type("altsyncram"),
     55                .numwords_a(64),
     56                .numwords_b(64),
     57                .operation_mode("DUAL_PORT"),
     58                .outdata_aclr_b("NONE"),
     59                .outdata_reg_b("CLOCK0"),
     60                .power_up_uninitialized("FALSE"),
     61                .read_during_write_mode_mixed_ports("DONT_CARE"),
     62                .widthad_a(6),
     63                .widthad_b(6),
     64                .width_a(size*widthr),
     65                .width_b(size*widthr),
     66                .width_byteena_a(1)) ram_unit_1 (
     67                .wren_a(int_wren_reg),
     68                .clock0(clock),
     69                .address_a(int_addr_reg),
     70                .address_b(int_addr_wire),
     71                .data_a(acc_data_reg[0]),
     72                .q_b(del_data_wire),
     73                .aclr0(1'b0),
     74                .aclr1(1'b0),
     75                .addressstall_a(1'b0),
     76                .addressstall_b(1'b0),
     77                .byteena_a(1'b1),
     78                .byteena_b(1'b1),
     79                .clock1(1'b1),
     80                .clocken0(1'b1),
     81                .clocken1(1'b1),
     82                .clocken2(1'b1),
     83                .clocken3(1'b1),
     84                .data_b({(size*widthr){1'b1}}),
     85                .eccstatus(),
     86                .q_a(),
     87                .rden_a(1'b1),
     88                .rden_b(1'b1),
     89                .wren_b(1'b0));
    6790
    6891        lpm_mux #(
    69                 .lpm_size(3),
     92                .lpm_size(2),
    7093                .lpm_type("LPM_MUX"),
    71                 .lpm_width(10),
    72                 .lpm_widths(2)) mux_unit_1 (
     94                .lpm_width(6),
     95                .lpm_widths(1)) mux_unit_1 (
    7396                .sel(int_chan_next),
    7497                .data({
    75                         2'd2, int_lfsr_reg[2*5+3:2*5], int_lfsr_reg[5+3:5],
    76                         2'd1, int_lfsr_reg[2*4+3:2*4], int_lfsr_reg[4+3:4],
    77                         2'd0, int_lfsr_reg[2*3+3:2*3], int_lfsr_reg[3+3:3]}),
    78                 .result(int_addr_wire));
     98                        1'b1, int_lfsr_reg[16+4:16],
     99                        1'b0, int_lfsr_reg[4+4:4]}),
     100                .result(int_addr_wire));                           
    79101
    80102        always @(posedge clock)
     
    83105        begin
    84106                        int_wren_reg <= 1'b1;
    85                         int_chan_reg <= 2'd0;
    86                         int_case_reg <= 3'd0;
    87                         int_addr_reg <= 8'd0;
    88                         for(i = 0; i <= 3; i = i + 1)
     107                        int_flag_reg <= 1'b0;
     108                        int_chan_reg <= 1'b0;
     109                        int_case_reg <= 2'd0;
     110                        int_addr_reg <= 6'd0;
     111                        for(i = 0; i <= 1; i = i + 1)
    89112                        begin
    90113                                acc_data_reg[i] <= {(size*widthr){1'b0}};
    91114                        end
    92                         for(i = 0; i <= 8; i = i + 1)
     115                        for(i = 0; i <= 2; i = i + 1)
    93116                        begin
    94117                                int_data_reg[i] <= {(size*widthr){1'b0}};
    95118                        end
    96                         int_lfsr_reg <= 16'd0;
     119                        int_lfsr_reg <= 24'd0;
    97120                end
    98121                else
    99122                begin
    100123                        int_wren_reg <= int_wren_next;
     124                        int_flag_reg <= int_flag_next;
    101125                        int_chan_reg <= int_chan_next;
    102126                        int_case_reg <= int_case_next;
    103127                        int_addr_reg <= int_addr_next;
    104                         for(i = 0; i <= 3; i = i + 1)
     128                        for(i = 0; i <= 1; i = i + 1)
    105129                        begin
    106130                                acc_data_reg[i] <= acc_data_next[i];
    107131                        end
    108                         for(i = 0; i <= 8; i = i + 1)
     132                        for(i = 0; i <= 2; i = i + 1)
    109133                        begin
    110134                                int_data_reg[i] <= int_data_next[i];
     
    117141        begin
    118142                int_wren_next = int_wren_reg;
     143                int_flag_next = int_flag_reg;
    119144                int_chan_next = int_chan_reg;
    120145                int_case_next = int_case_reg;
    121146                int_addr_next = int_addr_reg;
    122                 for(i = 0; i <= 3; i = i + 1)
     147                for(i = 0; i <= 1; i = i + 1)
    123148                begin
    124149                        acc_data_next[i] = acc_data_reg[i];
    125150                end
    126                 for(i = 0; i <= 8; i = i + 1)
     151                for(i = 0; i <= 2; i = i + 1)
    127152                begin
    128153                        int_data_next[i] = int_data_reg[i];
     
    135160                                // write zeros
    136161                                int_wren_next = 1'b1;
    137                                 int_addr_next = 8'd0;
    138                                 for(i = 0; i <= 3; i = i + 1)
     162                                int_addr_next = 6'd0;
     163                                for(i = 0; i <= 1; i = i + 1)
    139164                                begin
    140165                                        acc_data_next[i] = {(size*widthr){1'b0}};
    141166                                end
    142                                 for(i = 0; i <= 8; i = i + 1)
     167                                for(i = 0; i <= 2; i = i + 1)
    143168                                begin
    144169                                        int_data_next[i] = {(size*widthr){1'b0}};
    145170                                end
    146                                 int_case_next = 3'd1;
     171                                int_case_next = 2'd1;
    147172                        end     
    148173                        1:
    149174                        begin
    150175                                // write zeros
    151                                 int_addr_next = int_addr_reg + 8'd1;
     176                                int_addr_next = int_addr_reg + 6'd1;
    152177                                if (&int_addr_reg)
    153178                                begin
    154179                                        int_wren_next = 1'b0;
    155                                         int_chan_next = 2'd0;
    156                                         int_lfsr_next = 16'h7650;
    157                                         int_case_next = 3'd2;
     180                                        int_flag_next = 1'b0;
     181                                        int_chan_next = 1'b0;
     182                                        int_lfsr_next = 24'h0722BD;
     183                                        int_case_next = 'd2;
    158184                                end
    159185                        end     
    160186                        2: // frame
    161187                        begin
     188                                int_flag_next = 1'b0;
    162189                                if (frame)
    163190                                begin
    164191                                        int_wren_next = 1'b1;
    165192
    166                                         int_addr_next = {4'd0, int_lfsr_reg[3:0]};
     193                                        int_addr_next = {1'b0, int_lfsr_reg[4:0]};
    167194                                       
    168195                                        // set read addr for 2nd pipeline
    169                                         int_chan_next = 2'd1;
     196                                        int_chan_next = 1'b1;
    170197                   
    171198                                        // prepare registers for 1st sum                                       
    172199                                        acc_data_next[0] = acc_data_wire[0];
    173200                                        acc_data_next[1] = int_data_reg[0];
    174                                         acc_data_next[2] = int_data_reg[1];
    175                                         acc_data_next[3] = int_data_reg[2];
    176201                                       
    177                                         int_case_next = 3'd3;
    178                                 end
    179 
    180                         end
    181                         3:  // 1st sum
     202                                        int_lfsr_next = {int_lfsr_reg[22:0], int_lfsr_reg[2] ~^ int_lfsr_reg[4]};
     203
     204                                        int_case_next = 'd3;
     205                                end
     206                                if (int_flag_reg) // register 2nd sum
     207                                begin
     208                                        // register 2nd sum
     209                                        int_data_next[1] = acc_data_wire[1];
     210                                end
     211                        end
     212                        3:  // 2nd sum
    182213                        begin                           
    183                                 int_addr_next = {4'd1, int_lfsr_reg[3:0]};
    184 
    185                                 // set read addr for 3rd pipeline
    186                                 int_chan_next = 2'd2;
     214                                int_flag_next = 1'b1;
     215
     216                                int_addr_next = {1'b1, int_lfsr_reg[5:1]};
     217
     218                                // set read addr for 1st pipeline
     219                                int_chan_next = 1'b0;
    187220
    188221                                // prepare registers for 2nd sum       
    189                                 acc_data_next[0] = int_data_reg[2];
    190                                 acc_data_next[1] = int_data_reg[3];
    191                                 acc_data_next[2] = int_data_reg[4];
    192                                 acc_data_next[3] = int_data_reg[5];
     222                                acc_data_next[0] = int_data_reg[0];
     223                                acc_data_next[1] = int_data_reg[1];
    193224
    194225                                // register 1st sum
    195226                                int_data_next[0] = acc_data_wire[1];
    196                                 int_data_next[1] = acc_data_wire[2];
    197                                 int_data_next[2] = acc_data_wire[3];
    198 
    199                                 int_case_next = 3'd4;
    200                         end
    201                         4: // 2nd sum
    202                         begin
    203                                 int_addr_next = {4'd2, int_lfsr_reg[3:0]};
    204 
    205                                 // prepare registers for 3rd sum       
    206                                 acc_data_next[0] = int_data_reg[5];
    207                                 acc_data_next[1] = int_data_reg[6];
    208                                 acc_data_next[2] = int_data_reg[7];
    209                                 acc_data_next[3] = int_data_reg[8];
    210 
    211                                 // register 2nd sum
    212                                 int_data_next[3] = acc_data_wire[1];
    213                                 int_data_next[4] = acc_data_wire[2];
    214                                 int_data_next[5] = acc_data_wire[3];
    215227                               
    216                                 int_lfsr_next = {int_lfsr_reg[14:0], int_lfsr_reg[2] ~^ int_lfsr_reg[3]};
    217 
    218                                 int_case_next = 3'd5;
    219                         end
    220                         5:  // 3rd sum
    221                         begin                           
    222                                 int_wren_next = 1'b0;
    223 
    224                                 // set read addr for 1st pipeline
    225                                 int_chan_next = 2'd0;
    226 
    227                                 // register 3rd sum
    228                                 int_data_next[6] = acc_data_wire[1];
    229                                 int_data_next[7] = acc_data_wire[2];
    230                                 int_data_next[8] = acc_data_wire[3];
    231 
    232                                 int_case_next = 3'd2;
     228                                // register 2nd output
     229                                int_data_next[2] = int_data_reg[1];
     230
     231                                int_case_next = 2'd2;
    233232                        end
    234233                        default:
    235234                        begin
    236                                 int_case_next = 3'd0;
     235                                int_case_next = 2'd0;
    237236                        end
    238237                endcase
    239238        end
    240239
    241         assign out_data = int_data_reg[8];
     240        assign out_data = int_data_reg[2];
    242241
    243242endmodule
Note: See TracChangeset for help on using the changeset viewer.