1 module usb_fifo_reader (tx_clock, fifodata, pkt_waiting, reset,
2 rdreq, skip, done_chan, WR_chan, tx_data_bus);
4 /* Module parameters */
5 parameter NUM_CHAN = 2 ;
10 input wire [WIDTH-1:0] fifodata ;
11 input wire pkt_waiting ;
14 output reg [NUM_CHAN:0] done_chan ;
15 output reg [NUM_CHAN:0] WR_chan ;
16 output reg [WIDTH-1:0] tx_data_bus ;
20 /* States definition */
23 `define READ_HEADER 3'd2
24 `define FORWARD_DATA 3'd3
25 `define SKIP_REST 3'd4
33 reg [2:0] reader_state ;
34 reg [2:0] reader_next_state ;
36 reg [8:0] pkt_length ;
37 reg [8:0] read_length ;
40 always @(posedge tx_clock)
44 reader_state <= `IDLE ;
45 reader_next_state <= `IDLE ;
48 WR_chan <= {NUM_CHAN+1{1'b0}} ;
49 done_chan <= {NUM_CHAN+1{1'b0}} ;
53 reader_state = reader_next_state ;
58 reader_next_state <= pkt_waiting ? `WAIT : `IDLE ;
59 rdreq <= pkt_waiting ;
62 /* Wait for the fifo's data to show up */
65 reader_next_state <= `READ_HEADER ;
70 reader_next_state <= `FORWARD_DATA ;
72 /* Read header fields */
73 channel <= (fifodata & 32'h1F0000) ;
74 pkt_length <= (fifodata & 16'h1FF) + 4 ;
79 `TXCHAN0: WR_chan[0] <= 1 ;
80 `TXCHAN1: WR_chan[1] <= 1 ;
81 `TXCMD: WR_chan[2] <= 1 ;
82 default: WR_chan <= 1 ;
84 tx_data_bus <= fifodata ;
89 read_length <= read_length + 4 ;
91 // If end of payload...
92 if (read_length == pkt_length)
94 reader_next_state <= `SKIP_REST ;
95 /* If the packet is 512 bytes, don't skip */
96 skip <= pkt_length < 506 ;
98 /* Data pushing done */
99 WR_chan <= {NUM_CHAN+1{1'b0}} ;
101 /* Notify next block */
103 `TXCHAN0: done_chan[0] <= 1 ;
104 `TXCHAN1: done_chan[1] <= 1 ;
105 `TXCMD: done_chan[2] <= 1 ;
106 default: done_chan[0] <= 1 ;
109 else if (read_length == pkt_length - 4)
113 tx_data_bus <= fifodata ;
118 reader_next_state <= pkt_waiting ? `READ_HEADER : `IDLE ;
119 done_chan <= {NUM_CHAN+1{1'b0}} ;
120 rdreq <= pkt_waiting ;
126 reader_state <= `IDLE;
127 reader_next_state <= `IDLE;