Ignore:
Timestamp:
Nov 19, 2009, 12:09:21 AM (15 years ago)
Author:
demin
Message:

start testing SRAM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/MultiChannelUSB/control.v

    r59 r65  
    1616                output  wire                    tx_wrreq,
    1717                output  wire    [7:0]   tx_data,
     18                output  wire                    ram_we,
     19                output  wire    [19:0]  ram_addr,
     20                inout   wire    [17:0]  ram_data,
    1821                output  wire                    led
    1922        );
    2023
    21         reg             [23:0]  rx_counter;
     24        reg             [23:0]  led_counter;
     25        reg             [18:0]  ram_counter;   
    2226        reg             [10:0]  tst_counter;   
    2327        reg     [15:0]  int_addr, int_max_addr;
     
    3034
    3135
     36        wire                    crc_error = 1'b0;
     37        reg                             crc_reset;
     38        reg             [2:0]   byte_counter;
     39        reg             [4:0]   idle_counter;
     40
    3241        reg             [3:0]   state;
     42       
     43        wire    [15:0]  src, dst;
     44
     45        reg             [15:0]  memory [15:0];
     46        reg             [7:0]   buffer [7:0];
     47
     48        assign  src = (buffer[0][7]) ? memory[buffer[3][3:0]] : {buffer[2], buffer[3]};
     49        assign  dst = {1'b0, buffer[0][6:0], buffer[1]};
     50
     51        reg                             int_ram_we;
     52        reg             [17:0]  int_ram_data;
     53        wire    [17:0]  int_ram_q;
     54        wire    [17:0]  opt_ram_we;
     55        assign  ram_we = ~int_ram_we;
     56        assign  int_ram_q = ram_data;
     57//      assign  ram_data = int_ram_we ? int_ram_data : 18'bz;
     58        assign  ram_addr = {ram_counter[18:5],1'd0,ram_counter[4:0]};
     59
     60        genvar j;
     61        generate
     62                for (j = 0; j < 18; j = j + 1)
     63                begin : SRAM_WE
     64                        assign opt_ram_we[j] = int_ram_we;
     65                        assign ram_data[j] = opt_ram_we[j] ? int_ram_data[j] : 1'bz;
     66                end
     67        endgenerate
    3368
    3469        always @(posedge clk)
     
    3772                begin
    3873                        int_led <= 1'b0;
    39                         rx_counter <= 24'd0;
     74                        led_counter <= 24'd0;
    4075                end
    4176                else
    4277                begin
    43                         if (&rx_counter)
     78                        if (&led_counter)
    4479                        begin
    4580                                int_led <= 1'b1;
     
    4782                        else
    4883                        begin
    49                                 rx_counter <= rx_counter + 24'd1;
     84                                led_counter <= led_counter + 24'd1;
    5085                        end
    5186                end
    5287
    5388                case(state)
    54                         1:
     89                        0:
    5590                        begin
    5691                                int_rdreq <= 1'b1;
     
    6095                                int_byte <= 2'd0;       
    6196                                int_reset <= 1'b0;
    62                                 state <= 4'd2;
    63                         end
    64 
     97                                crc_reset <= 1'b0;
     98                                int_ram_we <= 1'b0;
     99                                int_ram_data <= 16'd0;
     100                                ram_counter <= 19'd0;
     101                                idle_counter <= 5'd0;
     102                                byte_counter <= 3'd0;
     103                                state <= 4'd1;
     104                        end
     105
     106                        1:
     107                        begin
     108                                // read 8 bytes
     109                                if (~rx_empty)
     110                                begin
     111                                        idle_counter <= 5'd0;
     112                                        byte_counter <= byte_counter + 3'd1;
     113                                        buffer[byte_counter] <= rx_data;
     114                                        if (&byte_counter)
     115                                        begin
     116                                                int_rdreq <= 1'b0;
     117                                                state <= 4'd2;
     118                                        end
     119                                end
     120                                else if(|byte_counter)
     121                                begin
     122                                        idle_counter <= idle_counter + 5'd1;
     123                                        if (&idle_counter)
     124                                        begin
     125                                                int_rdreq <= 1'b0;
     126                                                crc_reset <= 1'b1;
     127                                                state <= 4'd0;
     128                                        end
     129                                end
     130                        end
     131                       
    65132                        2:
    66133                        begin
    67                                 if (~rx_empty)
    68                                 begin
    69                                         case (rx_data)
    70                                                 8'h40, 8'h41, 8'h42, 8'h43, 8'h50, 8'h51, 8'h52, 8'h53:
    71                                                 begin
    72                                                         int_rdreq <= 1'b0;
    73                                                         int_type <= rx_data[4];
    74                                                         int_chan <= rx_data[1:0];
     134                                crc_reset <= 1'b1;
     135                                if (~crc_error)
     136                                begin
     137                                        memory[dst[3:0]] <= src;
     138                               
     139                                        case (dst)
     140                                                16'h0000:
     141                                                begin
     142                                                        state <= 4'd0;
     143                                                end
     144
     145                                                16'h0001:
     146                                                begin
     147                                                        int_type <= src[4];
     148                                                        int_chan <= src[1:0];
    75149                                                        int_reset <= 1'b1;
    76                                                         state <= 4'd1;
    77                                                 end
    78 
    79                                                 8'h60, 8'h61, 8'h62, 8'h63, 8'h70, 8'h71, 8'h72, 8'h73:
    80                                                 begin
    81                                                         int_rdreq <= 1'b0;
    82                                                         int_type <= rx_data[4];
    83                                                         int_chan <= rx_data[1:0];
     150                                                        state <= 4'd0;
     151                                                end
     152
     153                                                16'h0002:
     154                                                begin
     155                                                        int_type <= src[4];
     156                                                        int_chan <= src[1:0];
    84157                                                        state <= 4'd3;
    85158                                                end
    86159
    87                                                 8'h30:
    88                                                 begin
    89                                                         int_rdreq <= 1'b0;
    90                                                         state <= 4'd1;
    91                                                 end
    92 
    93                                                 8'h31:
    94                                                 begin
    95                                                         int_rdreq <= 1'b0;
     160                                                16'h0003:
     161                                                begin
    96162                                                        tst_counter <= 11'd0;   
    97163                                                        state <= 4'd6;
    98164                                                end
     165                                                16'h0004:
     166                                                begin
     167                                                        int_ram_we <= 1'b1;
     168                                                        int_ram_data <= 18'd0;
     169                                                        ram_counter <= 19'd0;   
     170                                                        state <= 4'd9;
     171                                                end
    99172                                        endcase
    100173                                end
    101174                        end
     175
    102176                        // mux transfer
    103177                        3:
    104178                        begin
     179                                crc_reset <= 1'b0;
    105180                                int_addr <= mux_min_addr;
    106181                                int_max_addr <= mux_min_addr + mux_max_addr;
     
    124199                                        if ((int_byte == int_max_byte) && (int_addr == int_max_addr))
    125200                                        begin
    126                                                 state <= 4'd1;
     201                                                state <= 4'd0;
    127202                                        end
    128203                                        else
     
    145220                        6:
    146221                        begin
     222                                crc_reset <= 1'b0;
    147223                                int_data <= tst_counter;
    148224                                int_wrreq <= 1'b1;
    149225                                tst_counter <= tst_counter + 11'd1;
    150                                 state <= 4'd8;
     226                                state <= 4'd7;
    151227                        end
    152228                        7:
     
    155231                                begin
    156232                                        int_data <= tst_counter;
    157                                         if (tst_counter == 11'd0)
    158                                         begin
    159                                                 state <= 4'd9;
     233                                        if (&tst_counter)
     234                                        begin
     235                                                state <= 4'd8;
    160236                                        end
    161237                                        else
     
    170246                                begin
    171247                                        int_wrreq <= 1'b0;
    172                                         state <= 4'd1;
     248                                        state <= 4'd0;
     249                                end
     250                        end
     251                        // ram transfer
     252                        9:
     253                        begin
     254                                crc_reset <= 1'b0;
     255                                state <= 4'd10;
     256                        end
     257                        10:
     258                        begin
     259                                int_ram_data[8:1] <= ram_counter[7:0];
     260//                              int_ram_data[8:1] <= 8'd0;
     261                                if (&ram_counter)
     262                                begin
     263                                        state <= 4'd11;
     264                                end
     265                                else
     266                                begin
     267                                        state <= 4'd9;
     268                                        ram_counter <= ram_counter + 19'd1;
     269                                end
     270                        end
     271                        11:
     272                        begin
     273                                int_ram_we <= 1'b0;
     274                                int_ram_data <= 18'd0;
     275                                ram_counter <= 19'd0;
     276                                state <= 4'd12;
     277                        end
     278                        12:
     279                        begin
     280                                int_wrreq <= 1'b0;
     281                                state <= 4'd13;
     282                        end
     283                        13:
     284                        begin
     285                                state <= 4'd14;
     286                        end
     287                        14:
     288                        begin
     289                                if (~tx_full)
     290                                begin
     291                                        int_data <= int_ram_q[8:1];
     292                                        int_wrreq <= 1'b1;
     293                                        if (&ram_counter)
     294                                        begin
     295                                                state <= 4'd0;
     296                                        end
     297                                        else
     298                                        begin
     299                                                state <= 4'd12;
     300                                                ram_counter <= ram_counter + 19'd1;
     301                                        end
    173302                                end
    174303                        end
     
    176305                        default:
    177306                        begin
    178                                 state <= 4'd1;
     307                                state <= 4'd0;
    179308                        end
    180309                endcase
Note: See TracChangeset for help on using the changeset viewer.