Merged features/inband -r4812:5218 into trunk. This group of changes
[debian/gnuradio] / usrp / fpga / inband_lib / usb_packet_fifo2.v
1 `default_nettype none
2
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) ;
5     
6     /* Module parameters */
7     parameter                       LOG2_N          =   2 ;
8     parameter                       BUS_WIDTH       =   16 ;
9     parameter                       FIFO_WIDTH      =   32 ;
10
11     input   wire                    reset;
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 ;
21     output  wire                    tx_empty;
22
23     
24     /* Variable for generate statement */
25     genvar i ;
26     
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 ;
37     
38     /* FIFO Select for read and write ports */
39     reg     [LOG2_N-1:0]            fifo_rselect ;
40     reg     [LOG2_N-1:0]            fifo_wselect ;
41     
42     /* Used to convert 16 bits usbdata to the 32 bits wide fifo */
43     reg                             word_complete ;
44     reg     [BUS_WIDTH-1:0]         write_data_delayed ;
45     
46     /* Assign have_space to empty flag of currently selected write FIFO */
47     assign have_space = fifo_wempty[fifo_wselect] ;
48     
49     /* Assign pkt_waiting to full flag of currently selected read FIFO */
50     assign pkt_waiting = fifo_rfull[fifo_rselect] ;
51     
52     /* Assign the read_data to the output of the currently selected FIFO */
53     assign read_data = fifo_rdata[fifo_rselect] ;
54     
55     /* Figure out if we're all empty */
56     assign tx_empty = !(~fifo_rempty) ;
57     
58     /* Increment fifo_rselect here */
59     always @(posedge fpga_clock)
60     begin
61         if (reset)
62             fifo_rselect <= {2**LOG2_N{1'b0}} ;
63         
64         if (fifo_rempty[fifo_rselect])
65             fifo_rselect <= fifo_rselect + 1 ;
66             
67         if (skip_packet)
68             fifo_rselect <= fifo_rselect + 1 ;
69     end
70     
71     /* Increment fifo_wselect and pack data into 32 bits block  */
72     always @(posedge usb_clock, reset)
73     begin
74         if (reset)
75           begin
76             fifo_wselect <= {2**LOG2_N{1'b0}} ;
77             word_complete <= 0;
78           end
79             
80         if (fifo_wfull[fifo_wselect])
81             fifo_wselect <= fifo_wselect + 1 ;
82             
83         if (write_enable)
84           begin
85             word_complete <= ~word_complete ;
86             
87             if (word_complete)
88                 fifo_wdata[fifo_wselect] <= {write_data_delayed, write_data} ;
89             else
90                 write_data_delayed <= write_data ;
91               
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 ;
95             
96             fifo_we[fifo_wselect] <= write_enable & word_complete ;
97           end
98     end
99     
100     /* Generate all the single packet FIFOs */
101     generate
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] ) ) ;
117         end
118     endgenerate
119 endmodule