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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
|
//
// Copyright 2016 Ettus Research, A National Instruments Company
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
// Module: cat_io_lvds
//
// Description:
//
// This is an LVDS interface for the AD9361 (Catalina). It consists of of an
// input module for Rx and an output module for Tx. See the AD9361 Interface
// Specification and the AD9361 data sheet for details.
//
// This module assumes a dual-port, full-duplex topology, in 2R2T timing mode.
// The mimo signal allows you to support one (mimo = 0) or two channels (mimo =
// 1). When mimo = 0, the data from one channel is simply ignored and radio_clk
// frequency remains equal to rx_clk_p / 4.
//
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 USE_CLOCK_IDELAY = 1,
parameter USE_DATA_IDELAY = 1,
parameter DATA_IDELAY_MODE = "VAR_LOAD",
parameter CLOCK_IDELAY_MODE = "VAR_LOAD",
parameter INPUT_CLOCK_DELAY = 16,
parameter INPUT_DATA_DELAY = 0,
parameter USE_CLOCK_ODELAY = 0,
parameter USE_DATA_ODELAY = 0,
parameter DATA_ODELAY_MODE = "VAR_LOAD",
parameter CLOCK_ODELAY_MODE = "VAR_LOAD",
parameter OUTPUT_CLOCK_DELAY = 16,
parameter OUTPUT_DATA_DELAY = 0,
parameter USE_BUFG = 1
) (
input rst,
input clk200,
// Data and frame timing (synchronous to radio_clk)
input mimo,
input frame_sample,
// Delay Control Interface
input ctrl_clk,
input [4:0] ctrl_in_data_delay,
input [4:0] ctrl_in_clk_delay,
input ctrl_ld_in_data_delay,
input ctrl_ld_in_clk_delay,
input [4:0] ctrl_out_data_delay,
input [4:0] ctrl_out_clk_delay,
input ctrl_ld_out_data_delay,
input ctrl_ld_out_clk_delay,
// Baseband sample interface
output radio_clk,
output radio_clk_2x,
output rx_aligned,
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 LVDS 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;
//---------------------------------------------------------------------------
// Input (Rx) Interface
//---------------------------------------------------------------------------
cat_input_lvds #(
.INVERT_FRAME_RX (INVERT_FRAME_RX),
.INVERT_DATA_RX (INVERT_DATA_RX),
.USE_CLOCK_DELAY (USE_CLOCK_IDELAY),
.USE_DATA_DELAY (USE_DATA_IDELAY),
.CLOCK_DELAY_MODE (CLOCK_IDELAY_MODE),
.DATA_DELAY_MODE (DATA_IDELAY_MODE),
.CLOCK_DELAY (INPUT_CLOCK_DELAY),
.DATA_DELAY (INPUT_DATA_DELAY),
.WIDTH (6),
.GROUP ("CATALINA"),
.USE_BUFG (USE_BUFG)
) cat_input_lvds_i0 (
.clk200 (clk200),
.rst (rst),
// Data and frame timing
.mimo (mimo),
.frame_sample (frame_sample),
// 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_in_data_delay),
.ctrl_clk_delay (ctrl_in_clk_delay),
.ctrl_ld_data_delay (ctrl_ld_in_data_delay),
.ctrl_ld_clk_delay (ctrl_ld_in_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 (rx_aligned)
);
//---------------------------------------------------------------------------
// Output (Tx) Interface
//---------------------------------------------------------------------------
cat_output_lvds #(
.INVERT_FRAME_TX (INVERT_FRAME_TX),
.INVERT_DATA_TX (INVERT_DATA_TX),
.USE_CLOCK_DELAY (USE_CLOCK_ODELAY),
.USE_DATA_DELAY (USE_DATA_ODELAY),
.CLOCK_DELAY_MODE (CLOCK_ODELAY_MODE),
.DATA_DELAY_MODE (DATA_ODELAY_MODE),
.CLOCK_DELAY (OUTPUT_CLOCK_DELAY),
.DATA_DELAY (OUTPUT_DATA_DELAY),
.WIDTH (6),
.GROUP ("CATALINA")
) cat_output_lvds_i0 (
.clk200 (clk200),
.rst (rst),
// Two samples per frame period (frame_sample=0; e.g., for two-channel
// mode) or one sample per frame (frame_sample=1)
.frame_sample(frame_sample),
// 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
.ctrl_clk (ctrl_clk),
.ctrl_data_delay (ctrl_out_data_delay),
.ctrl_clk_delay (ctrl_out_clk_delay),
.ctrl_ld_data_delay (ctrl_ld_out_data_delay),
.ctrl_ld_clk_delay (ctrl_ld_out_clk_delay),
// 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_io_lvds
|