3 module usb_packet_fifo2(reset, usb_clock, fpga_clock, write_enable, write_data,
4 read_enable, skip_packet, read_data, have_space, pkt_waiting, tx_empty) ;
6 /* Module parameters */
8 parameter BUS_WIDTH = 16 ;
9 parameter FIFO_WIDTH = 32 ;
12 input wire usb_clock ;
13 input wire fpga_clock ;
14 input wire write_enable ;
15 input wire [BUS_WIDTH-1:0] write_data ;
16 input wire read_enable ;
17 input wire skip_packet ;
18 output wire [FIFO_WIDTH-1:0] read_data ;
19 output wire have_space ;
20 output wire pkt_waiting ;
24 /* Variable for generate statement */
27 /* Local wires for FIFO connections */
28 wire [2**LOG2_N-1:0] fifo_resets ;
29 reg [2**LOG2_N-1:0] fifo_we ;
30 wire [2**LOG2_N-1:0] fifo_re ;
31 reg [FIFO_WIDTH-1:0] fifo_wdata[2**LOG2_N-1:0] ;
32 wire [FIFO_WIDTH-1:0] fifo_rdata[2**LOG2_N-1:0] ;
33 wire [2**LOG2_N-1:0] fifo_rempty ;
34 wire [2**LOG2_N-1:0] fifo_rfull ;
35 wire [2**LOG2_N-1:0] fifo_wempty ;
36 wire [2**LOG2_N-1:0] fifo_wfull ;
38 /* FIFO Select for read and write ports */
39 reg [LOG2_N-1:0] fifo_rselect ;
40 reg [LOG2_N-1:0] fifo_wselect ;
42 /* Used to convert 16 bits usbdata to the 32 bits wide fifo */
44 reg [BUS_WIDTH-1:0] write_data_delayed ;
46 /* Assign have_space to empty flag of currently selected write FIFO */
47 assign have_space = fifo_wempty[fifo_wselect] ;
49 /* Assign pkt_waiting to full flag of currently selected read FIFO */
50 assign pkt_waiting = fifo_rfull[fifo_rselect] ;
52 /* Assign the read_data to the output of the currently selected FIFO */
53 assign read_data = fifo_rdata[fifo_rselect] ;
55 /* Figure out if we're all empty */
56 assign tx_empty = !(~fifo_rempty) ;
58 /* Increment fifo_rselect here */
59 always @(posedge fpga_clock)
62 fifo_rselect <= {2**LOG2_N{1'b0}} ;
64 if (fifo_rempty[fifo_rselect])
65 fifo_rselect <= fifo_rselect + 1 ;
68 fifo_rselect <= fifo_rselect + 1 ;
71 /* Increment fifo_wselect and pack data into 32 bits block */
72 always @(posedge usb_clock, reset)
76 fifo_wselect <= {2**LOG2_N{1'b0}} ;
80 if (fifo_wfull[fifo_wselect])
81 fifo_wselect <= fifo_wselect + 1 ;
85 word_complete <= ~word_complete ;
88 fifo_wdata[fifo_wselect] <= {write_data_delayed, write_data} ;
90 write_data_delayed <= write_data ;
92 /* Avoid to continue to write in the previous fifo when we have
93 just swichted to the next one */
94 fifo_we[fifo_wselect-1] <= 0 ;
96 fifo_we[fifo_wselect] <= write_enable & word_complete ;
100 /* Generate all the single packet FIFOs */
102 for( i = 0 ; i < 2**LOG2_N ; i = i + 1 )
103 begin : generate_single_packet_fifos
104 assign fifo_re[i] = (fifo_rselect == i) ? read_enable : 1'b0 ;
105 assign fifo_resets[i] = (fifo_rselect == i) ? skip_packet : 1'b0 ;
106 fifo_512 single_packet_fifo(.wrclk ( usb_clock ),
107 .rdclk ( fpga_clock ),
108 .aclr ( fifo_resets[i] ),
109 .wrreq ( fifo_we[i] ),
110 .data ( fifo_wdata[i] ),
111 .rdreq ( fifo_re[i] ),
112 .q ( fifo_rdata[i] ),
113 .rdfull ( fifo_rfull[i] ),
114 .rdempty( fifo_rempty[i] ),
115 .wrfull ( fifo_wfull[i] ),
116 .wrempty( fifo_wempty[i] ) ) ;