source: PlatformSupport/CustomPeripherals/pcores/w3_ad_bridge_v3_03_a/hdl/verilog/w3_ad_bridge.v

Last change on this file was 5050, checked in by murphpo, 8 years ago

Used TRXIQ to qualify I/Q data; still see difference in I/Q timing in 20 vs 40 mode. For now it's fixed in C by tweaking reg 0x32 when switching bandwidths. Also fixed I/Q typo for RF B.

File size: 4.0 KB
RevLine 
[1878]1module w3_ad_bridge
2(
[5028]3    input sys_clk,
4    output samp_ce,
[1878]5   
[2907]6    // Enable (active-high) for AD_TXCLK output
7    // AD9963 TXCLK pin defaults to output, configured as input via SPI by ad_controller at boot
8    input ad_TXCLK_out_en,
9   
[1878]10    //RF Path A User Ports
[5028]11    output reg [0:11] user_RFA_RXD_I,
12    output reg [0:11] user_RFA_RXD_Q,
[1878]13
14    input [0:11] user_RFA_TXD_I,
15    input [0:11] user_RFA_TXD_Q,
16
17    input user_RFA_TXIQ,
18
19    //RF Path B User Ports
[5028]20    output reg [0:11] user_RFB_RXD_I,
21    output reg [0:11] user_RFB_RXD_Q,
[1878]22
23    input [0:11] user_RFB_TXD_I,
24    input [0:11] user_RFB_TXD_Q,
25
26    input user_RFB_TXIQ,
27
28    //RF Path A AD ports
[5028]29    output reg [0:11] ad_RFA_TXD,
[1878]30    output ad_RFA_TXIQ,
31    output ad_RFA_TXCLK,
32
33    input [0:11] ad_RFA_TRXD,
34    input ad_RFA_TRXIQ,
35    input ad_RFA_TRXCLK,
36
37    //RF Path B AD ports
[5028]38    output reg [0:11] ad_RFB_TXD,
[1878]39    output ad_RFB_TXIQ,
40    output ad_RFB_TXCLK,
41
42    input [0:11] ad_RFB_TRXD,
43    input ad_RFB_TRXIQ,
44    input ad_RFB_TRXCLK
45);
46
47parameter C_FAMILY = "virtex6";
48
[5028]49//Unsued in ref designs - pass through here
[1878]50assign ad_RFA_TXIQ = user_RFA_TXIQ;
51assign ad_RFB_TXIQ = user_RFB_TXIQ;
52
[5028]53reg ad_RFA_TRXCLK_d1, ad_RFA_TRXCLK_d2;
54reg ad_RFB_TRXCLK_d1, ad_RFB_TRXCLK_d2;
[2907]55
[5028]56reg ad_RFA_TRXCLK_pos, ad_RFA_TRXCLK_neg, ad_RFA_TRXCLK_neg_d1;
57reg ad_RFB_TRXCLK_pos, ad_RFB_TRXCLK_neg, ad_RFB_TRXCLK_neg_d1;
[2907]58
[5036]59reg [0:11] user_RFA_TXD_I_d;
60reg [0:11] user_RFA_TXD_Q_d;
61
62reg [0:11] user_RFB_TXD_I_d;
63reg [0:11] user_RFB_TXD_Q_d;
64
65reg [0:11] user_RFA_RXD_I_d, user_RFA_RXD_Q_d;
66reg [0:11] user_RFB_RXD_I_d, user_RFB_RXD_Q_d;
67
[5028]68always @(posedge sys_clk)
69begin
70    ad_RFA_TRXCLK_d1 <= ad_RFA_TRXCLK;
71    ad_RFA_TRXCLK_d2 <= ad_RFA_TRXCLK_d1;
[1878]72
[5028]73    ad_RFB_TRXCLK_d1 <= ad_RFB_TRXCLK;
74    ad_RFB_TRXCLK_d2 <= ad_RFB_TRXCLK_d1;
[2907]75
[5028]76    ad_RFA_TRXCLK_pos <= ad_RFA_TRXCLK_d1 & ~ad_RFA_TRXCLK_d2;
[2907]77
[5028]78    ad_RFB_TRXCLK_pos <= ad_RFB_TRXCLK_d1 & ~ad_RFB_TRXCLK_d2;
79   
80    ad_RFA_TRXCLK_neg <= ~ad_RFA_TRXCLK_d1 & ad_RFA_TRXCLK_d2;
81    ad_RFA_TRXCLK_neg_d1 <= ad_RFA_TRXCLK_neg;
[1878]82
[5028]83    ad_RFB_TRXCLK_neg <= ~ad_RFB_TRXCLK_d1 & ad_RFB_TRXCLK_d2;
84    ad_RFB_TRXCLK_neg_d1 <= ad_RFB_TRXCLK_neg;
85end
[1878]86
[5036]87always @(posedge sys_clk)
88begin
89    if(samp_ce)
90    begin
91        user_RFA_TXD_I_d <= user_RFA_TXD_I;
92        user_RFA_TXD_Q_d <= user_RFA_TXD_Q;
93        user_RFB_TXD_I_d <= user_RFB_TXD_I;
[5050]94        user_RFB_TXD_Q_d <= user_RFB_TXD_Q;
[5036]95
96        user_RFA_RXD_I <= user_RFA_RXD_I_d;
97        user_RFA_RXD_Q <= user_RFA_RXD_Q_d;
98        user_RFB_RXD_I <= user_RFB_RXD_I_d;
99        user_RFB_RXD_Q <= user_RFB_RXD_Q_d;
100    end
101    else
102    begin
103        user_RFA_TXD_I_d <= user_RFA_TXD_I_d;
104        user_RFA_TXD_Q_d <= user_RFA_TXD_Q_d;
105        user_RFB_TXD_I_d <= user_RFB_TXD_I_d;
[5050]106        user_RFB_TXD_Q_d <= user_RFB_TXD_Q_d;
[5036]107
108        user_RFA_RXD_I <= user_RFA_RXD_I;
109        user_RFA_RXD_Q <= user_RFA_RXD_Q;
110        user_RFB_RXD_I <= user_RFB_RXD_I;
111        user_RFB_RXD_Q <= user_RFB_RXD_Q;
112    end
113end
114
[5028]115assign samp_ce = ad_RFA_TRXCLK_neg_d1;
[2907]116
[5028]117wire ad_RFA_TXCLK_o;
118wire ad_RFB_TXCLK_o;
[2907]119
[5036]120assign ad_RFA_TXCLK_o = ~ad_RFA_TRXCLK_d1;
121assign ad_RFB_TXCLK_o = ~ad_RFB_TRXCLK_d1;
[1878]122
[5028]123OBUFT OBUFT_RFA_TXCLK (
124    .I(ad_RFA_TXCLK_o),
125    .T(~ad_TXCLK_out_en),
126    .O(ad_RFA_TXCLK)
[1878]127);
[5028]128OBUFT OBUFT_RFB_TXCLK (
129    .I(ad_RFB_TXCLK_o),
130    .T(~ad_TXCLK_out_en),
131    .O(ad_RFB_TXCLK)
[1878]132);
133
[5036]134
[5028]135always @(posedge sys_clk)
136begin
[5050]137    if(ad_RFA_TRXCLK_pos || ad_RFA_TRXCLK_neg)
138    begin
139        if(ad_RFA_TRXIQ)
140            user_RFA_RXD_I_d <= ad_RFA_TRXD;
141        else
142            user_RFA_RXD_Q_d <= ad_RFA_TRXD;
143    end
144    else
145    begin
146        user_RFA_RXD_I_d <= user_RFA_RXD_I_d;
147        user_RFA_RXD_Q_d <= user_RFA_RXD_Q_d;
148    end
149end
150
151always @(posedge sys_clk)
152begin
[5028]153    if(ad_RFA_TRXCLK_pos)
154    begin
[5036]155        ad_RFA_TXD <= user_RFA_TXD_I_d;
[5028]156    end
[5036]157    else if(ad_RFA_TRXCLK_neg)
[5028]158    begin
[5036]159        ad_RFA_TXD <= user_RFA_TXD_Q_d;
[5028]160    end
[5036]161    else
162    begin
163        ad_RFA_TXD <= ad_RFA_TXD;
164    end
165end
[1878]166
[5036]167always @(posedge sys_clk)
168begin
[5050]169    if(ad_RFB_TRXCLK_pos || ad_RFB_TRXCLK_neg)
170    begin
171        if(ad_RFB_TRXIQ)
172            user_RFB_RXD_I_d <= ad_RFB_TRXD;
173        else
174            user_RFB_RXD_Q_d <= ad_RFB_TRXD;
175    end
176    else
177    begin
178        user_RFB_RXD_I_d <= user_RFB_RXD_I_d;
179        user_RFB_RXD_Q_d <= user_RFB_RXD_Q_d;
180    end
181end
182
183always @(posedge sys_clk)
184begin
[5028]185    if(ad_RFB_TRXCLK_pos)
186    begin
[5036]187        ad_RFB_TXD <= user_RFB_TXD_I_d;
[5028]188    end
[5036]189    else if(ad_RFB_TRXCLK_neg)
[5028]190    begin
[5036]191        ad_RFB_TXD <= user_RFB_TXD_Q_d;
[5028]192    end
[5036]193    else
194    begin
195        ad_RFB_TXD <= ad_RFB_TXD;
196    end
[5028]197end
[1878]198
199endmodule
Note: See TracBrowser for help on using the repository browser.