1 module tx_buffer_inband
2 ( usbclk, bus_reset, reset, usbdata, WR, have_space,
3 tx_underrun, 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,
11 //CHAN_WIDTH is the width of the channel
12 //NUM_CHAN is the number of data channel (index from 0 to NUM_CHAN-1)
13 //index NUM_CHAN is reserved for command
15 parameter CHAN_WIDTH = 2 ;
16 parameter NUM_CHAN = 2 ;
18 parameter STROBE_RATE_0 = 8'd1 ;
19 parameter STROBE_RATE_1 = 8'd2 ;
22 input wire bus_reset ; // Used here for the 257-Hack to fix the FX2 bug
23 input wire reset ; // standard DSP-side reset
24 input wire [15:0] usbdata ;
28 input wire rx_WR_enabled;
30 input wire [3:0] channels ;
31 input wire clear_status ;
33 input wire [31:0]reg_data_out;
35 input wire [31:0]rssi_0;
36 input wire [31:0]rssi_1;
37 input wire [31:0]rssi_2;
38 input wire [31:0]rssi_3;
39 input wire [31:0]threshhold;
41 output wire have_space ;
42 output wire tx_underrun ;
43 output wire tx_empty ;
44 output wire [15:0] tx_i_0 ;
45 output wire [15:0] tx_q_0 ;
46 output wire [15:0] tx_i_1 ;
47 output wire [15:0] tx_q_1 ;
48 output wire [15:0] debugbus ;
50 output wire [15:0] tx_i_2 ;
51 output wire [15:0] tx_q_2 ;
52 output wire [15:0] tx_i_3 ;
53 output wire [15:0] tx_q_3 ;
55 output wire [15:0] rx_databus ;
57 output wire rx_WR_done;
59 output wire [31:0] reg_data_in;
60 output wire [6:0] reg_addr;
61 output wire [1:0] reg_io_enable;
63 /* To generate channel readers */
66 /* These will eventually be external register */
68 wire [7:0] txstrobe_rate [CHAN_WIDTH-1:0] ;
69 wire [31:0] rssi [3:0];
70 assign rssi[0] = rssi_0;
71 assign rssi[1] = rssi_1;
72 assign rssi[2] = rssi_2;
73 assign rssi[3] = rssi_3;
75 always @(posedge txclk)
79 adc_time <= adc_time + 1;
82 /* Connections between tx_usb_fifo_reader and
83 cnannel/command processing blocks */
84 wire [31:0] tx_data_bus ;
85 wire [CHAN_WIDTH:0] chan_WR ;
86 wire [CHAN_WIDTH:0] chan_done ;
88 /* Connections between data block and the
90 wire [CHAN_WIDTH:0] chan_underrun ;
91 wire [CHAN_WIDTH:0] chan_txempty ;
93 /* Conections between tx_data_packet_fifo and
94 its reader + strobe generator */
95 wire [31:0] chan_fifodata [CHAN_WIDTH:0] ;
96 wire chan_pkt_waiting [CHAN_WIDTH:0] ;
97 wire chan_rdreq [CHAN_WIDTH:0] ;
98 wire chan_skip [CHAN_WIDTH:0] ;
99 wire [CHAN_WIDTH:0] chan_have_space ;
100 wire chan_txstrobe [CHAN_WIDTH-1:0] ;
104 /* Outputs to transmit chains */
105 wire [15:0] tx_i [CHAN_WIDTH-1:0] ;
106 wire [15:0] tx_q [CHAN_WIDTH-1:0] ;
108 /* TODO: Figure out how to write this genericly */
109 assign have_space = chan_have_space[0] & chan_have_space[1];
110 assign tx_empty = chan_txempty[0] & chan_txempty[1] ;
111 assign tx_underrun = chan_underrun[0] | chan_underrun[1] ;
112 assign tx_i_0 = chan_txempty[0] ? 16'b0 : tx_i[0] ;
113 assign tx_q_0 = chan_txempty[0] ? 16'b0 : tx_q[0] ;
114 assign tx_i_1 = chan_txempty[1] ? 16'b0 : tx_i[1] ;
115 assign tx_q_1 = chan_txempty[1] ? 16'b0 : tx_q[1] ;
117 /* Debug statement */
118 assign txstrobe_rate[0] = STROBE_RATE_0 ;
119 assign txstrobe_rate[1] = STROBE_RATE_1 ;
120 assign tx_q_2 = 16'b0 ;
121 assign tx_i_2 = 16'b0 ;
122 assign tx_q_3 = 16'b0 ;
123 assign tx_i_3 = 16'b0 ;
124 assign tx_i_3 = 16'b0 ;
126 assign debugbus = {debug, txclk};
128 wire [31:0] usbdata_final;
131 tx_packer tx_usb_packer
133 .bus_reset (bus_reset),
139 .usbdata_final (usbdata_final),
143 channel_demux channel_demuxer
145 .usbdata_final (usbdata_final),
146 .WR_final (WR_final),
149 .WR_channel (chan_WR),
150 .WR_done_channel (chan_done),
151 .ram_data (tx_data_bus)
154 generate for (i = 0 ; i < NUM_CHAN; i = i + 1)
155 begin : generate_channel_readers
156 channel_ram tx_data_packet_fifo
159 .datain (tx_data_bus),
161 .WR_done (chan_done[i]),
162 .have_space (chan_have_space[i]),
163 .dataout (chan_fifodata[i]),
164 .packet_waiting (chan_pkt_waiting[i]),
166 .RD_done (chan_skip[i])
169 chan_fifo_reader tx_chan_reader
172 .tx_strobe (txstrobe),
173 .adc_time (adc_time),
174 .samples_format (4'b0),
177 .underrun (chan_underrun[i]),
178 .skip (chan_skip[i]),
179 .rdreq (chan_rdreq[i]),
180 .fifodata (chan_fifodata[i]),
181 .pkt_waiting (chan_pkt_waiting[i]),
182 .tx_empty (chan_txempty[i]),
184 .threshhold (threshhold)
191 channel_ram tx_cmd_packet_fifo
194 .datain (tx_data_bus),
195 .WR (chan_WR[NUM_CHAN]),
196 .WR_done (chan_done[NUM_CHAN]),
197 .have_space (chan_have_space[NUM_CHAN]),
198 .dataout (chan_fifodata[NUM_CHAN]),
199 .packet_waiting (chan_pkt_waiting[NUM_CHAN]),
200 .RD (chan_rdreq[NUM_CHAN]),
201 .RD_done (chan_skip[NUM_CHAN])
205 cmd_reader tx_cmd_reader
208 .adc_time (adc_time),
209 .skip (chan_skip[NUM_CHAN]),
210 .rdreq (chan_rdreq[NUM_CHAN]),
211 .fifodata (chan_fifodata[NUM_CHAN]),
212 .pkt_waiting (chan_pkt_waiting[NUM_CHAN]),
213 .rx_databus (rx_databus),
215 .rx_WR_done (rx_WR_done),
216 .rx_WR_enabled (rx_WR_enabled),
217 .reg_data_in (reg_data_in),
218 .reg_data_out (reg_data_out),
219 .reg_addr (reg_addr),
220 .reg_io_enable (reg_io_enable),
226 endmodule // tx_buffer