]> git.gag.com Git - debian/gnuradio/blob - usrp/fpga/inband_lib/tx_buffer_inband.v
fec9dbe3134e573fbc9bdf93b891e0a7fdcb45ba
[debian/gnuradio] / usrp / fpga / inband_lib / tx_buffer_inband.v
1 module tx_buffer_inband
2   ( usbclk, bus_reset, reset, usbdata, WR, have_space, 
3     channels, tx_i_0, tx_q_0, tx_i_1, tx_q_1,
4     tx_i_2, tx_q_2, tx_i_3, tx_q_3, txclk, txstrobe,
5     clear_status, tx_empty, debugbus, 
6         rx_databus, rx_WR, rx_WR_done, rx_WR_enabled, reg_io_enable,
7         reg_data_in, reg_data_out, reg_addr, rssi_0, rssi_1, rssi_2, 
8     rssi_3, rssi_wait, threshhold, tx_underrun
9    );
10         
11     parameter NUM_CHAN   =      2 ;
12         /* Debug paramters */
13     parameter STROBE_RATE_0 =   8'd1 ;
14     parameter STROBE_RATE_1 =   8'd2 ;
15     
16     input   wire                usbclk ;
17     input   wire                bus_reset ; // Used here for the 257-Hack to fix the FX2 bug
18     input   wire                reset ; // standard DSP-side reset
19     input   wire         [15:0] usbdata ;
20     input   wire                WR ;
21     input   wire                txclk ;
22     input   wire                txstrobe ;
23         input   wire                            rx_WR_enabled;
24     /* Not used yet */
25     input   wire          [3:0] channels ;
26     input   wire                clear_status ;
27     /*register io*/
28     input   wire          [31:0]reg_data_out;
29     // rssi
30     input       wire              [31:0]rssi_0;
31     input       wire              [31:0]rssi_1;
32     input       wire              [31:0]rssi_2;
33     input       wire              [31:0]rssi_3;
34     input       wire              [31:0]threshhold;
35         input   wire              [31:0]rssi_wait;
36         
37     output  wire                have_space ;
38     output  wire                tx_empty ;
39     output  wire         [15:0] tx_i_0 ;
40     output  wire         [15:0] tx_q_0 ;
41     output  wire         [15:0] tx_i_1 ;
42     output  wire         [15:0] tx_q_1 ;
43     output  wire         [15:0] debugbus ;
44     /* Not used yet */
45     output  wire         [15:0] tx_i_2 ;
46     output  wire         [15:0] tx_q_2 ;
47     output  wire         [15:0] tx_i_3 ;
48     output  wire         [15:0] tx_q_3 ;
49
50         output  wire             [15:0] rx_databus ;
51         output  wire                            rx_WR;
52         output  wire                            rx_WR_done;
53     /* reg_io */
54     output  wire         [31:0] reg_data_in;
55     output  wire         [6:0]  reg_addr;
56     output  wire         [1:0]  reg_io_enable;
57         output  wire             [NUM_CHAN-1:0] tx_underrun;
58
59     /* To generate channel readers */
60     genvar i ;
61     
62     /* These will eventually be external register */
63     reg                  [31:0] adc_time ;
64     wire                  [7:0] txstrobe_rate [NUM_CHAN-1:0] ;
65     wire                                 [31:0] rssi [3:0];
66     assign rssi[0] = rssi_0;
67     assign rssi[1] = rssi_1;
68     assign rssi[2] = rssi_2;
69     assign rssi[3] = rssi_3;
70    
71         always @(posedge txclk)
72                 if (reset)
73                         adc_time <= 0;
74                 else if (txstrobe)
75                         adc_time <= adc_time + 1;
76
77
78     /* Connections between tx_usb_fifo_reader and
79        cnannel/command processing blocks */
80     wire                 [31:0] tx_data_bus ;
81     wire           [NUM_CHAN:0] chan_WR ;
82     wire           [NUM_CHAN:0] chan_done ;
83     
84     /* Connections between data block and the
85        FX2/TX chains */
86     wire           [NUM_CHAN:0] chan_underrun ;
87     wire           [NUM_CHAN:0] chan_txempty ;
88    
89     /* Conections between tx_data_packet_fifo and
90        its reader + strobe generator */
91     wire                 [31:0] chan_fifodata [NUM_CHAN:0] ;
92     wire                        chan_pkt_waiting [NUM_CHAN:0] ;
93     wire                        chan_rdreq [NUM_CHAN:0] ;
94     wire                        chan_skip [NUM_CHAN:0] ;
95     wire           [NUM_CHAN:0] chan_have_space ;
96     wire                        chan_txstrobe [NUM_CHAN-1:0] ;
97
98         wire                            [14:0]  debug;
99     
100     /* Outputs to transmit chains */
101     wire                 [15:0] tx_i [NUM_CHAN-1:0] ;
102     wire                 [15:0] tx_q [NUM_CHAN-1:0] ;
103     
104         /* TODO: Figure out how to write this genericly */
105     assign have_space = chan_have_space[0] & chan_have_space[1];
106     assign tx_empty = chan_txempty[0] & chan_txempty[1] ;
107     assign tx_i_0 = chan_txempty[0] ? 16'b0 : tx_i[0] ;
108     assign tx_q_0 = chan_txempty[0] ? 16'b0 : tx_q[0] ;
109     assign tx_i_1 = chan_txempty[1] ? 16'b0 : tx_i[1] ;
110     assign tx_q_1 = chan_txempty[1] ? 16'b0 : tx_q[1] ;
111         
112     /* Debug statement */
113     assign txstrobe_rate[0] = STROBE_RATE_0 ;
114     assign txstrobe_rate[1] = STROBE_RATE_1 ;
115         assign tx_q_2 = 16'b0 ;
116         assign tx_i_2 = 16'b0 ;
117         assign tx_q_3 = 16'b0 ;
118         assign tx_i_3 = 16'b0 ;
119         assign tx_i_3 = 16'b0 ;
120         
121         assign debugbus = {debug, txclk};
122
123         wire [31:0] usbdata_final;
124         wire            WR_final;
125
126         tx_packer tx_usb_packer
127         (
128                                 .bus_reset                      (bus_reset),
129                                 .usbclk                         (usbclk),
130                                 .WR_fx2                         (WR),
131                                 .usbdata                        (usbdata),
132                                 .reset                          (reset),
133                                 .txclk                          (txclk),
134                                 .usbdata_final          (usbdata_final),
135                                 .WR_final                       (WR_final)
136         );
137         
138         channel_demux channel_demuxer
139         (
140                                 .usbdata_final          (usbdata_final),
141                                 .WR_final                       (WR_final),
142                                 .reset                          (reset),
143                                 .txclk                          (txclk),
144                 .WR_channel         (chan_WR),
145                 .WR_done_channel    (chan_done),
146                 .ram_data           (tx_data_bus)                               
147         );
148         
149     generate for (i = 0 ; i < NUM_CHAN; i = i + 1)
150     begin : generate_channel_readers
151                 assign tx_underrun[i] = chan_underrun[i];
152         channel_ram tx_data_packet_fifo 
153             (      .reset               (reset),
154                    .txclk               (txclk), 
155                    .datain              (tx_data_bus),
156                    .WR                  (chan_WR[i]),
157                    .WR_done             (chan_done[i]),
158                    .have_space          (chan_have_space[i]),
159                    .dataout             (chan_fifodata[i]),
160                    .packet_waiting      (chan_pkt_waiting[i]),
161                    .RD                  (chan_rdreq[i]),
162                    .RD_done             (chan_skip[i])
163              );
164
165         chan_fifo_reader tx_chan_reader 
166            (       .reset               (reset),
167                    .tx_clock            (txclk),
168                    .tx_strobe           (txstrobe),
169                    .adc_time            (adc_time),
170                    .samples_format      (4'b0),
171                    .tx_q                (tx_q[i]),
172                    .tx_i                (tx_i[i]),
173                    .underrun            (chan_underrun[i]),
174                    .skip                (chan_skip[i]),
175                    .rdreq               (chan_rdreq[i]),
176                    .fifodata            (chan_fifodata[i]),
177                    .pkt_waiting         (chan_pkt_waiting[i]),
178                    .tx_empty            (chan_txempty[i]),
179                    .rssi                                (rssi[i]),
180                    .threshhold                  (threshhold),
181                                    .rssi_wait                   (rssi_wait)
182             );      
183         
184     end
185     endgenerate
186
187
188         channel_ram tx_cmd_packet_fifo 
189             (      .reset               (reset),
190                    .txclk               (txclk), 
191                    .datain              (tx_data_bus),
192                    .WR                  (chan_WR[NUM_CHAN]),
193                    .WR_done             (chan_done[NUM_CHAN]),
194                    .have_space          (chan_have_space[NUM_CHAN]),
195                    .dataout             (chan_fifodata[NUM_CHAN]),
196                    .packet_waiting      (chan_pkt_waiting[NUM_CHAN]),
197                    .RD                  (chan_rdreq[NUM_CHAN]),
198                    .RD_done             (chan_skip[NUM_CHAN])
199              );
200
201
202         cmd_reader tx_cmd_reader
203                 (               .reset                                  (reset),
204                                 .txclk                                  (txclk),
205                                 .adc_time                               (adc_time),
206                                 .skip                                   (chan_skip[NUM_CHAN]),
207                                 .rdreq                                  (chan_rdreq[NUM_CHAN]),
208                                 .fifodata                               (chan_fifodata[NUM_CHAN]),
209                                 .pkt_waiting                    (chan_pkt_waiting[NUM_CHAN]),
210                                 .rx_databus                             (rx_databus),
211                                 .rx_WR                                  (rx_WR),
212                                 .rx_WR_done                             (rx_WR_done),
213                                 .rx_WR_enabled                  (rx_WR_enabled),
214                                 .reg_data_in                    (reg_data_in),
215                                 .reg_data_out                   (reg_data_out),
216                                 .reg_addr                               (reg_addr),
217                                 .reg_io_enable                  (reg_io_enable),
218                                 .debug                                  (debug)
219                 );
220                                 
221                 
222    
223 endmodule // tx_buffer
224