summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usrp2/control_lib/newfifo/fifo_pacer.v24
-rw-r--r--usrp2/top/u1e/Makefile1
-rw-r--r--usrp2/top/u1e/u1e_core.v57
3 files changed, 48 insertions, 34 deletions
diff --git a/usrp2/control_lib/newfifo/fifo_pacer.v b/usrp2/control_lib/newfifo/fifo_pacer.v
new file mode 100644
index 000000000..1bf03ab6e
--- /dev/null
+++ b/usrp2/control_lib/newfifo/fifo_pacer.v
@@ -0,0 +1,24 @@
+
+
+module fifo_pacer
+ (input clk,
+ input reset,
+ input [7:0] rate,
+ input enable,
+ input src1_rdy_i, output dst1_rdy_o,
+ output src2_rdy_o, input dst2_rdy_i,
+ output underrun, overrun);
+
+ wire strobe;
+
+ cic_strober strober (.clock(clk), .reset(reset), .enable(enable),
+ .rate(rate), .strobe_fast(1), .strobe_slow(strobe));
+
+ wire all_ready = src1_rdy_i & dst2_rdy_i;
+ assign dst1_rdy_o = all_ready & strobe;
+ assign src2_rdy_o = dst1_rdy_o;
+
+ assign underrun = strobe & ~src1_rdy_i;
+ assign overrun = strobe & ~dst2_rdy_i;
+
+endmodule // fifo_pacer
diff --git a/usrp2/top/u1e/Makefile b/usrp2/top/u1e/Makefile
index 8622b8480..0277ef4f2 100644
--- a/usrp2/top/u1e/Makefile
+++ b/usrp2/top/u1e/Makefile
@@ -115,6 +115,7 @@ control_lib/newfifo/packet_generator.v \
control_lib/newfifo/packet_verifier.v \
control_lib/newfifo/packet_generator32.v \
control_lib/newfifo/packet_verifier32.v \
+control_lib/newfifo/fifo_pacer.v \
control_lib/longfifo.v \
control_lib/shortfifo.v \
control_lib/medfifo.v \
diff --git a/usrp2/top/u1e/u1e_core.v b/usrp2/top/u1e/u1e_core.v
index 903121832..21ac97dbd 100644
--- a/usrp2/top/u1e/u1e_core.v
+++ b/usrp2/top/u1e/u1e_core.v
@@ -1,8 +1,7 @@
//`define LOOPBACK 1
-//`define TIMED 1
-`define CRC 1
+`define TIMED 1
module u1e_core
(input clk_fpga, input rst_fpga,
@@ -80,45 +79,35 @@ module u1e_core
wire [7:0] rate;
// TX side
- wire tx_enable;
- cic_strober tx_strober (.clock(wb_clk), .reset(wb_rst), .enable(tx_enable),
- .rate(rate), .strobe_fast(1), .strobe_slow(tx_dst_rdy));
-
- // RX side
- wire rx_enable;
- reg [15:0] ctr;
- wire [15:0] rx_pkt_len = 480;
- wire rx_eof = (ctr == rx_pkt_len);
- wire rx_sof = (ctr == 0);
+ wire tx_enable, tx_src_rdy_int, tx_dst_rdy_int;
- cic_strober rx_strober (.clock(wb_clk), .reset(wb_rst), .enable(rx_enable),
- .rate(rate), .strobe_fast(1), .strobe_slow(rx_src_rdy));
+ fifo_pacer tx_pacer
+ (.clk(wb_clk), .reset(wb_rst), .rate(rate), .enable(tx_enable),
+ .src1_rdy_i(tx_src_rdy), .dst1_rdy_o(tx_dst_rdy),
+ .src2_rdy_o(tx_src_rdy_int), .dst2_rdy_i(tx_dst_rdy_int),
+ .underrun(tx_underrun), .overrun());
- always @(posedge wb_clk)
- if(wb_rst)
- ctr <= 0;
- else if(rx_dst_rdy & rx_src_rdy)
- if(ctr == rx_pkt_len)
- ctr <= 0;
- else
- ctr <= ctr + 1;
-
- assign rx_data = {2'b00,rx_eof,rx_sof,~ctr,ctr};
-`endif // TIMED
-
-`ifdef CRC
- packet_generator32 pktgen32
- (.clk(wb_clk), .reset(wb_rst), .clear(clear),
- .data_o(rx_data), .src_rdy_o(rx_src_rdy), .dst_rdy_i(rx_dst_rdy));
-
packet_verifier32 pktver32
(.clk(wb_clk), .reset(wb_rst), .clear(clear),
- .data_i(tx_data), .src_rdy_i(tx_src_rdy), .dst_rdy_o(tx_dst_rdy),
+ .data_i(tx_data), .src_rdy_i(tx_src_rdy_int), .dst_rdy_o(tx_dst_rdy_int),
.total(total), .crc_err(crc_err), .seq_err(seq_err), .len_err(len_err));
+ // RX side
+ wire rx_enable, rx_src_rdy_int, rx_dst_rdy_int;
wire rx_sof = rx_data[32];
wire rx_eof = rx_data[33];
-`endif // CRC
+
+ packet_generator32 pktgen32
+ (.clk(wb_clk), .reset(wb_rst), .clear(clear),
+ .data_o(rx_data), .src_rdy_o(rx_src_rdy_int), .dst_rdy_i(rx_dst_rdy_int));
+
+ fifo_pacer rx_pacer
+ (.clk(wb_clk), .reset(wb_rst), .rate(rate), .enable(rx_enable),
+ .src1_rdy_i(rx_src_rdy_int), .dst1_rdy_o(rx_dst_rdy_int),
+ .src2_rdy_o(rx_src_rdy), .dst2_rdy_i(rx_dst_rdy),
+ .underrun(), .overrun(rx_overrun));
+
+`endif // `ifdef TIMED
// /////////////////////////////////////////////////////////////////////////////////////
// Wishbone Intercon, single master
@@ -233,7 +222,7 @@ module u1e_core
assign { debug_led[2],debug_led[0],debug_led[1] } = reg_leds; // LEDs are arranged funny on board
assign { cgen_sync_b, cgen_ref_sel } = reg_cgen_ctrl;
- assign { rx_overrun, tx_underrun } = 0; // reg_test;
+ //assign { rx_overrun, tx_underrun } = 0; // reg_test;
assign s0_dat_miso = (s0_adr[6:0] == REG_LEDS) ? reg_leds :
(s0_adr[6:0] == REG_SWITCHES) ? {5'b0,debug_pb[2:0],dip_sw[7:0]} :