1
//`include "../../firmware/include/fpga_regs_common.v"
2
//`include "../../firmware/include/fpga_regs_standard.v"
3
module rx_buffer_inband
6
input reset, // DSP side reset (used here), do not reset registers
7
input reset_regs, //Only reset registers
10
output wire have_pkt_rdy,
11
output reg rx_overrun,
12
input wire [3:0] channels,
13
input wire [15:0] ch_0,
14
input wire [15:0] ch_1,
15
input wire [15:0] ch_2,
16
input wire [15:0] ch_3,
17
input wire [15:0] ch_4,
18
input wire [15:0] ch_5,
19
input wire [15:0] ch_6,
20
input wire [15:0] ch_7,
24
input [6:0] serial_addr,
25
input [31:0] serial_data,
27
output wire [15:0] debugbus,
29
//Connection with tx_inband
31
input [15:0] rx_databus,
33
output reg rx_WR_enabled,
35
input wire [31:0] rssi_0, input wire [31:0] rssi_1,
36
input wire [31:0] rssi_2, input wire [31:0] rssi_3,
37
input wire [1:0] tx_underrun
40
parameter NUM_CHAN = 1;
45
always @(negedge usbclk)
47
read_count <= #1 9'd0;
48
else if(RD & ~read_count[8])
49
read_count <= #1 read_count + 9'd1;
51
read_count <= #1 RD ? read_count : 9'b0;
54
reg [31:0] timestamp_clock;
55
always @(posedge rxclk)
59
timestamp_clock <= timestamp_clock + 1;
65
wire [15:0] fifodata_il[0:NUM_CHAN];
71
always@(posedge rxclk)
91
assign fifodata_il[0] = (sel)?ch_1:ch_0;
92
assign fifodata_il[1] = (sel)?ch_3:ch_2;
94
fifo_4kx16_dc rx_usb_fifo (
98
.rdreq ( RD & ~read_count[8] ),
103
.rdusedw ( rdusedw ),
105
.wrusedw ( wrusedw ) );
107
assign have_pkt_rdy = (rdusedw >= 12'd256);
108
assign have_space = (wrusedw < 12'd760);
111
// These are of size [NUM_CHAN:0] because the extra channel is used for the
112
// RX command channel. If there were no command channel, they would be
115
wire [15:0] chan_fifodata;
116
wire [9:0] chan_usedw;
117
wire [NUM_CHAN:0] chan_empty;
118
wire [3:0] rd_select;
119
wire [NUM_CHAN:0] rx_full;
121
packet_builder #(NUM_CHAN) rx_pkt_builer (
124
.timestamp_clock ( timestamp_clock ),
125
.channels ( NUM_CHAN ),
126
.chan_rdreq ( chan_rdreq ),
127
.chan_fifodata ( chan_fifodata ),
128
.chan_empty ( chan_empty ),
129
.rd_select ( rd_select ),
130
.chan_usedw ( chan_usedw ),
132
.fifodata ( fifodata ),
133
.have_space ( have_space ),
134
.rssi_0(rssi_0), .rssi_1(rssi_1),
135
.rssi_2(rssi_2),.rssi_3(rssi_3), .debugbus(debug),
136
.underrun(tx_underrun));
139
always @(posedge rxclk)
144
else if(clear_status)
148
// FIXME: what is the purpose of these two lines?
149
wire [15:0]ch[NUM_CHAN:0];
154
always @(posedge rxclk)
163
// Of Size 0:NUM_CHAN due to extra command channel.
164
wire [15:0] dataout [0:NUM_CHAN];
165
wire [9:0] usedw [0:NUM_CHAN];
166
wire empty[0:NUM_CHAN];
168
generate for (i = 0 ; i < NUM_CHAN; i = i + 1)
169
begin : generate_channel_fifos
173
assign rdreq = (rd_select == i) & chan_rdreq;
175
fifo_1kx16 rx_chan_fifo (
178
.data ( fifodata_il[i] ),
180
.wrreq ( ~rx_full[i] & wr),
185
.almost_empty(chan_empty[i])
192
fifo_1kx16 rx_cmd_fifo (
195
.data ( rx_databus ),
196
.rdreq ( (rd_select == NUM_CHAN) & chan_rdreq ),
197
.wrreq ( rx_WR & rx_WR_enabled),
199
.full ( rx_full[NUM_CHAN] ),
200
.q ( dataout[NUM_CHAN]),
201
.usedw ( usedw[NUM_CHAN] )
204
assign chan_empty[NUM_CHAN] = cmd_empty | rx_WR_enabled;
205
assign chan_fifodata = dataout[rd_select];
206
assign chan_usedw = usedw[rd_select];
207
assign debugbus = {4'd0, rxclk, rxstrobe, rx_full[0], rx_full[1], sel, wr};