1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
module cat_io_lvds
#(
parameter INVERT_FRAME_RX = 0,
parameter INVERT_DATA_RX = 6'b00_0000,
parameter INVERT_FRAME_TX = 0,
parameter INVERT_DATA_TX = 6'b00_0000,
parameter INPUT_CLOCK_DELAY = 16,
parameter INPUT_DATA_DELAY = 0,
parameter OUTPUT_CLOCK_DELAY = 16,
parameter OUTPUT_DATA_DELAY = 0
)
(input rst,
input mimo,
input clk200,
// Delay Control Interface
input ctrl_clk,
input [4:0] ctrl_data_delay,
input [4:0] ctrl_clk_delay,
input ctrl_ld_data_delay,
input ctrl_ld_clk_delay,
// Baseband sample interface
output radio_clk,
output radio_clk_2x,
output [11:0] rx_i0,
output [11:0] rx_q0,
output [11:0] rx_i1,
output [11:0] rx_q1,
input [11:0] tx_i0,
input [11:0] tx_q0,
input [11:0] tx_i1,
input [11:0] tx_q1,
// Catalina interface
input rx_clk_p,
input rx_clk_n,
input rx_frame_p,
input rx_frame_n,
input [5:0] rx_d_p,
input [5:0] rx_d_n,
output tx_clk_p,
output tx_clk_n,
output tx_frame_p,
output tx_frame_n,
output [5:0] tx_d_p,
output [5:0] tx_d_n
);
wire sdr_clk, ddr_clk;
//------------------------------------------------------------------
// AD9361 Datasheet page 7:
// DATA_CLK to DataBusOut (Tddrx): Min 0.25ns, Max 1.25nS
//
//------------------------------------------------------------------
cat_input_lvds
#(
.INVERT_FRAME_RX(INVERT_FRAME_RX),
.INVERT_DATA_RX(INVERT_DATA_RX),
.CLOCK_DELAY(INPUT_CLOCK_DELAY),
.DATA_DELAY(INPUT_DATA_DELAY),
.WIDTH(6),
.GROUP("CATALINA")
)
cat_input_lvds_i0
(
.clk200(clk200),
.rst(rst),
.mimo(mimo),
// Region local Clocks for I/O cells.
.ddr_clk(ddr_clk),
.sdr_clk(sdr_clk),
// Source Synchronous external input clock
.ddr_clk_p(rx_clk_p),
.ddr_clk_n(rx_clk_n),
// Source Synchronous data lines
.ddr_data_p(rx_d_p),
.ddr_data_n(rx_d_n),
.ddr_frame_p(rx_frame_p),
.ddr_frame_n(rx_frame_n),
// delay control interface
.ctrl_clk(ctrl_clk),
.ctrl_data_delay(ctrl_data_delay),
.ctrl_clk_delay(ctrl_clk_delay),
.ctrl_ld_data_delay(ctrl_ld_data_delay),
.ctrl_ld_clk_delay(ctrl_ld_clk_delay),
// SDR output clock(s)
.radio_clk(radio_clk),
.radio_clk_2x(radio_clk_2x),
// SDR Data buses
.i0(rx_i0),
.q0(rx_q0),
.i1(rx_i1),
.q1(rx_q1),
.rx_aligned()
);
//------------------------------------------------------------------
// AD9361 Interface Specification, page 22.
// FBCLK is approximately data centered, must provide 1ns data setup and hold
// when signals arrive at AD9361.
// Therefore we delay FBCLK more than data to give 1nS setup:
// 1 tap = 72pS. 1000/72 = ~14. Set delay at 16 taps.
//------------------------------------------------------------------
cat_output_lvds
#(
.INVERT_FRAME_TX(INVERT_FRAME_TX),
.INVERT_DATA_TX(INVERT_DATA_TX),
.CLOCK_DELAY(OUTPUT_CLOCK_DELAY),
.DATA_DELAY(OUTPUT_DATA_DELAY),
.WIDTH(6),
.GROUP("CATALINA")
)
cat_output_lvds_i0
(
.clk200(clk200),
.rst(rst),
.mimo(mimo),
// Region local Clocks for I/O cells.
.ddr_clk(ddr_clk),
.sdr_clk(sdr_clk),
// Source Synchronous external input clock
.ddr_clk_p(tx_clk_p),
.ddr_clk_n(tx_clk_n),
// Source Synchronous data lines
.ddr_data_p(tx_d_p),
.ddr_data_n(tx_d_n),
.ddr_frame_p(tx_frame_p),
.ddr_frame_n(tx_frame_n),
// delay control interface
/* -----\/----- EXCLUDED -----\/-----
.ctrl_clk(1'b0),
.ctrl_rst(1'b0),
.ctrl_en(1'b0),
.ctrl_inc(1'b0),
-----/\----- EXCLUDED -----/\----- */
// SDR global input clock
.radio_clk(radio_clk),
// SDR Data buses
.i0(tx_i0),
.q0(tx_q0),
.i1(tx_i1),
.q1(tx_q1)
);
endmodule // cat_int_ddr_lvds
|