libusrp/fpga/inband_lib/tx_buffer_inband.v

184 lines
4.4 KiB
Verilog
Executable File

module tx_buffer_inband
( input usbclk,
input bus_reset, // Used here for the 257-Hack to fix the FX2 bug
input reset, // standard DSP-side reset
input [15:0] usbdata,
input wire WR,
output wire have_space,
output reg tx_underrun,
input wire [3:0] channels,
output [15:0] tx_i_0,
output [15:0] tx_q_0,
output [15:0] tx_i_1,
output [15:0] tx_q_1,
//NOT USED
output reg [15:0] tx_i_2,
output reg [15:0] tx_q_2,
output reg [15:0] tx_i_3,
output reg [15:0] tx_q_3,
input txclk,
input txstrobe,
input clear_status,
output wire tx_empty,
output [11:0] debugbus
);
wire [15:0] tx_data_bus;
wire WR_chan_0;
wire chan_0_done;
wire OR0;
wire UR0;
wire WR_chan_1;
wire chan_1_done;
wire OR1;
wire UR1;
// NOT USED yet
wire WR_cmd;
wire cmd_done;
//EXTERNAL REGISTER
//TODO: increment it
reg [31:0] time_counter;
reg [7:0] txstrobe_rate_0;
reg [7:0] txstrobe_rate_1;
//Usb block
wire [15:0] tupf_fifodata;
wire tupf_pkt_waiting;
wire tupf_rdreq;
wire tupf_skip;
wire tupf_have_space;
usb_packet_fifo2 tx_usb_packet_fifo
( .reset (reset),
.usb_clock (usbclk),
.fpga_clock (txclk),
.write_data (usbdata),
.write_enable (WR),
.read_data (tupf_fifodata),
.pkt_waiting (tupf_pkt_waiting),
.read_enable (tupf_rdreq),
.skip_packet (tupf_skip),
.have_space (tupf_have_space),
.tx_empty (tx_empty)
);
usb_fifo_reader tx_usb_packet_reader (
.reset(reset),
.tx_clock(txclk),
.tx_data_bus(tx_data_bus),
.WR_chan_0(WR_chan_0),
.WR_chan_1(WR_chan_1),
.WR_cmd(WR_cmd),
.chan_0_done(chan_0_done),
.chan_1_done(chan_1_done),
.cmd_done(cmd_done),
.rdreq(tupf_rdreq),
.skip(tupf_skip),
.pkt_waiting(tupf_pkt_waiting),
.fifodata(tupf_fifodata)
);
//Channel 0 block
wire [15:0] tdpf_fifodata_0;
wire tdpf_pkt_waiting_0;
wire tdpf_rdreq_0;
wire tdpf_skip_0;
wire tdpf_have_space_0;
wire txstrobe_chan_0;
data_packet_fifo tx_data_packet_fifo_0
( .reset(reset),
.clock(txclk),
.ram_data_in(tx_data_bus),
.write_enable(WR_chan_0),
.ram_data_out(tdpf_fifodata_0),
.pkt_waiting(tdpf_pkt_waiting_0),
.read_enable(tdpf_rdreq_0),
.pkt_complete(chan_0_done),
.skip_packet(tdpf_skip_0),
.have_space(tdpf_have_space_0)
);
strobe_gen strobe_gen_0
( .clock(txclk),
.reset(reset),
.enable(1'b1),
.rate(txstrobe_rate_0),
.strobe_in(txstrobe),
.strobe(txstrobe_chan_0)
);
chan_fifo_reader tx_chan_0_reader (
.reset(reset),
.tx_clock(txclk),
.tx_strobe(txstrobe),
//.tx_strobe(txstrobe_chan_0),
.adc_clock(time_counter),
.samples_format(4'b0),
.tx_q(tx_q_0),
.tx_i(tx_i_0),
.overrun(OR0),
.underrun(UR0),
.skip(tdpf_skip_0),
.rdreq(tdpf_rdreq_0),
.fifodata(tdpf_fifodata_0),
.pkt_waiting(tdpf_pkt_waiting_0)
);
//Channel 1 block
wire [15:0] tdpf_fifodata_1;
wire tdpf_pkt_waiting_1;
wire tdpf_rdreq_1;
wire tdpf_skip_1;
wire tdpf_have_space_1;
wire txstrobe_chan_1;
data_packet_fifo tx_data_packet_fifo_1
( .reset(reset),
.clock(txclk),
.ram_data_in(tx_data_bus),
.write_enable(WR_chan_1),
.ram_data_out(tdpf_fifodata_1),
.pkt_waiting(tdpf_pkt_waiting_1),
.read_enable(tdpf_rdreq_1),
.pkt_complete(chan_1_done),
.skip_packet(tdpf_skip_1),
.have_space(tdpf_have_space_1)
);
strobe_gen strobe_gen_1
( .clock(txclk),
.reset(reset),
.enable(1'b1),
.rate(txstrobe_rate_1),
.strobe_in(txstrobe),
.strobe(txstrobe_chan_1)
);
chan_fifo_reader tx_chan_1_reader (
.reset(reset),
.tx_clock(txclk),
.tx_strobe(txstrobe),
//.tx_strobe(txstrobe_chan_1),
.adc_clock(time_counter),
.samples_format(4'b0),
.tx_q(tx_q_1),
.tx_i(tx_i_1),
.overrun(OR1),
.underrun(UR1),
.skip(tdpf_skip_1),
.rdreq(tdpf_rdreq_1),
.fifodata(tdpf_fifodata_1),
.pkt_waiting(tdpf_pkt_waiting_1)
);
endmodule // tx_buffer