Ignore:
Timestamp:
Sep 4, 2009, 10:16:52 PM (15 years ago)
Author:
demin
Message:

attemp to improve USB interface

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/MultiChannelUSB/usb_fifo.v

    r30 r31  
    1111                input   wire    [7:0]   tx_data,
    1212                output  wire                    tx_full, rx_empty,
    13                 output  wire    [7:0]   rx_data
     13                output  wire    [7:0]   rx_data,
     14                output  wire                    led
    1415        );
    1516
    1617        // bidirectional data bus
    17         wire                    usb_wren;
    18         wire    [7:0]   usb_datain = usb_data;
    19         wire    [7:0]   usb_dataout;
     18        reg                             int_addr, int_wren, int_rden, int_wrreq, int_rdreq;
     19        wire    [7:0]   int_datain = usb_data;
     20        wire    [7:0]   int_dataout;
    2021
    21         assign  usb_data = usb_wren ? usb_dataout : 8'bz;
     22        assign  usb_data = int_wren ? int_dataout : 8'bz;
    2223
    2324        wire                    rx_full, tx_empty;
     25        wire                    rx_ready, tx_ready;
    2426        reg             [8:0]   byte_counter;
    2527        reg             [4:0]   idle_counter;
     28
     29        assign  led = ~usb_empty;
    2630
    2731        fifo32x8 fifo_tx_unit (
     
    2933                .data(tx_data),
    3034                .rdclk(usb_clk),
    31                 .rdreq(usb_wrreq),
     35                .rdreq(int_wrreq),
    3236                .wrclk(clk),
    3337                .wrreq(tx_wrreq),
    34                 .q(usb_dataout),
     38                .q(int_dataout),
    3539                .rdempty(tx_empty),
    3640                .wrfull(tx_full));
     
    3842        fifo32x8 fifo_rx_unit (
    3943                .aclr(aclr),
    40                 .data(usb_datain),
     44                .data(int_datain),
    4145                .rdclk(clk),
    4246                .rdreq(rx_rdreq),
    4347                .wrclk(usb_clk),
    44                 .wrreq(usb_rdreq),
     48                .wrreq(int_rdreq),
    4549                .q(rx_data),
    4650                .rdempty(rx_empty),
    4751                .wrfull(rx_full));
     52
     53        assign  rx_ready = (~usb_empty) & (~rx_full);
     54        assign  tx_ready = (~usb_full) & (~tx_empty);
    4855               
    4956        always @ (posedge usb_clk)
    5057        begin
     58                casez ({rx_ready, tx_ready, int_addr, int_rden})
     59                        4'b00??: // idle
     60                        begin
     61                                int_addr <= 1'b0;
     62                                int_rden <= 1'b0;
     63                                int_wren <= 1'b0;
     64                                int_rdreq <= 1'b0;
     65                                int_wrreq <= 1'b0;
     66                        end
     67                        4'b1?1?: // set read addr
     68                        begin
     69                                int_addr <= 1'b0;
     70                                int_rden <= 1'b0;
     71                                int_wren <= 1'b0;
     72                                int_rdreq <= 1'b0;
     73                                int_wrreq <= 1'b0;
     74                        end
     75                        4'b1?00: // enable reads
     76                        begin
     77                                int_addr <= 1'b0;
     78                                int_rden <= 1'b1;
     79                                int_wren <= 1'b0;
     80                                int_rdreq <= 1'b0;
     81                                int_wrreq <= 1'b0;
     82                        end
     83                        4'b1?01: // read
     84                        begin
     85                                int_addr <= 1'b0;
     86                                int_rden <= 1'b1;
     87                                int_wren <= 1'b0;
     88                                int_rdreq <= 1'b1;
     89                                int_wrreq <= 1'b0;
     90                        end
     91                        4'b0101: // disable reads
     92                        begin
     93                                int_addr <= 1'b0;
     94                                int_rden <= 1'b0;
     95                                int_wren <= 1'b0;
     96                                int_rdreq <= 1'b0;
     97                                int_wrreq <= 1'b0;
     98                        end
     99                        4'b0100: // set write addr
     100                        begin
     101                                int_addr <= 1'b1;
     102                                int_rden <= 1'b0;
     103                                int_wren <= 1'b1;
     104                                int_rdreq <= 1'b0;
     105                                int_wrreq <= 1'b0;
     106                        end
     107                        4'b011?: // write
     108                        begin
     109                                int_addr <= 1'b1;
     110                                int_rden <= 1'b0;
     111                                int_wren <= 1'b1;
     112                                int_rdreq <= 1'b0;
     113                                int_wrreq <= 1'b1;
     114                        end
     115                endcase
     116/*
    51117                if (usb_pktend)
    52118                begin
     
    64130                        idle_counter <= idle_counter + 5'd1;
    65131                end
     132*/
    66133        end
    67134
    68         assign  usb_pktend = (&idle_counter);
    69 //      assign  usb_pktend = 1'b0;
    70         assign  usb_rdreq = (~usb_empty) & (~rx_full);
    71         assign  usb_wrreq = (~usb_rdreq) & (~usb_full) & (~tx_empty);
    72         assign  usb_rden = usb_rdreq;
    73         assign  usb_wren = usb_wrreq;
    74         assign  usb_addr = usb_empty ? 2'b11 : 2'b10;
     135        assign  usb_addr = {1'b1, int_addr};
     136        assign  usb_rden = int_rden;
     137        assign  usb_rdreq = int_rdreq;
     138        assign  usb_wrreq = int_wrreq;
     139//      assign  usb_pktend = (&idle_counter);
     140        assign  usb_pktend = 1'b0;
    75141
    76142endmodule
Note: See TracChangeset for help on using the changeset viewer.