add duifei_online_acq_par

完成对飞并行捕获程序的编写,仿真和测试,能够正常采集数据
This commit is contained in:
2023-05-09 20:52:09 +08:00
parent 2d4650a3b6
commit 866b718eb3
1097 changed files with 236686 additions and 0 deletions
@@ -0,0 +1,188 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 11:51:06 06/08/2020
// Design Name:
// Module Name: test_784TR_top
// Project Name:
// Target Devices:
// Tool versions:
// Description:
// ??????9?byte? ?1-8?????????????????8???????????????????3?byte???5?don't care??
// ?9byte??4bit??spi??4bit??????
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
/*************?????????*******************/
module adf4351_2(
input i_sysclk ,
input i_arstn ,
output o_cfgover ,
output o_ADF4351_SCK ,
output o_ADF4351_DATA ,
output o_ADF4351_LE ,
output o_ADF4351_CE ,
output o_ADF4351_mutel ,
input i_ADF4351_locked
);
localparam DATA_WIDTH = 32;
localparam DATA_LENTH = 6;
localparam SYS_CLOCK = 10;
localparam LOCK_PIRED = SYS_CLOCK * 100000;
localparam rst_time = 16'h7fff;//16'h7fff
reg[7:0] cnt_word = 8'd0;
reg[5:0] cnt_bits = 6'd0;
reg [DATA_WIDTH-1:0] cfgdata = 0;
wire [DATA_WIDTH-1:0] regdata;
reg cfgover = 1'b0 ;
reg pll_locked = 1'b0 ;
reg load_en = 1'b0 ;
reg [31:0] cnt_lock = 32'b0;
(* KEEP = "TRUE" *)reg[3:0] cfgstate = 4'b0000;
wire spiIdle;
reg spi_sdi = 1'b0,spi_csb = 1'b1 ;
assign o_cfgover = cfgover ;
assign o_ADF4351_LE = load_en ;
assign o_ADF4351_mutel= 1'b1 ;
assign o_ADF4351_SCK = o_ADF4351_CE ? 1'b0 : i_sysclk ;
assign o_ADF4351_CE = spi_csb ;
assign o_ADF4351_DATA = spi_sdi ;
reg [DATA_WIDTH-1:0] CFGREG0 ;
assign regdata = CFGREG0 ;
reg cfg_start ;
reg [15:0] counter0 ;
always@ (posedge i_sysclk)
if(~i_arstn)
CFGREG0 <= 32'b0;
else begin
//RFout = Fpfd*(INT + (Frac/Mod)) Fpfd = Refin*[(1+D)/(R*(1+T))]
case (cnt_word)
8'h00: CFGREG0 <= {32'h580005}; //reg 5
8'h01: CFGREG0 <= {32'h85003C}; //reg 4
8'h02: CFGREG0 <= {32'h4B3}; //reg 3
8'h03: CFGREG0 <= {32'h28F42}; //reg 2 {5'b0,T,R,D,12'h,reg2} R = 1 D = 1 T = 1
8'h04: CFGREG0 <= {32'h8008011}; //reg 1 {3'd0,phase adjust,prescaler,phase value,Frac,reg1}mod = 25
8'h05: CFGREG0 <= {32'hC80000}; //reg 0 {1'b0,int,frac,reg0} int = 52 frac= 8
default : CFGREG0 <= 32'b0;
endcase
end
always@(negedge i_sysclk)begin
if(~i_arstn)begin
cfgdata <= 0;
cnt_word <= 8'd0;
cnt_bits <= 6'd0;
cfgover <= 1'b0;
cfgstate <= 4'd0;
spi_csb <= 1'b1;
load_en <= 1'b1;
spi_sdi <= 1'b0;
end
else begin
case(cfgstate)
4'd0:begin
if(cfg_start)begin
cfgstate <= 4'd1;
end
else begin
spi_csb <= 1'b1;
load_en <= 1'b0;
spi_sdi <= 1'b0;
cfgover <= 1'b0;
cfgstate <= 4'd0;
end
end
4'd1:begin
cfgdata <= regdata;
cnt_lock <= 32'd0;
cnt_bits <= 6'd0;
cfgstate <= cfgstate + 1'b1;
end
4'd2:begin
spi_csb <= 1'b0;
load_en <= 1'b0;
spi_sdi <= cfgdata[DATA_WIDTH-1];
cfgdata <= cfgdata << 1'b1;
cnt_bits <= cnt_bits + 1'b1;
if(cnt_bits == DATA_WIDTH-1)begin
cfgstate <= cfgstate + 1'b1;
cnt_word <= cnt_word + 1'b1;
end
end
4'd3:begin
spi_csb <= 1'b1;
load_en <= 1'b1;
spi_sdi <= 1'b0;
if(cnt_word == DATA_LENTH)
cfgstate <= cfgstate + 1'b1;
else
cfgstate <= 4'd0;
end
4'd4:begin
cfgstate <= 4'd5;
spi_csb <= 1'b1;
load_en <= 1'b0;
spi_sdi <= 1'b0;
end
4'd5:begin//ftw cfg
if(cnt_lock > LOCK_PIRED)
begin
pll_locked <= i_ADF4351_locked;
cnt_lock <= cnt_lock;
if( (pll_locked == 1'b0) && (cnt_lock > LOCK_PIRED))
begin
cfgstate <= 4'd1;
cnt_word <= 8'd0;
end
else
begin
cfgstate <= 4'd5;
spi_csb <= 1'b1;
spi_sdi <= 1'b0;
cfgover <= 1'b1;
end
end
else
begin
cnt_lock <= cnt_lock + 1'b1;
end
end
default:cfgstate <= 4'd0;
endcase
end
end
always@(negedge i_sysclk)begin
if(~i_arstn)begin
counter0 <= 16'd0;
cfg_start <= 1'b0;
end
else begin
if(counter0 == rst_time)begin//16'h7fff
counter0 <= counter0;
cfg_start <= 1'b1;
end
else begin
counter0 <= counter0 + 1'b1;
cfg_start <= 1'b0;
end
end
end
endmodule
@@ -0,0 +1,441 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 14:37:16 01/15/2022
// Design Name:
// Module Name: FRAC1
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module FRAC1(
input clka,
input [15:0] addra,
output reg[24:0] douta
);
reg[11:0] addr=0;
always@(posedge clka)begin
addr<= (addra+375) % 400 ;
end
always@(posedge clka)begin
case(addr)
0 : douta <= 0 ;
1 : douta <= 83886 ;
2 : douta <= 167772 ;
3 : douta <= 251658 ;
4 : douta <= 335544 ;
5 : douta <= 419430 ;
6 : douta <= 503316 ;
7 : douta <= 587202 ;
8 : douta <= 671088 ;
9 : douta <= 754974 ;
10 : douta <= 838860 ;
11 : douta <= 922746 ;
12 : douta <= 1006632 ;
13 : douta <= 1090519 ;
14 : douta <= 1174405 ;
15 : douta <= 1258291 ;
16 : douta <= 1342177 ;
17 : douta <= 1426063 ;
18 : douta <= 1509949 ;
19 : douta <= 1593835 ;
20 : douta <= 1677721 ;
21 : douta <= 1761607 ;
22 : douta <= 1845493 ;
23 : douta <= 1929379 ;
24 : douta <= 2013265 ;
25 : douta <= 2097152 ;
26 : douta <= 2181038 ;
27 : douta <= 2264924 ;
28 : douta <= 2348810 ;
29 : douta <= 2432696 ;
30 : douta <= 2516582 ;
31 : douta <= 2600468 ;
32 : douta <= 2684354 ;
33 : douta <= 2768240 ;
34 : douta <= 2852126 ;
35 : douta <= 2936012 ;
36 : douta <= 3019898 ;
37 : douta <= 3103784 ;
38 : douta <= 3187671 ;
39 : douta <= 3271557 ;
40 : douta <= 3355443 ;
41 : douta <= 3439329 ;
42 : douta <= 3523215 ;
43 : douta <= 3607101 ;
44 : douta <= 3690987 ;
45 : douta <= 3774873 ;
46 : douta <= 3858759 ;
47 : douta <= 3942645 ;
48 : douta <= 4026531 ;
49 : douta <= 4110417 ;
50 : douta <= 4194304 ;
51 : douta <= 4278190 ;
52 : douta <= 4362076 ;
53 : douta <= 4445962 ;
54 : douta <= 4529848 ;
55 : douta <= 4613734 ;
56 : douta <= 4697620 ;
57 : douta <= 4781506 ;
58 : douta <= 4865392 ;
59 : douta <= 4949278 ;
60 : douta <= 5033164 ;
61 : douta <= 5117050 ;
62 : douta <= 5200936 ;
63 : douta <= 5284823 ;
64 : douta <= 5368709 ;
65 : douta <= 5452595 ;
66 : douta <= 5536481 ;
67 : douta <= 5620367 ;
68 : douta <= 5704253 ;
69 : douta <= 5788139 ;
70 : douta <= 5872025 ;
71 : douta <= 5955911 ;
72 : douta <= 6039797 ;
73 : douta <= 6123683 ;
74 : douta <= 6207569 ;
75 : douta <= 6291456 ;
76 : douta <= 6375342 ;
77 : douta <= 6459228 ;
78 : douta <= 6543114 ;
79 : douta <= 6627000 ;
80 : douta <= 6710886 ;
81 : douta <= 6794772 ;
82 : douta <= 6878658 ;
83 : douta <= 6962544 ;
84 : douta <= 7046430 ;
85 : douta <= 7130316 ;
86 : douta <= 7214202 ;
87 : douta <= 7298088 ;
88 : douta <= 7381975 ;
89 : douta <= 7465861 ;
90 : douta <= 7549747 ;
91 : douta <= 7633633 ;
92 : douta <= 7717519 ;
93 : douta <= 7801405 ;
94 : douta <= 7885291 ;
95 : douta <= 7969177 ;
96 : douta <= 8053063 ;
97 : douta <= 8136949 ;
98 : douta <= 8220835 ;
99 : douta <= 8304721 ;
100 : douta <= 8388608 ;
101 : douta <= 8472494 ;
102 : douta <= 8556380 ;
103 : douta <= 8640266 ;
104 : douta <= 8724152 ;
105 : douta <= 8808038 ;
106 : douta <= 8891924 ;
107 : douta <= 8975810 ;
108 : douta <= 9059696 ;
109 : douta <= 9143582 ;
110 : douta <= 9227468 ;
111 : douta <= 9311354 ;
112 : douta <= 9395240 ;
113 : douta <= 9479127 ;
114 : douta <= 9563013 ;
115 : douta <= 9646899 ;
116 : douta <= 9730785 ;
117 : douta <= 9814671 ;
118 : douta <= 9898557 ;
119 : douta <= 9982443 ;
120 : douta <= 10066329 ;
121 : douta <= 10150215 ;
122 : douta <= 10234101 ;
123 : douta <= 10317987 ;
124 : douta <= 10401873 ;
125 : douta <= 10485760 ;
126 : douta <= 10569646 ;
127 : douta <= 10653532 ;
128 : douta <= 10737418 ;
129 : douta <= 10821304 ;
130 : douta <= 10905190 ;
131 : douta <= 10989076 ;
132 : douta <= 11072962 ;
133 : douta <= 11156848 ;
134 : douta <= 11240734 ;
135 : douta <= 11324620 ;
136 : douta <= 11408506 ;
137 : douta <= 11492392 ;
138 : douta <= 11576279 ;
139 : douta <= 11660165 ;
140 : douta <= 11744051 ;
141 : douta <= 11827937 ;
142 : douta <= 11911823 ;
143 : douta <= 11995709 ;
144 : douta <= 12079595 ;
145 : douta <= 12163481 ;
146 : douta <= 12247367 ;
147 : douta <= 12331253 ;
148 : douta <= 12415139 ;
149 : douta <= 12499025 ;
150 : douta <= 12582912 ;
151 : douta <= 12666798 ;
152 : douta <= 12750684 ;
153 : douta <= 12834570 ;
154 : douta <= 12918456 ;
155 : douta <= 13002342 ;
156 : douta <= 13086228 ;
157 : douta <= 13170114 ;
158 : douta <= 13254000 ;
159 : douta <= 13337886 ;
160 : douta <= 13421772 ;
161 : douta <= 13505658 ;
162 : douta <= 13589544 ;
163 : douta <= 13673431 ;
164 : douta <= 13757317 ;
165 : douta <= 13841203 ;
166 : douta <= 13925089 ;
167 : douta <= 14008975 ;
168 : douta <= 14092861 ;
169 : douta <= 14176747 ;
170 : douta <= 14260633 ;
171 : douta <= 14344519 ;
172 : douta <= 14428405 ;
173 : douta <= 14512291 ;
174 : douta <= 14596177 ;
175 : douta <= 14680064 ;
176 : douta <= 14763950 ;
177 : douta <= 14847836 ;
178 : douta <= 14931722 ;
179 : douta <= 15015608 ;
180 : douta <= 15099494 ;
181 : douta <= 15183380 ;
182 : douta <= 15267266 ;
183 : douta <= 15351152 ;
184 : douta <= 15435038 ;
185 : douta <= 15518924 ;
186 : douta <= 15602810 ;
187 : douta <= 15686696 ;
188 : douta <= 15770583 ;
189 : douta <= 15854469 ;
190 : douta <= 15938355 ;
191 : douta <= 16022241 ;
192 : douta <= 16106127 ;
193 : douta <= 16190013 ;
194 : douta <= 16273899 ;
195 : douta <= 16357785 ;
196 : douta <= 16441671 ;
197 : douta <= 16525557 ;
198 : douta <= 16609443 ;
199 : douta <= 16693329 ;
200 : douta <= 16777216 ;
201 : douta <= 16861102 ;
202 : douta <= 16944988 ;
203 : douta <= 17028874 ;
204 : douta <= 17112760 ;
205 : douta <= 17196646 ;
206 : douta <= 17280532 ;
207 : douta <= 17364418 ;
208 : douta <= 17448304 ;
209 : douta <= 17532190 ;
210 : douta <= 17616076 ;
211 : douta <= 17699962 ;
212 : douta <= 17783848 ;
213 : douta <= 17867735 ;
214 : douta <= 17951621 ;
215 : douta <= 18035507 ;
216 : douta <= 18119393 ;
217 : douta <= 18203279 ;
218 : douta <= 18287165 ;
219 : douta <= 18371051 ;
220 : douta <= 18454937 ;
221 : douta <= 18538823 ;
222 : douta <= 18622709 ;
223 : douta <= 18706595 ;
224 : douta <= 18790481 ;
225 : douta <= 18874368 ;
226 : douta <= 18958254 ;
227 : douta <= 19042140 ;
228 : douta <= 19126026 ;
229 : douta <= 19209912 ;
230 : douta <= 19293798 ;
231 : douta <= 19377684 ;
232 : douta <= 19461570 ;
233 : douta <= 19545456 ;
234 : douta <= 19629342 ;
235 : douta <= 19713228 ;
236 : douta <= 19797114 ;
237 : douta <= 19881000 ;
238 : douta <= 19964887 ;
239 : douta <= 20048773 ;
240 : douta <= 20132659 ;
241 : douta <= 20216545 ;
242 : douta <= 20300431 ;
243 : douta <= 20384317 ;
244 : douta <= 20468203 ;
245 : douta <= 20552089 ;
246 : douta <= 20635975 ;
247 : douta <= 20719861 ;
248 : douta <= 20803747 ;
249 : douta <= 20887633 ;
250 : douta <= 20971520 ;
251 : douta <= 21055406 ;
252 : douta <= 21139292 ;
253 : douta <= 21223178 ;
254 : douta <= 21307064 ;
255 : douta <= 21390950 ;
256 : douta <= 21474836 ;
257 : douta <= 21558722 ;
258 : douta <= 21642608 ;
259 : douta <= 21726494 ;
260 : douta <= 21810380 ;
261 : douta <= 21894266 ;
262 : douta <= 21978152 ;
263 : douta <= 22062039 ;
264 : douta <= 22145925 ;
265 : douta <= 22229811 ;
266 : douta <= 22313697 ;
267 : douta <= 22397583 ;
268 : douta <= 22481469 ;
269 : douta <= 22565355 ;
270 : douta <= 22649241 ;
271 : douta <= 22733127 ;
272 : douta <= 22817013 ;
273 : douta <= 22900899 ;
274 : douta <= 22984785 ;
275 : douta <= 23068672 ;
276 : douta <= 23152558 ;
277 : douta <= 23236444 ;
278 : douta <= 23320330 ;
279 : douta <= 23404216 ;
280 : douta <= 23488102 ;
281 : douta <= 23571988 ;
282 : douta <= 23655874 ;
283 : douta <= 23739760 ;
284 : douta <= 23823646 ;
285 : douta <= 23907532 ;
286 : douta <= 23991418 ;
287 : douta <= 24075304 ;
288 : douta <= 24159191 ;
289 : douta <= 24243077 ;
290 : douta <= 24326963 ;
291 : douta <= 24410849 ;
292 : douta <= 24494735 ;
293 : douta <= 24578621 ;
294 : douta <= 24662507 ;
295 : douta <= 24746393 ;
296 : douta <= 24830279 ;
297 : douta <= 24914165 ;
298 : douta <= 24998051 ;
299 : douta <= 25081937 ;
300 : douta <= 25165824 ;
301 : douta <= 25249710 ;
302 : douta <= 25333596 ;
303 : douta <= 25417482 ;
304 : douta <= 25501368 ;
305 : douta <= 25585254 ;
306 : douta <= 25669140 ;
307 : douta <= 25753026 ;
308 : douta <= 25836912 ;
309 : douta <= 25920798 ;
310 : douta <= 26004684 ;
311 : douta <= 26088570 ;
312 : douta <= 26172456 ;
313 : douta <= 26256343 ;
314 : douta <= 26340229 ;
315 : douta <= 26424115 ;
316 : douta <= 26508001 ;
317 : douta <= 26591887 ;
318 : douta <= 26675773 ;
319 : douta <= 26759659 ;
320 : douta <= 26843545 ;
321 : douta <= 26927431 ;
322 : douta <= 27011317 ;
323 : douta <= 27095203 ;
324 : douta <= 27179089 ;
325 : douta <= 27262976 ;
326 : douta <= 27346862 ;
327 : douta <= 27430748 ;
328 : douta <= 27514634 ;
329 : douta <= 27598520 ;
330 : douta <= 27682406 ;
331 : douta <= 27766292 ;
332 : douta <= 27850178 ;
333 : douta <= 27934064 ;
334 : douta <= 28017950 ;
335 : douta <= 28101836 ;
336 : douta <= 28185722 ;
337 : douta <= 28269608 ;
338 : douta <= 28353495 ;
339 : douta <= 28437381 ;
340 : douta <= 28521267 ;
341 : douta <= 28605153 ;
342 : douta <= 28689039 ;
343 : douta <= 28772925 ;
344 : douta <= 28856811 ;
345 : douta <= 28940697 ;
346 : douta <= 29024583 ;
347 : douta <= 29108469 ;
348 : douta <= 29192355 ;
349 : douta <= 29276241 ;
350 : douta <= 29360128 ;
351 : douta <= 29444014 ;
352 : douta <= 29527900 ;
353 : douta <= 29611786 ;
354 : douta <= 29695672 ;
355 : douta <= 29779558 ;
356 : douta <= 29863444 ;
357 : douta <= 29947330 ;
358 : douta <= 30031216 ;
359 : douta <= 30115102 ;
360 : douta <= 30198988 ;
361 : douta <= 30282874 ;
362 : douta <= 30366760 ;
363 : douta <= 30450647 ;
364 : douta <= 30534533 ;
365 : douta <= 30618419 ;
366 : douta <= 30702305 ;
367 : douta <= 30786191 ;
368 : douta <= 30870077 ;
369 : douta <= 30953963 ;
370 : douta <= 31037849 ;
371 : douta <= 31121735 ;
372 : douta <= 31205621 ;
373 : douta <= 31289507 ;
374 : douta <= 31373393 ;
375 : douta <= 31457280 ;
376 : douta <= 31541166 ;
377 : douta <= 31625052 ;
378 : douta <= 31708938 ;
379 : douta <= 31792824 ;
380 : douta <= 31876710 ;
381 : douta <= 31960596 ;
382 : douta <= 32044482 ;
383 : douta <= 32128368 ;
384 : douta <= 32212254 ;
385 : douta <= 32296140 ;
386 : douta <= 32380026 ;
387 : douta <= 32463912 ;
388 : douta <= 32547799 ;
389 : douta <= 32631685 ;
390 : douta <= 32715571 ;
391 : douta <= 32799457 ;
392 : douta <= 32883343 ;
393 : douta <= 32967229 ;
394 : douta <= 33051115 ;
395 : douta <= 33135001 ;
396 : douta <= 33218887 ;
397 : douta <= 33302773 ;
398 : douta <= 33386659 ;
399 : douta <= 33470545 ;
default : douta <= douta ;
endcase
end
endmodule
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,348 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 17:05:24 04/08/2022
// Design Name:
// Module Name: R_CAL
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module R_CAL_1(
input i_clk ,
input i_rstn ,
input signed[7:0] i_temp ,
input [15:0] fre_mode ,
output reg[3:0] R_CAL
);
//接收通道1
always@(posedge i_clk,negedge i_rstn)begin //1dB 步进
if(!i_rstn)
R_CAL<='d0;
else if(i_temp>=8'sd70)begin//高温校准接收通道1
case(fre_mode)
0 : R_CAL<= 7 ; //20375 ~ 20414
1 : R_CAL<= 7 ; //20415 ~ 20454
2 : R_CAL<= 7 ; //20455 ~ 20494
3 : R_CAL<= 6 ; //20495 ~ 20534
4 : R_CAL<= 6 ; //20535 ~ 20574
5 : R_CAL<= 6 ; //20575 ~ 20614
6 : R_CAL<= 6 ; //20615 ~ 20654
7 : R_CAL<= 6 ; //20655 ~ 20694
8 : R_CAL<= 5 ; //20695 ~ 20734
9 : R_CAL<= 5 ; //20735 ~ 20774
10: R_CAL<= 6 ; //20775 ~ 20814
11: R_CAL<= 6 ; //20815 ~ 20854
12: R_CAL<= 6 ; //20855 ~ 20894
13: R_CAL<= 6 ; //20895 ~ 20934
14: R_CAL<= 6 ; //20935 ~ 20974
15: R_CAL<= 6 ; //20975 ~ 21014
16: R_CAL<= 6 ; //21015 ~ 21054
17: R_CAL<= 6 ; //21055 ~ 21094
18: R_CAL<= 6 ; //21095 ~ 21134
19: R_CAL<= 7 ; //21135 ~ 21174
20: R_CAL<= 7 ; //21175 ~ 21214
21: R_CAL<= 7 ; //21215 ~ 21254
22: R_CAL<= 8 ; //21255 ~ 21294
23: R_CAL<= 8 ; //21295 ~ 21334
24: R_CAL<= 8 ; //21335 ~ 21374
25: R_CAL<= 8 ; //21375 ~ 21414
26: R_CAL<= 8 ; //21415 ~ 21454
27: R_CAL<= 8 ; //21455 ~ 21494
28: R_CAL<= 8 ; //21495 ~ 21534
29: R_CAL<= 8 ; //21535 ~ 21574
30: R_CAL<= 8 ; //21575 ~ 21614
31: R_CAL<= 8 ; //21615 ~ 21654
32: R_CAL<= 8 ; //21655 ~ 21694
33: R_CAL<= 8 ; //21695 ~ 21734
34: R_CAL<= 8 ; //21735 ~ 21774
35: R_CAL<= 8 ; //21775 ~ 21814
36: R_CAL<= 8 ; //21815 ~ 21854
37: R_CAL<= 8 ; //21855 ~ 21894
38: R_CAL<= 7 ; //21895 ~ 21934
39: R_CAL<= 7 ; //21935 ~ 21974
40: R_CAL<= 7 ; //21975 ~ 22014
41: R_CAL<= 7 ; //22015 ~ 22054
42: R_CAL<= 7 ; //22055 ~ 22094
43: R_CAL<= 7 ; //22095 ~ 22134
44: R_CAL<= 7 ; //22135 ~ 22174
45: R_CAL<= 7 ; //22175 ~ 22214
46: R_CAL<= 7 ; //22215 ~ 22254
47: R_CAL<= 7 ; //22255 ~ 22294
48: R_CAL<= 7 ; //22295 ~ 22334
49: R_CAL<= 7 ; //22335 ~ 22374
50: R_CAL<= 7 ; //22375 ~ 22414
51: R_CAL<= 7 ; //22415 ~ 22454
52: R_CAL<= 7 ; //22455 ~ 22494
53: R_CAL<= 7 ; //22495 ~ 22534
54: R_CAL<= 7 ; //22535 ~ 22574
55: R_CAL<= 7 ; //22575 ~ 22614
56: R_CAL<= 7 ; //22615 ~ 22654
57: R_CAL<= 7 ; //22655 ~ 22694
58: R_CAL<= 8 ; //22695 ~ 22734
59: R_CAL<= 8 ; //22735 ~ 22774
60: R_CAL<= 8 ; //22775 ~ 22814
61: R_CAL<= 8 ; //22815 ~ 22854
62: R_CAL<= 8 ; //22855 ~ 22894
63: R_CAL<= 8 ; //22895 ~ 22934
64: R_CAL<= 8 ; //22935 ~ 22974
65: R_CAL<= 8 ; //22975 ~ 23014
66: R_CAL<= 8 ; //23015 ~ 23054
67: R_CAL<= 8 ; //23055 ~ 23094
68: R_CAL<= 7 ; //23095 ~ 23134
69: R_CAL<= 7 ; //23135 ~ 23174
70: R_CAL<= 7 ; //23175 ~ 23214
71: R_CAL<= 7 ; //23215 ~ 23254
72: R_CAL<= 6 ; //23255 ~ 23294
73: R_CAL<= 6 ; //23295 ~ 23334
74: R_CAL<= 6 ; //23335 ~ 23374
75: R_CAL<= 6 ; //23375 ~ 23414
76: R_CAL<= 6 ; //23415 ~ 23454
77: R_CAL<= 6 ; //23455 ~ 23494
78: R_CAL<= 6 ; //23495 ~ 23534
79: R_CAL<= 5 ; //23535 ~ 23574
80: R_CAL<= 6 ; //23575 ~ 23614
81: R_CAL<= 6 ; //23615 ~ 23654
82: R_CAL<= 6 ; //23655 ~ 23694
83: R_CAL<= 6 ; //23695 ~ 23734
84: R_CAL<= 6 ; //23735 ~ 23774
85: R_CAL<= 6 ; //23775 ~ 23814
86: R_CAL<= 6 ; //23815 ~ 23854
87: R_CAL<= 6 ; //23855 ~ 23875
default:R_CAL<=R_CAL;
endcase
end
else if(i_temp>=8'sd0)begin//常温校准接收通道1
case(fre_mode)
0 : R_CAL<= 7 ; //20375 ~ 20414
1 : R_CAL<= 7 ; //20415 ~ 20454
2 : R_CAL<= 7 ; //20455 ~ 20494
3 : R_CAL<= 6 ; //20495 ~ 20534
4 : R_CAL<= 6 ; //20535 ~ 20574
5 : R_CAL<= 6 ; //20575 ~ 20614
6 : R_CAL<= 6 ; //20615 ~ 20654
7 : R_CAL<= 6 ; //20655 ~ 20694
8 : R_CAL<= 5 ; //20695 ~ 20734
9 : R_CAL<= 5 ; //20735 ~ 20774
10: R_CAL<= 6 ; //20775 ~ 20814
11: R_CAL<= 6 ; //20815 ~ 20854
12: R_CAL<= 6 ; //20855 ~ 20894
13: R_CAL<= 6 ; //20895 ~ 20934
14: R_CAL<= 6 ; //20935 ~ 20974
15: R_CAL<= 6 ; //20975 ~ 21014
16: R_CAL<= 6 ; //21015 ~ 21054
17: R_CAL<= 6 ; //21055 ~ 21094
18: R_CAL<= 6 ; //21095 ~ 21134
19: R_CAL<= 7 ; //21135 ~ 21174
20: R_CAL<= 7 ; //21175 ~ 21214
21: R_CAL<= 7 ; //21215 ~ 21254
22: R_CAL<= 8 ; //21255 ~ 21294
23: R_CAL<= 8 ; //21295 ~ 21334
24: R_CAL<= 8 ; //21335 ~ 21374
25: R_CAL<= 8 ; //21375 ~ 21414
26: R_CAL<= 8 ; //21415 ~ 21454
27: R_CAL<= 8 ; //21455 ~ 21494
28: R_CAL<= 8 ; //21495 ~ 21534
29: R_CAL<= 8 ; //21535 ~ 21574
30: R_CAL<= 8 ; //21575 ~ 21614
31: R_CAL<= 8 ; //21615 ~ 21654
32: R_CAL<= 8 ; //21655 ~ 21694
33: R_CAL<= 8 ; //21695 ~ 21734
34: R_CAL<= 8 ; //21735 ~ 21774
35: R_CAL<= 8 ; //21775 ~ 21814
36: R_CAL<= 8 ; //21815 ~ 21854
37: R_CAL<= 8 ; //21855 ~ 21894
38: R_CAL<= 7 ; //21895 ~ 21934
39: R_CAL<= 7 ; //21935 ~ 21974
40: R_CAL<= 7 ; //21975 ~ 22014
41: R_CAL<= 7 ; //22015 ~ 22054
42: R_CAL<= 7 ; //22055 ~ 22094
43: R_CAL<= 7 ; //22095 ~ 22134
44: R_CAL<= 7 ; //22135 ~ 22174
45: R_CAL<= 7 ; //22175 ~ 22214
46: R_CAL<= 7 ; //22215 ~ 22254
47: R_CAL<= 7 ; //22255 ~ 22294
48: R_CAL<= 7 ; //22295 ~ 22334
49: R_CAL<= 7 ; //22335 ~ 22374
50: R_CAL<= 7 ; //22375 ~ 22414
51: R_CAL<= 7 ; //22415 ~ 22454
52: R_CAL<= 7 ; //22455 ~ 22494
53: R_CAL<= 7 ; //22495 ~ 22534
54: R_CAL<= 7 ; //22535 ~ 22574
55: R_CAL<= 7 ; //22575 ~ 22614
56: R_CAL<= 7 ; //22615 ~ 22654
57: R_CAL<= 7 ; //22655 ~ 22694
58: R_CAL<= 8 ; //22695 ~ 22734
59: R_CAL<= 8 ; //22735 ~ 22774
60: R_CAL<= 8 ; //22775 ~ 22814
61: R_CAL<= 8 ; //22815 ~ 22854
62: R_CAL<= 8 ; //22855 ~ 22894
63: R_CAL<= 8 ; //22895 ~ 22934
64: R_CAL<= 8 ; //22935 ~ 22974
65: R_CAL<= 8 ; //22975 ~ 23014
66: R_CAL<= 8 ; //23015 ~ 23054
67: R_CAL<= 8 ; //23055 ~ 23094
68: R_CAL<= 7 ; //23095 ~ 23134
69: R_CAL<= 7 ; //23135 ~ 23174
70: R_CAL<= 7 ; //23175 ~ 23214
71: R_CAL<= 7 ; //23215 ~ 23254
72: R_CAL<= 6 ; //23255 ~ 23294
73: R_CAL<= 6 ; //23295 ~ 23334
74: R_CAL<= 6 ; //23335 ~ 23374
75: R_CAL<= 6 ; //23375 ~ 23414
76: R_CAL<= 6 ; //23415 ~ 23454
77: R_CAL<= 6 ; //23455 ~ 23494
78: R_CAL<= 6 ; //23495 ~ 23534
79: R_CAL<= 5 ; //23535 ~ 23574
80: R_CAL<= 6 ; //23575 ~ 23614
81: R_CAL<= 6 ; //23615 ~ 23654
82: R_CAL<= 6 ; //23655 ~ 23694
83: R_CAL<= 6 ; //23695 ~ 23734
84: R_CAL<= 6 ; //23735 ~ 23774
85: R_CAL<= 6 ; //23775 ~ 23814
86: R_CAL<= 6 ; //23815 ~ 23854
87: R_CAL<= 6 ; //23855 ~ 23875
default:R_CAL<=R_CAL;
endcase
end
else begin//低温校准接收通道1
case(fre_mode)
0 : R_CAL<= 7 ; //20375 ~ 20414
1 : R_CAL<= 7 ; //20415 ~ 20454
2 : R_CAL<= 7 ; //20455 ~ 20494
3 : R_CAL<= 6 ; //20495 ~ 20534
4 : R_CAL<= 6 ; //20535 ~ 20574
5 : R_CAL<= 6 ; //20575 ~ 20614
6 : R_CAL<= 6 ; //20615 ~ 20654
7 : R_CAL<= 6 ; //20655 ~ 20694
8 : R_CAL<= 5 ; //20695 ~ 20734
9 : R_CAL<= 5 ; //20735 ~ 20774
10: R_CAL<= 6 ; //20775 ~ 20814
11: R_CAL<= 6 ; //20815 ~ 20854
12: R_CAL<= 6 ; //20855 ~ 20894
13: R_CAL<= 6 ; //20895 ~ 20934
14: R_CAL<= 6 ; //20935 ~ 20974
15: R_CAL<= 6 ; //20975 ~ 21014
16: R_CAL<= 6 ; //21015 ~ 21054
17: R_CAL<= 6 ; //21055 ~ 21094
18: R_CAL<= 6 ; //21095 ~ 21134
19: R_CAL<= 7 ; //21135 ~ 21174
20: R_CAL<= 7 ; //21175 ~ 21214
21: R_CAL<= 7 ; //21215 ~ 21254
22: R_CAL<= 8 ; //21255 ~ 21294
23: R_CAL<= 8 ; //21295 ~ 21334
24: R_CAL<= 8 ; //21335 ~ 21374
25: R_CAL<= 8 ; //21375 ~ 21414
26: R_CAL<= 8 ; //21415 ~ 21454
27: R_CAL<= 8 ; //21455 ~ 21494
28: R_CAL<= 8 ; //21495 ~ 21534
29: R_CAL<= 8 ; //21535 ~ 21574
30: R_CAL<= 8 ; //21575 ~ 21614
31: R_CAL<= 8 ; //21615 ~ 21654
32: R_CAL<= 8 ; //21655 ~ 21694
33: R_CAL<= 8 ; //21695 ~ 21734
34: R_CAL<= 8 ; //21735 ~ 21774
35: R_CAL<= 8 ; //21775 ~ 21814
36: R_CAL<= 8 ; //21815 ~ 21854
37: R_CAL<= 8 ; //21855 ~ 21894
38: R_CAL<= 7 ; //21895 ~ 21934
39: R_CAL<= 7 ; //21935 ~ 21974
40: R_CAL<= 7 ; //21975 ~ 22014
41: R_CAL<= 7 ; //22015 ~ 22054
42: R_CAL<= 7 ; //22055 ~ 22094
43: R_CAL<= 7 ; //22095 ~ 22134
44: R_CAL<= 7 ; //22135 ~ 22174
45: R_CAL<= 7 ; //22175 ~ 22214
46: R_CAL<= 7 ; //22215 ~ 22254
47: R_CAL<= 7 ; //22255 ~ 22294
48: R_CAL<= 7 ; //22295 ~ 22334
49: R_CAL<= 7 ; //22335 ~ 22374
50: R_CAL<= 7 ; //22375 ~ 22414
51: R_CAL<= 7 ; //22415 ~ 22454
52: R_CAL<= 7 ; //22455 ~ 22494
53: R_CAL<= 7 ; //22495 ~ 22534
54: R_CAL<= 7 ; //22535 ~ 22574
55: R_CAL<= 7 ; //22575 ~ 22614
56: R_CAL<= 7 ; //22615 ~ 22654
57: R_CAL<= 7 ; //22655 ~ 22694
58: R_CAL<= 8 ; //22695 ~ 22734
59: R_CAL<= 8 ; //22735 ~ 22774
60: R_CAL<= 8 ; //22775 ~ 22814
61: R_CAL<= 8 ; //22815 ~ 22854
62: R_CAL<= 8 ; //22855 ~ 22894
63: R_CAL<= 8 ; //22895 ~ 22934
64: R_CAL<= 8 ; //22935 ~ 22974
65: R_CAL<= 8 ; //22975 ~ 23014
66: R_CAL<= 8 ; //23015 ~ 23054
67: R_CAL<= 8 ; //23055 ~ 23094
68: R_CAL<= 7 ; //23095 ~ 23134
69: R_CAL<= 7 ; //23135 ~ 23174
70: R_CAL<= 7 ; //23175 ~ 23214
71: R_CAL<= 7 ; //23215 ~ 23254
72: R_CAL<= 6 ; //23255 ~ 23294
73: R_CAL<= 6 ; //23295 ~ 23334
74: R_CAL<= 6 ; //23335 ~ 23374
75: R_CAL<= 6 ; //23375 ~ 23414
76: R_CAL<= 6 ; //23415 ~ 23454
77: R_CAL<= 6 ; //23455 ~ 23494
78: R_CAL<= 6 ; //23495 ~ 23534
79: R_CAL<= 5 ; //23535 ~ 23574
80: R_CAL<= 6 ; //23575 ~ 23614
81: R_CAL<= 6 ; //23615 ~ 23654
82: R_CAL<= 6 ; //23655 ~ 23694
83: R_CAL<= 6 ; //23695 ~ 23734
84: R_CAL<= 6 ; //23735 ~ 23774
85: R_CAL<= 6 ; //23775 ~ 23814
86: R_CAL<= 6 ; //23815 ~ 23854
87: R_CAL<= 6 ; //23855 ~ 23875
default:R_CAL<=R_CAL;
endcase
end
end
endmodule
@@ -0,0 +1,349 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 17:05:24 04/08/2022
// Design Name:
// Module Name: R_CAL
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module R_CAL_2(
input i_clk ,
input i_rstn ,
input signed[7:0] i_temp ,
input [15:0] fre_mode ,
output reg[3:0] R_CAL
);
//接收通道2
always@(posedge i_clk,negedge i_rstn)begin //1dB 步进
if(!i_rstn)
R_CAL<='d0;
else if(i_temp>=8'sd70)begin//高温校准接收通道2
case(fre_mode)
0 : R_CAL<= 6 ; //20375 ~ 20414
1 : R_CAL<= 6 ; //20415 ~ 20454
2 : R_CAL<= 6 ; //20455 ~ 20494
3 : R_CAL<= 5 ; //20495 ~ 20534
4 : R_CAL<= 5 ; //20535 ~ 20574
5 : R_CAL<= 5 ; //20575 ~ 20614
6 : R_CAL<= 5 ; //20615 ~ 20654
7 : R_CAL<= 5 ; //20655 ~ 20694
8 : R_CAL<= 5 ; //20695 ~ 20734
9 : R_CAL<= 5 ; //20735 ~ 20774
10: R_CAL<= 5 ; //20775 ~ 20814
11: R_CAL<= 5 ; //20815 ~ 20854
12: R_CAL<= 5 ; //20855 ~ 20894
13: R_CAL<= 5 ; //20895 ~ 20934
14: R_CAL<= 5 ; //20935 ~ 20974
15: R_CAL<= 6 ; //20975 ~ 21014
16: R_CAL<= 6 ; //21015 ~ 21054
17: R_CAL<= 6 ; //21055 ~ 21094
18: R_CAL<= 6 ; //21095 ~ 21134
19: R_CAL<= 6 ; //21135 ~ 21174
20: R_CAL<= 6 ; //21175 ~ 21214
21: R_CAL<= 7 ; //21215 ~ 21254
22: R_CAL<= 7 ; //21255 ~ 21294
23: R_CAL<= 7 ; //21295 ~ 21334
24: R_CAL<= 8 ; //21335 ~ 21374
25: R_CAL<= 8 ; //21375 ~ 21414
26: R_CAL<= 8 ; //21415 ~ 21454
27: R_CAL<= 8 ; //21455 ~ 21494
28: R_CAL<= 8 ; //21495 ~ 21534
29: R_CAL<= 8 ; //21535 ~ 21574
30: R_CAL<= 8 ; //21575 ~ 21614
31: R_CAL<= 8 ; //21615 ~ 21654
32: R_CAL<= 8 ; //21655 ~ 21694
33: R_CAL<= 8 ; //21695 ~ 21734
34: R_CAL<= 8 ; //21735 ~ 21774
35: R_CAL<= 8 ; //21775 ~ 21814
36: R_CAL<= 8 ; //21815 ~ 21854
37: R_CAL<= 8 ; //21855 ~ 21894
38: R_CAL<= 7 ; //21895 ~ 21934
39: R_CAL<= 7 ; //21935 ~ 21974
40: R_CAL<= 7 ; //21975 ~ 22014
41: R_CAL<= 7 ; //22015 ~ 22054
42: R_CAL<= 7 ; //22055 ~ 22094
43: R_CAL<= 7 ; //22095 ~ 22134
44: R_CAL<= 7 ; //22135 ~ 22174
45: R_CAL<= 7 ; //22175 ~ 22214
46: R_CAL<= 7 ; //22215 ~ 22254
47: R_CAL<= 7 ; //22255 ~ 22294
48: R_CAL<= 7 ; //22295 ~ 22334
49: R_CAL<= 7 ; //22335 ~ 22374
50: R_CAL<= 7 ; //22375 ~ 22414
51: R_CAL<= 7 ; //22415 ~ 22454
52: R_CAL<= 7 ; //22455 ~ 22494
53: R_CAL<= 7 ; //22495 ~ 22534
54: R_CAL<= 7 ; //22535 ~ 22574
55: R_CAL<= 7 ; //22575 ~ 22614
56: R_CAL<= 7 ; //22615 ~ 22654
57: R_CAL<= 7 ; //22655 ~ 22694
58: R_CAL<= 7 ; //22695 ~ 22734
59: R_CAL<= 7 ; //22735 ~ 22774
60: R_CAL<= 7 ; //22775 ~ 22814
61: R_CAL<= 7 ; //22815 ~ 22854
62: R_CAL<= 7 ; //22855 ~ 22894
63: R_CAL<= 8 ; //22895 ~ 22934
64: R_CAL<= 8 ; //22935 ~ 22974
65: R_CAL<= 8 ; //22975 ~ 23014
66: R_CAL<= 8 ; //23015 ~ 23054
67: R_CAL<= 7 ; //23055 ~ 23094
68: R_CAL<= 7 ; //23095 ~ 23134
69: R_CAL<= 7 ; //23135 ~ 23174
70: R_CAL<= 7 ; //23175 ~ 23214
71: R_CAL<= 7 ; //23215 ~ 23254
72: R_CAL<= 7 ; //23255 ~ 23294
73: R_CAL<= 6 ; //23295 ~ 23334
74: R_CAL<= 6 ; //23335 ~ 23374
75: R_CAL<= 6 ; //23375 ~ 23414
76: R_CAL<= 6 ; //23415 ~ 23454
77: R_CAL<= 6 ; //23455 ~ 23494
78: R_CAL<= 5 ; //23495 ~ 23534
79: R_CAL<= 5 ; //23535 ~ 23574
80: R_CAL<= 6 ; //23575 ~ 23614
81: R_CAL<= 5 ; //23615 ~ 23654
82: R_CAL<= 5 ; //23655 ~ 23694
83: R_CAL<= 6 ; //23695 ~ 23734
84: R_CAL<= 5 ; //23735 ~ 23774
85: R_CAL<= 6 ; //23775 ~ 23814
86: R_CAL<= 6 ; //23815 ~ 23854
87: R_CAL<= 6 ; //23855 ~ 23875
default:R_CAL<=R_CAL;
endcase
end
else if(i_temp>=8'sd0)begin//常温校准接收通道2
case(fre_mode)
0 : R_CAL<= 6 ; //20375 ~ 20414
1 : R_CAL<= 6 ; //20415 ~ 20454
2 : R_CAL<= 6 ; //20455 ~ 20494
3 : R_CAL<= 5 ; //20495 ~ 20534
4 : R_CAL<= 5 ; //20535 ~ 20574
5 : R_CAL<= 5 ; //20575 ~ 20614
6 : R_CAL<= 5 ; //20615 ~ 20654
7 : R_CAL<= 5 ; //20655 ~ 20694
8 : R_CAL<= 5 ; //20695 ~ 20734
9 : R_CAL<= 5 ; //20735 ~ 20774
10: R_CAL<= 5 ; //20775 ~ 20814
11: R_CAL<= 5 ; //20815 ~ 20854
12: R_CAL<= 5 ; //20855 ~ 20894
13: R_CAL<= 5 ; //20895 ~ 20934
14: R_CAL<= 5 ; //20935 ~ 20974
15: R_CAL<= 6 ; //20975 ~ 21014
16: R_CAL<= 6 ; //21015 ~ 21054
17: R_CAL<= 6 ; //21055 ~ 21094
18: R_CAL<= 6 ; //21095 ~ 21134
19: R_CAL<= 6 ; //21135 ~ 21174
20: R_CAL<= 6 ; //21175 ~ 21214
21: R_CAL<= 7 ; //21215 ~ 21254
22: R_CAL<= 7 ; //21255 ~ 21294
23: R_CAL<= 7 ; //21295 ~ 21334
24: R_CAL<= 8 ; //21335 ~ 21374
25: R_CAL<= 8 ; //21375 ~ 21414
26: R_CAL<= 8 ; //21415 ~ 21454
27: R_CAL<= 8 ; //21455 ~ 21494
28: R_CAL<= 8 ; //21495 ~ 21534
29: R_CAL<= 8 ; //21535 ~ 21574
30: R_CAL<= 8 ; //21575 ~ 21614
31: R_CAL<= 8 ; //21615 ~ 21654
32: R_CAL<= 8 ; //21655 ~ 21694
33: R_CAL<= 8 ; //21695 ~ 21734
34: R_CAL<= 8 ; //21735 ~ 21774
35: R_CAL<= 8 ; //21775 ~ 21814
36: R_CAL<= 8 ; //21815 ~ 21854
37: R_CAL<= 8 ; //21855 ~ 21894
38: R_CAL<= 7 ; //21895 ~ 21934
39: R_CAL<= 7 ; //21935 ~ 21974
40: R_CAL<= 7 ; //21975 ~ 22014
41: R_CAL<= 7 ; //22015 ~ 22054
42: R_CAL<= 7 ; //22055 ~ 22094
43: R_CAL<= 7 ; //22095 ~ 22134
44: R_CAL<= 7 ; //22135 ~ 22174
45: R_CAL<= 7 ; //22175 ~ 22214
46: R_CAL<= 7 ; //22215 ~ 22254
47: R_CAL<= 7 ; //22255 ~ 22294
48: R_CAL<= 7 ; //22295 ~ 22334
49: R_CAL<= 7 ; //22335 ~ 22374
50: R_CAL<= 7 ; //22375 ~ 22414
51: R_CAL<= 7 ; //22415 ~ 22454
52: R_CAL<= 7 ; //22455 ~ 22494
53: R_CAL<= 7 ; //22495 ~ 22534
54: R_CAL<= 7 ; //22535 ~ 22574
55: R_CAL<= 7 ; //22575 ~ 22614
56: R_CAL<= 7 ; //22615 ~ 22654
57: R_CAL<= 7 ; //22655 ~ 22694
58: R_CAL<= 7 ; //22695 ~ 22734
59: R_CAL<= 7 ; //22735 ~ 22774
60: R_CAL<= 7 ; //22775 ~ 22814
61: R_CAL<= 7 ; //22815 ~ 22854
62: R_CAL<= 7 ; //22855 ~ 22894
63: R_CAL<= 8 ; //22895 ~ 22934
64: R_CAL<= 8 ; //22935 ~ 22974
65: R_CAL<= 8 ; //22975 ~ 23014
66: R_CAL<= 8 ; //23015 ~ 23054
67: R_CAL<= 7 ; //23055 ~ 23094
68: R_CAL<= 7 ; //23095 ~ 23134
69: R_CAL<= 7 ; //23135 ~ 23174
70: R_CAL<= 7 ; //23175 ~ 23214
71: R_CAL<= 7 ; //23215 ~ 23254
72: R_CAL<= 7 ; //23255 ~ 23294
73: R_CAL<= 6 ; //23295 ~ 23334
74: R_CAL<= 6 ; //23335 ~ 23374
75: R_CAL<= 6 ; //23375 ~ 23414
76: R_CAL<= 6 ; //23415 ~ 23454
77: R_CAL<= 6 ; //23455 ~ 23494
78: R_CAL<= 5 ; //23495 ~ 23534
79: R_CAL<= 5 ; //23535 ~ 23574
80: R_CAL<= 6 ; //23575 ~ 23614
81: R_CAL<= 5 ; //23615 ~ 23654
82: R_CAL<= 5 ; //23655 ~ 23694
83: R_CAL<= 6 ; //23695 ~ 23734
84: R_CAL<= 5 ; //23735 ~ 23774
85: R_CAL<= 6 ; //23775 ~ 23814
86: R_CAL<= 6 ; //23815 ~ 23854
87: R_CAL<= 6 ; //23855 ~ 23875
default:R_CAL<=R_CAL;
endcase
end
else begin//低温校准接收通道2
case(fre_mode)
0 : R_CAL<= 6 ; //20375 ~ 20414
1 : R_CAL<= 6 ; //20415 ~ 20454
2 : R_CAL<= 6 ; //20455 ~ 20494
3 : R_CAL<= 5 ; //20495 ~ 20534
4 : R_CAL<= 5 ; //20535 ~ 20574
5 : R_CAL<= 5 ; //20575 ~ 20614
6 : R_CAL<= 5 ; //20615 ~ 20654
7 : R_CAL<= 5 ; //20655 ~ 20694
8 : R_CAL<= 5 ; //20695 ~ 20734
9 : R_CAL<= 5 ; //20735 ~ 20774
10: R_CAL<= 5 ; //20775 ~ 20814
11: R_CAL<= 5 ; //20815 ~ 20854
12: R_CAL<= 5 ; //20855 ~ 20894
13: R_CAL<= 5 ; //20895 ~ 20934
14: R_CAL<= 5 ; //20935 ~ 20974
15: R_CAL<= 6 ; //20975 ~ 21014
16: R_CAL<= 6 ; //21015 ~ 21054
17: R_CAL<= 6 ; //21055 ~ 21094
18: R_CAL<= 6 ; //21095 ~ 21134
19: R_CAL<= 6 ; //21135 ~ 21174
20: R_CAL<= 6 ; //21175 ~ 21214
21: R_CAL<= 7 ; //21215 ~ 21254
22: R_CAL<= 7 ; //21255 ~ 21294
23: R_CAL<= 7 ; //21295 ~ 21334
24: R_CAL<= 8 ; //21335 ~ 21374
25: R_CAL<= 8 ; //21375 ~ 21414
26: R_CAL<= 8 ; //21415 ~ 21454
27: R_CAL<= 8 ; //21455 ~ 21494
28: R_CAL<= 8 ; //21495 ~ 21534
29: R_CAL<= 8 ; //21535 ~ 21574
30: R_CAL<= 8 ; //21575 ~ 21614
31: R_CAL<= 8 ; //21615 ~ 21654
32: R_CAL<= 8 ; //21655 ~ 21694
33: R_CAL<= 8 ; //21695 ~ 21734
34: R_CAL<= 8 ; //21735 ~ 21774
35: R_CAL<= 8 ; //21775 ~ 21814
36: R_CAL<= 8 ; //21815 ~ 21854
37: R_CAL<= 8 ; //21855 ~ 21894
38: R_CAL<= 7 ; //21895 ~ 21934
39: R_CAL<= 7 ; //21935 ~ 21974
40: R_CAL<= 7 ; //21975 ~ 22014
41: R_CAL<= 7 ; //22015 ~ 22054
42: R_CAL<= 7 ; //22055 ~ 22094
43: R_CAL<= 7 ; //22095 ~ 22134
44: R_CAL<= 7 ; //22135 ~ 22174
45: R_CAL<= 7 ; //22175 ~ 22214
46: R_CAL<= 7 ; //22215 ~ 22254
47: R_CAL<= 7 ; //22255 ~ 22294
48: R_CAL<= 7 ; //22295 ~ 22334
49: R_CAL<= 7 ; //22335 ~ 22374
50: R_CAL<= 7 ; //22375 ~ 22414
51: R_CAL<= 7 ; //22415 ~ 22454
52: R_CAL<= 7 ; //22455 ~ 22494
53: R_CAL<= 7 ; //22495 ~ 22534
54: R_CAL<= 7 ; //22535 ~ 22574
55: R_CAL<= 7 ; //22575 ~ 22614
56: R_CAL<= 7 ; //22615 ~ 22654
57: R_CAL<= 7 ; //22655 ~ 22694
58: R_CAL<= 7 ; //22695 ~ 22734
59: R_CAL<= 7 ; //22735 ~ 22774
60: R_CAL<= 7 ; //22775 ~ 22814
61: R_CAL<= 7 ; //22815 ~ 22854
62: R_CAL<= 7 ; //22855 ~ 22894
63: R_CAL<= 8 ; //22895 ~ 22934
64: R_CAL<= 8 ; //22935 ~ 22974
65: R_CAL<= 8 ; //22975 ~ 23014
66: R_CAL<= 8 ; //23015 ~ 23054
67: R_CAL<= 7 ; //23055 ~ 23094
68: R_CAL<= 7 ; //23095 ~ 23134
69: R_CAL<= 7 ; //23135 ~ 23174
70: R_CAL<= 7 ; //23175 ~ 23214
71: R_CAL<= 7 ; //23215 ~ 23254
72: R_CAL<= 7 ; //23255 ~ 23294
73: R_CAL<= 6 ; //23295 ~ 23334
74: R_CAL<= 6 ; //23335 ~ 23374
75: R_CAL<= 6 ; //23375 ~ 23414
76: R_CAL<= 6 ; //23415 ~ 23454
77: R_CAL<= 6 ; //23455 ~ 23494
78: R_CAL<= 5 ; //23495 ~ 23534
79: R_CAL<= 5 ; //23535 ~ 23574
80: R_CAL<= 6 ; //23575 ~ 23614
81: R_CAL<= 5 ; //23615 ~ 23654
82: R_CAL<= 5 ; //23655 ~ 23694
83: R_CAL<= 6 ; //23695 ~ 23734
84: R_CAL<= 5 ; //23735 ~ 23774
85: R_CAL<= 6 ; //23775 ~ 23814
86: R_CAL<= 6 ; //23815 ~ 23854
87: R_CAL<= 6 ; //23855 ~ 23875
default:R_CAL<=R_CAL;
endcase
end
end
endmodule
@@ -0,0 +1,348 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 17:05:24 04/08/2022
// Design Name:
// Module Name: R_CAL
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module R_CAL_3(
input i_clk ,
input i_rstn ,
input signed[7:0] i_temp ,
input [15:0] fre_mode ,
output reg[3:0] R_CAL
);
//接收通道3
always@(posedge i_clk,negedge i_rstn)begin //1dB 步进
if(!i_rstn)
R_CAL<='d0;
else if(i_temp>=8'sd70)begin//高温校准接收通道3
case(fre_mode)
0 : R_CAL<= 7 ; //20375 ~ 20414
1 : R_CAL<= 7 ; //20415 ~ 20454
2 : R_CAL<= 7 ; //20455 ~ 20494
3 : R_CAL<= 7 ; //20495 ~ 20534
4 : R_CAL<= 7 ; //20535 ~ 20574
5 : R_CAL<= 7 ; //20575 ~ 20614
6 : R_CAL<= 6 ; //20615 ~ 20654
7 : R_CAL<= 6 ; //20655 ~ 20694
8 : R_CAL<= 6 ; //20695 ~ 20734
9 : R_CAL<= 6 ; //20735 ~ 20774
10: R_CAL<= 6 ; //20775 ~ 20814
11: R_CAL<= 6 ; //20815 ~ 20854
12: R_CAL<= 6 ; //20855 ~ 20894
13: R_CAL<= 6 ; //20895 ~ 20934
14: R_CAL<= 6 ; //20935 ~ 20974
15: R_CAL<= 6 ; //20975 ~ 21014
16: R_CAL<= 6 ; //21015 ~ 21054
17: R_CAL<= 7 ; //21055 ~ 21094
18: R_CAL<= 7 ; //21095 ~ 21134
19: R_CAL<= 7 ; //21135 ~ 21174
20: R_CAL<= 8 ; //21175 ~ 21214
21: R_CAL<= 8 ; //21215 ~ 21254
22: R_CAL<= 8 ; //21255 ~ 21294
23: R_CAL<= 8 ; //21295 ~ 21334
24: R_CAL<= 8 ; //21335 ~ 21374
25: R_CAL<= 8 ; //21375 ~ 21414
26: R_CAL<= 9 ; //21415 ~ 21454
27: R_CAL<= 9 ; //21455 ~ 21494
28: R_CAL<= 9 ; //21495 ~ 21534
29: R_CAL<= 9 ; //21535 ~ 21574
30: R_CAL<= 9 ; //21575 ~ 21614
31: R_CAL<= 9 ; //21615 ~ 21654
32: R_CAL<= 9 ; //21655 ~ 21694
33: R_CAL<= 9 ; //21695 ~ 21734
34: R_CAL<= 9 ; //21735 ~ 21774
35: R_CAL<= 9 ; //21775 ~ 21814
36: R_CAL<= 9 ; //21815 ~ 21854
37: R_CAL<= 9 ; //21855 ~ 21894
38: R_CAL<= 9 ; //21895 ~ 21934
39: R_CAL<= 9 ; //21935 ~ 21974
40: R_CAL<= 8 ; //21975 ~ 22014
41: R_CAL<= 8 ; //22015 ~ 22054
42: R_CAL<= 8 ; //22055 ~ 22094
43: R_CAL<= 8 ; //22095 ~ 22134
44: R_CAL<= 8 ; //22135 ~ 22174
45: R_CAL<= 8 ; //22175 ~ 22214
46: R_CAL<= 8 ; //22215 ~ 22254
47: R_CAL<= 8 ; //22255 ~ 22294
48: R_CAL<= 8 ; //22295 ~ 22334
49: R_CAL<= 8 ; //22335 ~ 22374
50: R_CAL<= 8 ; //22375 ~ 22414
51: R_CAL<= 8 ; //22415 ~ 22454
52: R_CAL<= 8 ; //22455 ~ 22494
53: R_CAL<= 8 ; //22495 ~ 22534
54: R_CAL<= 8 ; //22535 ~ 22574
55: R_CAL<= 8 ; //22575 ~ 22614
56: R_CAL<= 8 ; //22615 ~ 22654
57: R_CAL<= 8 ; //22655 ~ 22694
58: R_CAL<= 8 ; //22695 ~ 22734
59: R_CAL<= 8 ; //22735 ~ 22774
60: R_CAL<= 8 ; //22775 ~ 22814
61: R_CAL<= 8 ; //22815 ~ 22854
62: R_CAL<= 8 ; //22855 ~ 22894
63: R_CAL<= 9 ; //22895 ~ 22934
64: R_CAL<= 9 ; //22935 ~ 22974
65: R_CAL<= 9 ; //22975 ~ 23014
66: R_CAL<= 9 ; //23015 ~ 23054
67: R_CAL<= 9 ; //23055 ~ 23094
68: R_CAL<= 8 ; //23095 ~ 23134
69: R_CAL<= 8 ; //23135 ~ 23174
70: R_CAL<= 8 ; //23175 ~ 23214
71: R_CAL<= 8 ; //23215 ~ 23254
72: R_CAL<= 8 ; //23255 ~ 23294
73: R_CAL<= 7 ; //23295 ~ 23334
74: R_CAL<= 7 ; //23335 ~ 23374
75: R_CAL<= 7 ; //23375 ~ 23414
76: R_CAL<= 7 ; //23415 ~ 23454
77: R_CAL<= 7 ; //23455 ~ 23494
78: R_CAL<= 7 ; //23495 ~ 23534
79: R_CAL<= 7 ; //23535 ~ 23574
80: R_CAL<= 7 ; //23575 ~ 23614
81: R_CAL<= 7 ; //23615 ~ 23654
82: R_CAL<= 7 ; //23655 ~ 23694
83: R_CAL<= 7 ; //23695 ~ 23734
84: R_CAL<= 7 ; //23735 ~ 23774
85: R_CAL<= 7 ; //23775 ~ 23814
86: R_CAL<= 7 ; //23815 ~ 23854
87: R_CAL<= 7 ; //23855 ~ 23875
default:R_CAL<=R_CAL;
endcase
end
else if(i_temp>=8'sd0)begin//常温校准接收通道3
case(fre_mode)
0 : R_CAL<= 7 ; //20375 ~ 20414
1 : R_CAL<= 7 ; //20415 ~ 20454
2 : R_CAL<= 7 ; //20455 ~ 20494
3 : R_CAL<= 7 ; //20495 ~ 20534
4 : R_CAL<= 7 ; //20535 ~ 20574
5 : R_CAL<= 7 ; //20575 ~ 20614
6 : R_CAL<= 6 ; //20615 ~ 20654
7 : R_CAL<= 6 ; //20655 ~ 20694
8 : R_CAL<= 6 ; //20695 ~ 20734
9 : R_CAL<= 6 ; //20735 ~ 20774
10: R_CAL<= 6 ; //20775 ~ 20814
11: R_CAL<= 6 ; //20815 ~ 20854
12: R_CAL<= 6 ; //20855 ~ 20894
13: R_CAL<= 6 ; //20895 ~ 20934
14: R_CAL<= 6 ; //20935 ~ 20974
15: R_CAL<= 6 ; //20975 ~ 21014
16: R_CAL<= 6 ; //21015 ~ 21054
17: R_CAL<= 7 ; //21055 ~ 21094
18: R_CAL<= 7 ; //21095 ~ 21134
19: R_CAL<= 7 ; //21135 ~ 21174
20: R_CAL<= 8 ; //21175 ~ 21214
21: R_CAL<= 8 ; //21215 ~ 21254
22: R_CAL<= 8 ; //21255 ~ 21294
23: R_CAL<= 8 ; //21295 ~ 21334
24: R_CAL<= 8 ; //21335 ~ 21374
25: R_CAL<= 8 ; //21375 ~ 21414
26: R_CAL<= 9 ; //21415 ~ 21454
27: R_CAL<= 9 ; //21455 ~ 21494
28: R_CAL<= 9 ; //21495 ~ 21534
29: R_CAL<= 9 ; //21535 ~ 21574
30: R_CAL<= 9 ; //21575 ~ 21614
31: R_CAL<= 9 ; //21615 ~ 21654
32: R_CAL<= 9 ; //21655 ~ 21694
33: R_CAL<= 9 ; //21695 ~ 21734
34: R_CAL<= 9 ; //21735 ~ 21774
35: R_CAL<= 9 ; //21775 ~ 21814
36: R_CAL<= 9 ; //21815 ~ 21854
37: R_CAL<= 9 ; //21855 ~ 21894
38: R_CAL<= 9 ; //21895 ~ 21934
39: R_CAL<= 9 ; //21935 ~ 21974
40: R_CAL<= 8 ; //21975 ~ 22014
41: R_CAL<= 8 ; //22015 ~ 22054
42: R_CAL<= 8 ; //22055 ~ 22094
43: R_CAL<= 8 ; //22095 ~ 22134
44: R_CAL<= 8 ; //22135 ~ 22174
45: R_CAL<= 8 ; //22175 ~ 22214
46: R_CAL<= 8 ; //22215 ~ 22254
47: R_CAL<= 8 ; //22255 ~ 22294
48: R_CAL<= 8 ; //22295 ~ 22334
49: R_CAL<= 8 ; //22335 ~ 22374
50: R_CAL<= 8 ; //22375 ~ 22414
51: R_CAL<= 8 ; //22415 ~ 22454
52: R_CAL<= 8 ; //22455 ~ 22494
53: R_CAL<= 8 ; //22495 ~ 22534
54: R_CAL<= 8 ; //22535 ~ 22574
55: R_CAL<= 8 ; //22575 ~ 22614
56: R_CAL<= 8 ; //22615 ~ 22654
57: R_CAL<= 8 ; //22655 ~ 22694
58: R_CAL<= 8 ; //22695 ~ 22734
59: R_CAL<= 8 ; //22735 ~ 22774
60: R_CAL<= 8 ; //22775 ~ 22814
61: R_CAL<= 8 ; //22815 ~ 22854
62: R_CAL<= 8 ; //22855 ~ 22894
63: R_CAL<= 9 ; //22895 ~ 22934
64: R_CAL<= 9 ; //22935 ~ 22974
65: R_CAL<= 9 ; //22975 ~ 23014
66: R_CAL<= 9 ; //23015 ~ 23054
67: R_CAL<= 9 ; //23055 ~ 23094
68: R_CAL<= 8 ; //23095 ~ 23134
69: R_CAL<= 8 ; //23135 ~ 23174
70: R_CAL<= 8 ; //23175 ~ 23214
71: R_CAL<= 8 ; //23215 ~ 23254
72: R_CAL<= 8 ; //23255 ~ 23294
73: R_CAL<= 7 ; //23295 ~ 23334
74: R_CAL<= 7 ; //23335 ~ 23374
75: R_CAL<= 7 ; //23375 ~ 23414
76: R_CAL<= 7 ; //23415 ~ 23454
77: R_CAL<= 7 ; //23455 ~ 23494
78: R_CAL<= 7 ; //23495 ~ 23534
79: R_CAL<= 7 ; //23535 ~ 23574
80: R_CAL<= 7 ; //23575 ~ 23614
81: R_CAL<= 7 ; //23615 ~ 23654
82: R_CAL<= 7 ; //23655 ~ 23694
83: R_CAL<= 7 ; //23695 ~ 23734
84: R_CAL<= 7 ; //23735 ~ 23774
85: R_CAL<= 7 ; //23775 ~ 23814
86: R_CAL<= 7 ; //23815 ~ 23854
87: R_CAL<= 7 ; //23855 ~ 23875
default:R_CAL<=R_CAL;
endcase
end
else begin//低温校准接收通道3
case(fre_mode)
0 : R_CAL<= 7 ; //20375 ~ 20414
1 : R_CAL<= 7 ; //20415 ~ 20454
2 : R_CAL<= 7 ; //20455 ~ 20494
3 : R_CAL<= 7 ; //20495 ~ 20534
4 : R_CAL<= 7 ; //20535 ~ 20574
5 : R_CAL<= 7 ; //20575 ~ 20614
6 : R_CAL<= 6 ; //20615 ~ 20654
7 : R_CAL<= 6 ; //20655 ~ 20694
8 : R_CAL<= 6 ; //20695 ~ 20734
9 : R_CAL<= 6 ; //20735 ~ 20774
10: R_CAL<= 6 ; //20775 ~ 20814
11: R_CAL<= 6 ; //20815 ~ 20854
12: R_CAL<= 6 ; //20855 ~ 20894
13: R_CAL<= 6 ; //20895 ~ 20934
14: R_CAL<= 6 ; //20935 ~ 20974
15: R_CAL<= 6 ; //20975 ~ 21014
16: R_CAL<= 6 ; //21015 ~ 21054
17: R_CAL<= 7 ; //21055 ~ 21094
18: R_CAL<= 7 ; //21095 ~ 21134
19: R_CAL<= 7 ; //21135 ~ 21174
20: R_CAL<= 8 ; //21175 ~ 21214
21: R_CAL<= 8 ; //21215 ~ 21254
22: R_CAL<= 8 ; //21255 ~ 21294
23: R_CAL<= 8 ; //21295 ~ 21334
24: R_CAL<= 8 ; //21335 ~ 21374
25: R_CAL<= 8 ; //21375 ~ 21414
26: R_CAL<= 9 ; //21415 ~ 21454
27: R_CAL<= 9 ; //21455 ~ 21494
28: R_CAL<= 9 ; //21495 ~ 21534
29: R_CAL<= 9 ; //21535 ~ 21574
30: R_CAL<= 9 ; //21575 ~ 21614
31: R_CAL<= 9 ; //21615 ~ 21654
32: R_CAL<= 9 ; //21655 ~ 21694
33: R_CAL<= 9 ; //21695 ~ 21734
34: R_CAL<= 9 ; //21735 ~ 21774
35: R_CAL<= 9 ; //21775 ~ 21814
36: R_CAL<= 9 ; //21815 ~ 21854
37: R_CAL<= 9 ; //21855 ~ 21894
38: R_CAL<= 9 ; //21895 ~ 21934
39: R_CAL<= 9 ; //21935 ~ 21974
40: R_CAL<= 8 ; //21975 ~ 22014
41: R_CAL<= 8 ; //22015 ~ 22054
42: R_CAL<= 8 ; //22055 ~ 22094
43: R_CAL<= 8 ; //22095 ~ 22134
44: R_CAL<= 8 ; //22135 ~ 22174
45: R_CAL<= 8 ; //22175 ~ 22214
46: R_CAL<= 8 ; //22215 ~ 22254
47: R_CAL<= 8 ; //22255 ~ 22294
48: R_CAL<= 8 ; //22295 ~ 22334
49: R_CAL<= 8 ; //22335 ~ 22374
50: R_CAL<= 8 ; //22375 ~ 22414
51: R_CAL<= 8 ; //22415 ~ 22454
52: R_CAL<= 8 ; //22455 ~ 22494
53: R_CAL<= 8 ; //22495 ~ 22534
54: R_CAL<= 8 ; //22535 ~ 22574
55: R_CAL<= 8 ; //22575 ~ 22614
56: R_CAL<= 8 ; //22615 ~ 22654
57: R_CAL<= 8 ; //22655 ~ 22694
58: R_CAL<= 8 ; //22695 ~ 22734
59: R_CAL<= 8 ; //22735 ~ 22774
60: R_CAL<= 8 ; //22775 ~ 22814
61: R_CAL<= 8 ; //22815 ~ 22854
62: R_CAL<= 8 ; //22855 ~ 22894
63: R_CAL<= 9 ; //22895 ~ 22934
64: R_CAL<= 9 ; //22935 ~ 22974
65: R_CAL<= 9 ; //22975 ~ 23014
66: R_CAL<= 9 ; //23015 ~ 23054
67: R_CAL<= 9 ; //23055 ~ 23094
68: R_CAL<= 8 ; //23095 ~ 23134
69: R_CAL<= 8 ; //23135 ~ 23174
70: R_CAL<= 8 ; //23175 ~ 23214
71: R_CAL<= 8 ; //23215 ~ 23254
72: R_CAL<= 8 ; //23255 ~ 23294
73: R_CAL<= 7 ; //23295 ~ 23334
74: R_CAL<= 7 ; //23335 ~ 23374
75: R_CAL<= 7 ; //23375 ~ 23414
76: R_CAL<= 7 ; //23415 ~ 23454
77: R_CAL<= 7 ; //23455 ~ 23494
78: R_CAL<= 7 ; //23495 ~ 23534
79: R_CAL<= 7 ; //23535 ~ 23574
80: R_CAL<= 7 ; //23575 ~ 23614
81: R_CAL<= 7 ; //23615 ~ 23654
82: R_CAL<= 7 ; //23655 ~ 23694
83: R_CAL<= 7 ; //23695 ~ 23734
84: R_CAL<= 7 ; //23735 ~ 23774
85: R_CAL<= 7 ; //23775 ~ 23814
86: R_CAL<= 7 ; //23815 ~ 23854
87: R_CAL<= 7 ; //23855 ~ 23875
default:R_CAL<=R_CAL;
endcase
end
end
endmodule
@@ -0,0 +1,349 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 17:05:24 04/08/2022
// Design Name:
// Module Name: R_CAL
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module R_CAL_4(
input i_clk ,
input i_rstn ,
input signed[7:0] i_temp ,
input [15:0] fre_mode ,
output reg[3:0] R_CAL
);
//接收通道4
always@(posedge i_clk,negedge i_rstn)begin //1dB 步进
if(!i_rstn)
R_CAL<='d0;
else if(i_temp>=8'sd70)begin//高温校准接收通道4
case(fre_mode)
0 : R_CAL<= 7 ; //20375 ~ 20414
1 : R_CAL<= 7 ; //20415 ~ 20454
2 : R_CAL<= 7 ; //20455 ~ 20494
3 : R_CAL<= 7 ; //20495 ~ 20534
4 : R_CAL<= 7 ; //20535 ~ 20574
5 : R_CAL<= 7 ; //20575 ~ 20614
6 : R_CAL<= 7 ; //20615 ~ 20654
7 : R_CAL<= 7 ; //20655 ~ 20694
8 : R_CAL<= 7 ; //20695 ~ 20734
9 : R_CAL<= 7 ; //20735 ~ 20774
10: R_CAL<= 7 ; //20775 ~ 20814
11: R_CAL<= 7 ; //20815 ~ 20854
12: R_CAL<= 7 ; //20855 ~ 20894
13: R_CAL<= 7 ; //20895 ~ 20934
14: R_CAL<= 7 ; //20935 ~ 20974
15: R_CAL<= 7 ; //20975 ~ 21014
16: R_CAL<= 7 ; //21015 ~ 21054
17: R_CAL<= 7 ; //21055 ~ 21094
18: R_CAL<= 7 ; //21095 ~ 21134
19: R_CAL<= 7 ; //21135 ~ 21174
20: R_CAL<= 7 ; //21175 ~ 21214
21: R_CAL<= 7 ; //21215 ~ 21254
22: R_CAL<= 7 ; //21255 ~ 21294
23: R_CAL<= 8 ; //21295 ~ 21334
24: R_CAL<= 8 ; //21335 ~ 21374
25: R_CAL<= 8 ; //21375 ~ 21414
26: R_CAL<= 8 ; //21415 ~ 21454
27: R_CAL<= 8 ; //21455 ~ 21494
28: R_CAL<= 8 ; //21495 ~ 21534
29: R_CAL<= 8 ; //21535 ~ 21574
30: R_CAL<= 8 ; //21575 ~ 21614
31: R_CAL<= 8 ; //21615 ~ 21654
32: R_CAL<= 8 ; //21655 ~ 21694
33: R_CAL<= 8 ; //21695 ~ 21734
34: R_CAL<= 8 ; //21735 ~ 21774
35: R_CAL<= 8 ; //21775 ~ 21814
36: R_CAL<= 8 ; //21815 ~ 21854
37: R_CAL<= 8 ; //21855 ~ 21894
38: R_CAL<= 8 ; //21895 ~ 21934
39: R_CAL<= 8 ; //21935 ~ 21974
40: R_CAL<= 8 ; //21975 ~ 22014
41: R_CAL<= 8 ; //22015 ~ 22054
42: R_CAL<= 7 ; //22055 ~ 22094
43: R_CAL<= 7 ; //22095 ~ 22134
44: R_CAL<= 7 ; //22135 ~ 22174
45: R_CAL<= 7 ; //22175 ~ 22214
46: R_CAL<= 7 ; //22215 ~ 22254
47: R_CAL<= 7 ; //22255 ~ 22294
48: R_CAL<= 7 ; //22295 ~ 22334
49: R_CAL<= 7 ; //22335 ~ 22374
50: R_CAL<= 7 ; //22375 ~ 22414
51: R_CAL<= 7 ; //22415 ~ 22454
52: R_CAL<= 7 ; //22455 ~ 22494
53: R_CAL<= 7 ; //22495 ~ 22534
54: R_CAL<= 7 ; //22535 ~ 22574
55: R_CAL<= 7 ; //22575 ~ 22614
56: R_CAL<= 7 ; //22615 ~ 22654
57: R_CAL<= 7 ; //22655 ~ 22694
58: R_CAL<= 7 ; //22695 ~ 22734
59: R_CAL<= 7 ; //22735 ~ 22774
60: R_CAL<= 8 ; //22775 ~ 22814
61: R_CAL<= 8 ; //22815 ~ 22854
62: R_CAL<= 8 ; //22855 ~ 22894
63: R_CAL<= 8 ; //22895 ~ 22934
64: R_CAL<= 8 ; //22935 ~ 22974
65: R_CAL<= 8 ; //22975 ~ 23014
66: R_CAL<= 8 ; //23015 ~ 23054
67: R_CAL<= 8 ; //23055 ~ 23094
68: R_CAL<= 8 ; //23095 ~ 23134
69: R_CAL<= 8 ; //23135 ~ 23174
70: R_CAL<= 7 ; //23175 ~ 23214
71: R_CAL<= 7 ; //23215 ~ 23254
72: R_CAL<= 7 ; //23255 ~ 23294
73: R_CAL<= 7 ; //23295 ~ 23334
74: R_CAL<= 7 ; //23335 ~ 23374
75: R_CAL<= 7 ; //23375 ~ 23414
76: R_CAL<= 6 ; //23415 ~ 23454
77: R_CAL<= 6 ; //23455 ~ 23494
78: R_CAL<= 6 ; //23495 ~ 23534
79: R_CAL<= 6 ; //23535 ~ 23574
80: R_CAL<= 6 ; //23575 ~ 23614
81: R_CAL<= 6 ; //23615 ~ 23654
82: R_CAL<= 6 ; //23655 ~ 23694
83: R_CAL<= 6 ; //23695 ~ 23734
84: R_CAL<= 6 ; //23735 ~ 23774
85: R_CAL<= 6 ; //23775 ~ 23814
86: R_CAL<= 6 ; //23815 ~ 23854
87: R_CAL<= 6 ; //23855 ~ 23875
default:R_CAL<=R_CAL;
endcase
end
else if(i_temp>=8'sd0)begin//常温校准接收通道4
case(fre_mode)
0 : R_CAL<= 7 ; //20375 ~ 20414
1 : R_CAL<= 7 ; //20415 ~ 20454
2 : R_CAL<= 7 ; //20455 ~ 20494
3 : R_CAL<= 7 ; //20495 ~ 20534
4 : R_CAL<= 7 ; //20535 ~ 20574
5 : R_CAL<= 7 ; //20575 ~ 20614
6 : R_CAL<= 7 ; //20615 ~ 20654
7 : R_CAL<= 7 ; //20655 ~ 20694
8 : R_CAL<= 7 ; //20695 ~ 20734
9 : R_CAL<= 7 ; //20735 ~ 20774
10: R_CAL<= 7 ; //20775 ~ 20814
11: R_CAL<= 7 ; //20815 ~ 20854
12: R_CAL<= 7 ; //20855 ~ 20894
13: R_CAL<= 7 ; //20895 ~ 20934
14: R_CAL<= 7 ; //20935 ~ 20974
15: R_CAL<= 7 ; //20975 ~ 21014
16: R_CAL<= 7 ; //21015 ~ 21054
17: R_CAL<= 7 ; //21055 ~ 21094
18: R_CAL<= 7 ; //21095 ~ 21134
19: R_CAL<= 7 ; //21135 ~ 21174
20: R_CAL<= 7 ; //21175 ~ 21214
21: R_CAL<= 7 ; //21215 ~ 21254
22: R_CAL<= 7 ; //21255 ~ 21294
23: R_CAL<= 8 ; //21295 ~ 21334
24: R_CAL<= 8 ; //21335 ~ 21374
25: R_CAL<= 8 ; //21375 ~ 21414
26: R_CAL<= 8 ; //21415 ~ 21454
27: R_CAL<= 8 ; //21455 ~ 21494
28: R_CAL<= 8 ; //21495 ~ 21534
29: R_CAL<= 8 ; //21535 ~ 21574
30: R_CAL<= 8 ; //21575 ~ 21614
31: R_CAL<= 8 ; //21615 ~ 21654
32: R_CAL<= 8 ; //21655 ~ 21694
33: R_CAL<= 8 ; //21695 ~ 21734
34: R_CAL<= 8 ; //21735 ~ 21774
35: R_CAL<= 8 ; //21775 ~ 21814
36: R_CAL<= 8 ; //21815 ~ 21854
37: R_CAL<= 8 ; //21855 ~ 21894
38: R_CAL<= 8 ; //21895 ~ 21934
39: R_CAL<= 8 ; //21935 ~ 21974
40: R_CAL<= 8 ; //21975 ~ 22014
41: R_CAL<= 8 ; //22015 ~ 22054
42: R_CAL<= 7 ; //22055 ~ 22094
43: R_CAL<= 7 ; //22095 ~ 22134
44: R_CAL<= 7 ; //22135 ~ 22174
45: R_CAL<= 7 ; //22175 ~ 22214
46: R_CAL<= 7 ; //22215 ~ 22254
47: R_CAL<= 7 ; //22255 ~ 22294
48: R_CAL<= 7 ; //22295 ~ 22334
49: R_CAL<= 7 ; //22335 ~ 22374
50: R_CAL<= 7 ; //22375 ~ 22414
51: R_CAL<= 7 ; //22415 ~ 22454
52: R_CAL<= 7 ; //22455 ~ 22494
53: R_CAL<= 7 ; //22495 ~ 22534
54: R_CAL<= 7 ; //22535 ~ 22574
55: R_CAL<= 7 ; //22575 ~ 22614
56: R_CAL<= 7 ; //22615 ~ 22654
57: R_CAL<= 7 ; //22655 ~ 22694
58: R_CAL<= 7 ; //22695 ~ 22734
59: R_CAL<= 7 ; //22735 ~ 22774
60: R_CAL<= 8 ; //22775 ~ 22814
61: R_CAL<= 8 ; //22815 ~ 22854
62: R_CAL<= 8 ; //22855 ~ 22894
63: R_CAL<= 8 ; //22895 ~ 22934
64: R_CAL<= 8 ; //22935 ~ 22974
65: R_CAL<= 8 ; //22975 ~ 23014
66: R_CAL<= 8 ; //23015 ~ 23054
67: R_CAL<= 8 ; //23055 ~ 23094
68: R_CAL<= 8 ; //23095 ~ 23134
69: R_CAL<= 8 ; //23135 ~ 23174
70: R_CAL<= 7 ; //23175 ~ 23214
71: R_CAL<= 7 ; //23215 ~ 23254
72: R_CAL<= 7 ; //23255 ~ 23294
73: R_CAL<= 7 ; //23295 ~ 23334
74: R_CAL<= 7 ; //23335 ~ 23374
75: R_CAL<= 7 ; //23375 ~ 23414
76: R_CAL<= 6 ; //23415 ~ 23454
77: R_CAL<= 6 ; //23455 ~ 23494
78: R_CAL<= 6 ; //23495 ~ 23534
79: R_CAL<= 6 ; //23535 ~ 23574
80: R_CAL<= 6 ; //23575 ~ 23614
81: R_CAL<= 6 ; //23615 ~ 23654
82: R_CAL<= 6 ; //23655 ~ 23694
83: R_CAL<= 6 ; //23695 ~ 23734
84: R_CAL<= 6 ; //23735 ~ 23774
85: R_CAL<= 6 ; //23775 ~ 23814
86: R_CAL<= 6 ; //23815 ~ 23854
87: R_CAL<= 6 ; //23855 ~ 23875
default:R_CAL<=R_CAL;
endcase
end
else begin//低温校准接收通道4
case(fre_mode)
0 : R_CAL<= 7 ; //20375 ~ 20414
1 : R_CAL<= 7 ; //20415 ~ 20454
2 : R_CAL<= 7 ; //20455 ~ 20494
3 : R_CAL<= 7 ; //20495 ~ 20534
4 : R_CAL<= 7 ; //20535 ~ 20574
5 : R_CAL<= 7 ; //20575 ~ 20614
6 : R_CAL<= 7 ; //20615 ~ 20654
7 : R_CAL<= 7 ; //20655 ~ 20694
8 : R_CAL<= 7 ; //20695 ~ 20734
9 : R_CAL<= 7 ; //20735 ~ 20774
10: R_CAL<= 7 ; //20775 ~ 20814
11: R_CAL<= 7 ; //20815 ~ 20854
12: R_CAL<= 7 ; //20855 ~ 20894
13: R_CAL<= 7 ; //20895 ~ 20934
14: R_CAL<= 7 ; //20935 ~ 20974
15: R_CAL<= 7 ; //20975 ~ 21014
16: R_CAL<= 7 ; //21015 ~ 21054
17: R_CAL<= 7 ; //21055 ~ 21094
18: R_CAL<= 7 ; //21095 ~ 21134
19: R_CAL<= 7 ; //21135 ~ 21174
20: R_CAL<= 7 ; //21175 ~ 21214
21: R_CAL<= 7 ; //21215 ~ 21254
22: R_CAL<= 7 ; //21255 ~ 21294
23: R_CAL<= 8 ; //21295 ~ 21334
24: R_CAL<= 8 ; //21335 ~ 21374
25: R_CAL<= 8 ; //21375 ~ 21414
26: R_CAL<= 8 ; //21415 ~ 21454
27: R_CAL<= 8 ; //21455 ~ 21494
28: R_CAL<= 8 ; //21495 ~ 21534
29: R_CAL<= 8 ; //21535 ~ 21574
30: R_CAL<= 8 ; //21575 ~ 21614
31: R_CAL<= 8 ; //21615 ~ 21654
32: R_CAL<= 8 ; //21655 ~ 21694
33: R_CAL<= 8 ; //21695 ~ 21734
34: R_CAL<= 8 ; //21735 ~ 21774
35: R_CAL<= 8 ; //21775 ~ 21814
36: R_CAL<= 8 ; //21815 ~ 21854
37: R_CAL<= 8 ; //21855 ~ 21894
38: R_CAL<= 8 ; //21895 ~ 21934
39: R_CAL<= 8 ; //21935 ~ 21974
40: R_CAL<= 8 ; //21975 ~ 22014
41: R_CAL<= 8 ; //22015 ~ 22054
42: R_CAL<= 7 ; //22055 ~ 22094
43: R_CAL<= 7 ; //22095 ~ 22134
44: R_CAL<= 7 ; //22135 ~ 22174
45: R_CAL<= 7 ; //22175 ~ 22214
46: R_CAL<= 7 ; //22215 ~ 22254
47: R_CAL<= 7 ; //22255 ~ 22294
48: R_CAL<= 7 ; //22295 ~ 22334
49: R_CAL<= 7 ; //22335 ~ 22374
50: R_CAL<= 7 ; //22375 ~ 22414
51: R_CAL<= 7 ; //22415 ~ 22454
52: R_CAL<= 7 ; //22455 ~ 22494
53: R_CAL<= 7 ; //22495 ~ 22534
54: R_CAL<= 7 ; //22535 ~ 22574
55: R_CAL<= 7 ; //22575 ~ 22614
56: R_CAL<= 7 ; //22615 ~ 22654
57: R_CAL<= 7 ; //22655 ~ 22694
58: R_CAL<= 7 ; //22695 ~ 22734
59: R_CAL<= 7 ; //22735 ~ 22774
60: R_CAL<= 8 ; //22775 ~ 22814
61: R_CAL<= 8 ; //22815 ~ 22854
62: R_CAL<= 8 ; //22855 ~ 22894
63: R_CAL<= 8 ; //22895 ~ 22934
64: R_CAL<= 8 ; //22935 ~ 22974
65: R_CAL<= 8 ; //22975 ~ 23014
66: R_CAL<= 8 ; //23015 ~ 23054
67: R_CAL<= 8 ; //23055 ~ 23094
68: R_CAL<= 8 ; //23095 ~ 23134
69: R_CAL<= 8 ; //23135 ~ 23174
70: R_CAL<= 7 ; //23175 ~ 23214
71: R_CAL<= 7 ; //23215 ~ 23254
72: R_CAL<= 7 ; //23255 ~ 23294
73: R_CAL<= 7 ; //23295 ~ 23334
74: R_CAL<= 7 ; //23335 ~ 23374
75: R_CAL<= 7 ; //23375 ~ 23414
76: R_CAL<= 6 ; //23415 ~ 23454
77: R_CAL<= 6 ; //23455 ~ 23494
78: R_CAL<= 6 ; //23495 ~ 23534
79: R_CAL<= 6 ; //23535 ~ 23574
80: R_CAL<= 6 ; //23575 ~ 23614
81: R_CAL<= 6 ; //23615 ~ 23654
82: R_CAL<= 6 ; //23655 ~ 23694
83: R_CAL<= 6 ; //23695 ~ 23734
84: R_CAL<= 6 ; //23735 ~ 23774
85: R_CAL<= 6 ; //23775 ~ 23814
86: R_CAL<= 6 ; //23815 ~ 23854
87: R_CAL<= 6 ; //23855 ~ 23875
default:R_CAL<=R_CAL;
endcase
end
end
endmodule
@@ -0,0 +1,301 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: Chengdu Tiger
// Engineer: Tangxy
//
// Create Date: 14:14:49 09/06/2021
// Design Name:
// Module Name: top
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module Sisyif(
input clk_40m ,
input clk_20m ,
input rst_n ,
//调零至信处接口
input SPI_CLK_F ,//SPI控制,时钟暂定50MHz,用来发送跳频频点、发射MGC值、接收MGC值
input SPI_SYN_F ,//片选
input SPI_MOSI_F ,
output SPI_MISO_F ,
input TP_EN_F ,//跳频使能控制(上升沿更新)
input TR_MGC_F ,//接收发射MGC使能控制(上升沿更新)
input CAL_F ,//校准MGC使能(上升沿更新)
input PRF ,//高发低收,默认接收
//信处至射频接口
output standby ,//高开低待机,默认待机
output SW_PLL ,//乒乓频率源选择0:频率源A —— 1:频率源B
output T ,//发射电源控制
output R ,//接收电源控制
output SW_BPF ,//开关滤波器选择
output SCLK1 ,//锁相环A控制
output SDIO1 ,//
output CS1 ,//
input LD1 ,//
output SCLK2 ,//锁相环B控制
output SDIO2 ,//
output CS2 ,//
input LD2 ,//
output SCLK3 ,//点频源控制
output SDIO3 ,//
output CS3 ,//
input LD3 ,//
output TMGC_16db ,//发射通道MGC控制,高电平衰减
output TMGC_8db ,//
output TMGC_4db ,//
output TMGC_2db ,//
output TMGC_1db ,//
output RMGC_16db ,//四个接收通道MGC控制,同时控制,高电平衰减
output RMGC_8db ,//
output RMGC_4db ,//
output RMGC_2db ,//
output RMGC_1db ,//
output ENABLE ,//SPI控制四个接收通道增益校准
output SC ,//
output SD ,//
output END_SYN ,//
input SDOUT ,//
inout DQ_WD ,//温度传感器
output SW_RX //接收监测控制
);
wire vio_rstn ;
wire [9:0] SYNC_OUT ;
wire [35:0] CONTROL0 ;
wire [35:0] CONTROL1 ;
wire [150:0] TRIG0 ;
wire[15:0] temp_data ;//LSB =0.625 C
wire[7:0] temp ;//LSB =1°C
wire[11:0] hop_fre_code;
wire adf4371_hop1 ;
wire adf4371_hop2 ;
wire [15:0] fre_code ;
wire [7:0] tx_mgc ;
wire [7:0] rx1_mgc ;
wire [7:0] rx2_mgc ;
wire [7:0] rx3_mgc ;
wire [7:0] rx4_mgc ;
wire [3:0] cal1_mgc ;
wire [3:0] cal2_mgc ;
wire [3:0] cal3_mgc ;
wire [3:0] cal4_mgc ;
wire [7:0] tx_cal_mgc ;
wire [3:0] model ;
wire [3:0] rf_en ;
wire [31:0] frame_count;
wire [3:0] ceshi_model;
wire [15:0] current_fre_code ;
wire [15:0] cal_fre_code ;
wire [7:0] R_MGC_1 ;
wire SW_C1;
wire SW;
wire SW2;
wire SW3;
wire [3:0] R_CAL1;
wire [3:0] R_CAL2;
wire [3:0] R_CAL3;
wire [3:0] R_CAL4;
wire [4:0] T_CAL ;
assign temp = temp_data[11:4] ;
assign RMGC_16db = R_MGC_1[4] ;
assign RMGC_8db = R_MGC_1[3] ;
assign RMGC_4db = R_MGC_1[2] ;
assign RMGC_2db = R_MGC_1[1] ;
assign RMGC_1db = R_MGC_1[0] ;
assign standby = rf_en == 4'b0 ;
assign T = PRF ;
assign R = ~PRF ;
assign SW_BPF = SW_C1 ;
assign SW_PLL = SW ;
assign SW_RX = rx2_mgc == 8'b0 ? 1'b0 :1'b1 ;
spi_slave u_spi_slave (
.i_sys_clk(clk_40m),
.i_sys_rst_n(rst_n),
.i_spi_sck(SPI_CLK_F),
.i_spi_cs(SPI_SYN_F),
.i_spi_sdi(SPI_MOSI_F),
.o_frame_count(frame_count),
.o_fre_code(fre_code),
.o_tx_mgc(tx_mgc),
.o_model(model),
.o_rf_en(rf_en),
.o_cal1_mgc(cal1_mgc),
.o_cal2_mgc(cal2_mgc),
.o_cal3_mgc(cal3_mgc),
.o_cal4_mgc(cal4_mgc),
.o_tx_cal_mgc(tx_cal_mgc),
.o_rx1_mgc(rx1_mgc),
.o_rx2_mgc(rx2_mgc),
.o_rx3_mgc(rx3_mgc),
.o_rx4_mgc(rx4_mgc),
.o_ceshi_model(ceshi_model)
);
spi_master u_spi_master (
.i_sys_rst_n (rst_n) ,
.i_clk (clk_40m) ,
//.debug_clk (clk_80m) ,
.i_spi_sck (SPI_CLK_F) ,
.i_spi_cs (SPI_SYN_F) ,
.o_spi_sdo (SPI_MISO_F) ,
.i_spi_sdi (SPI_MOSI_F) ,
.i_LD_LO3 (LD3) ,
.i_LD1 (LD1) ,
.i_LD2 (LD2) ,
.i_cal1_mgc (R_CAL4) ,
.i_cal2_mgc (R_CAL3) ,
.i_cal3_mgc (R_CAL2) ,
.i_cal4_mgc (R_CAL1) ,
.i_temp (temp ) ,
.i_frame_count (frame_count)
);
mgc_ctrl u_mgc_ctrl(
.i_sys_clk (clk_40m ),
.i_rst_n (rst_n ),
.i_TR_SW_F (PRF ),
.i_TP_EN_F (TP_EN_F ),
.i_T_MGC_EN_F (TR_MGC_F ),
.i_R_MGC_EN_F (TR_MGC_F ),
.i_CAL_F (CAL_F ),
.i_fre_code (fre_code ),
.i_tx_mgc (tx_mgc ),
.i_rx1_mgc (rx1_mgc ),
.i_rx2_mgc (rx2_mgc ),
.i_rx3_mgc (rx3_mgc ),
.i_rx4_mgc (rx4_mgc ),
.i_ceshi_module (ceshi_model ),
.o_current_fre_code (current_fre_code ),
.o_cal_fre_code (cal_fre_code ),
.o_hop_fre_code (hop_fre_code ), //0(20.375GHz)~3500(23.875GHz)
.o_adf4371_hop1 (adf4371_hop1 ), //high active
.o_adf4371_hop2 (adf4371_hop2 ),
.o_SW (SW ),
.o_SW2 (SW2 ),
.o_SW3 (SW3 ),
.o_SW_C1 (SW_C1 ),
.o_T_MGC_1dB (TMGC_1db ),
.o_T_MGC_2dB (TMGC_2db ),
.o_T_MGC_4dB (TMGC_4db ),
.o_T_MGC_8dB (TMGC_8db ),
.o_T_MGC_16dB (TMGC_16db ),
.o_R_MGC_1 (R_MGC_1 )
//.o_R_MGC_2 (R_MGC_2 ),
//.o_R_MGC_3 (R_MGC_3 ),
//.o_R_MGC_4 (R_MGC_4 )
);
wire cfgover;
adf4371_a u_adf4371_a (
.sysclk (clk_40m ),
.arstn (rst_n&vio_rstn ),
.cs (CS1 ),
.mux_out (LD1 ),
.sclk (SCLK1 ),
.sdio (SDIO1 ),
.rf_en (rf_en ),
.SW_PLL (SW_PLL ),
.CAL_F (CAL_F ),
.o_cfgover (cfgover ),
.ceshi_model(ceshi_model ),
.adf4371_hop(adf4371_hop1),
.fre_code (hop_fre_code)
);
adf4371_b u_adf4371_b (
.sysclk (clk_40m ),
.arstn (rst_n&vio_rstn),
.cs (CS2 ),
.mux_out (LD2 ),
.sclk (SCLK2 ),
.sdio (SDIO2 ),
.rf_en (rf_en ),
.SW_PLL (SW_PLL ),
.CAL_F (CAL_F ),
.i_cfgover (cfgover ),
.ceshi_model(ceshi_model ),
.adf4371_hop(adf4371_hop2),
.fre_code (hop_fre_code)
);
fre_caliatt u_fre_caliatt (
.i_clk (clk_40m ),
.i_rstn (rst_n ),
.ENABLE (ENABLE ),
.SC (SC ),
.SD (SD ),
.END_SYN (END_SYN ),
.SDOUT (SDOUT ),
.CAL_F (CAL_F ),
.i_temp (temp ),
.i_fre_mode (current_fre_code ),
.i_cal_fre_code (cal_fre_code ),
// .SYNC_OUT (SYNC_OUT ),
.SW (SW ),
.cal1_mgc (cal1_mgc ),
.cal2_mgc (cal2_mgc ),
.cal3_mgc (cal3_mgc ),
.cal4_mgc (cal4_mgc ),
.tx_cal_mgc (tx_cal_mgc ),
.tx_mgc (tx_mgc ),
.i_ceshi_module (ceshi_model ),
.R_CAL1 (R_CAL1 ),
.R_CAL2 (R_CAL2 ),
.R_CAL3 (R_CAL3 ),
.R_CAL4 (R_CAL4 ),
.T_CAL (T_CAL )
);
adf4351_2 u_adf4351 (
.i_sysclk(clk_20m),
.i_arstn(rst_n),
.o_ADF4351_SCK(SCLK3),
.o_ADF4351_DATA(SDIO3),
.o_ADF4351_LE(CS3),
.i_ADF4351_locked(LD3)
);
ds18b20_temp u_temp (
.clk(clk_40m),
.rstn(rst_n),
.dq(DQ_WD),
.temp_data(temp_data)
);
assign vio_rstn = 1'b1;
endmodule
@@ -0,0 +1,631 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 17:05:24 04/08/2022
// Design Name:
// Module Name: T_CAL_
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module T_CAL(
input i_clk ,
input i_rstn ,
input SW ,
input signed[7:0] i_temp ,
input [31:0] hop_fre_mode ,
output reg[4:0] T_CAL_
);
//发射通道
always@(posedge i_clk,negedge i_rstn)begin//1dB 步进
if(!i_rstn)
T_CAL_<='d0;
else if(SW==1'b1)//B环校准值
begin
if(i_temp>=8'sd70)//B环高温校准值
begin
if(hop_fre_mode<=20414) T_CAL_<= 14 ;
else if(hop_fre_mode<=20454) T_CAL_<= 14 ;
else if(hop_fre_mode<=20494) T_CAL_<= 14 ;
else if(hop_fre_mode<=20534) T_CAL_<= 14 ;
else if(hop_fre_mode<=20574) T_CAL_<= 15 ;
else if(hop_fre_mode<=20614) T_CAL_<= 15 ;
else if(hop_fre_mode<=20654) T_CAL_<= 15 ;
else if(hop_fre_mode<=20694) T_CAL_<= 15 ;
else if(hop_fre_mode<=20734) T_CAL_<= 15 ;
else if(hop_fre_mode<=20774) T_CAL_<= 16 ;
else if(hop_fre_mode<=20814) T_CAL_<= 16 ;
else if(hop_fre_mode<=20854) T_CAL_<= 16 ;
else if(hop_fre_mode<=20894) T_CAL_<= 16 ;
else if(hop_fre_mode<=20934) T_CAL_<= 16 ;
else if(hop_fre_mode<=20974) T_CAL_<= 16 ;
else if(hop_fre_mode<=21014) T_CAL_<= 16 ;
else if(hop_fre_mode<=21054) T_CAL_<= 16 ;
else if(hop_fre_mode<=21094) T_CAL_<= 15 ;
else if(hop_fre_mode<=21134) T_CAL_<= 14 ;
else if(hop_fre_mode<=21174) T_CAL_<= 14 ;
else if(hop_fre_mode<=21214) T_CAL_<= 13 ;
else if(hop_fre_mode<=21254) T_CAL_<= 13 ;
else if(hop_fre_mode<=21294) T_CAL_<= 13 ;
else if(hop_fre_mode<=21334) T_CAL_<= 13 ;
else if(hop_fre_mode<=21374) T_CAL_<= 14 ;
else if(hop_fre_mode<=21414) T_CAL_<= 14 ;
else if(hop_fre_mode<=21454) T_CAL_<= 15 ;
else if(hop_fre_mode<=21494) T_CAL_<= 15 ;
else if(hop_fre_mode<=21534) T_CAL_<= 15 ;
else if(hop_fre_mode<=21574) T_CAL_<= 15 ;
else if(hop_fre_mode<=21614) T_CAL_<= 15 ;
else if(hop_fre_mode<=21654) T_CAL_<= 15 ;
else if(hop_fre_mode<=21694) T_CAL_<= 15 ;
else if(hop_fre_mode<=21734) T_CAL_<= 14 ;
else if(hop_fre_mode<=21774) T_CAL_<= 14 ;
else if(hop_fre_mode<=21814) T_CAL_<= 13 ;
else if(hop_fre_mode<=21854) T_CAL_<= 13 ;
else if(hop_fre_mode<=21875) T_CAL_<= 13 ;
else if(hop_fre_mode<=21894) T_CAL_<= 11 ; //21894
else if(hop_fre_mode<=21934) T_CAL_<= 11 ;
else if(hop_fre_mode<=21974) T_CAL_<= 11 ;
else if(hop_fre_mode<=22014) T_CAL_<= 11 ;
else if(hop_fre_mode<=22054) T_CAL_<= 11 ;
else if(hop_fre_mode<=22094) T_CAL_<= 11 ;
else if(hop_fre_mode<=22134) T_CAL_<= 11 ;
else if(hop_fre_mode<=22174) T_CAL_<= 11 ;
else if(hop_fre_mode<=22214) T_CAL_<= 11 ;
else if(hop_fre_mode<=22254) T_CAL_<= 11 ;
else if(hop_fre_mode<=22294) T_CAL_<= 11 ;
else if(hop_fre_mode<=22334) T_CAL_<= 11 ;
else if(hop_fre_mode<=22374) T_CAL_<= 11 ;
else if(hop_fre_mode<=22414) T_CAL_<= 11 ;
else if(hop_fre_mode<=22454) T_CAL_<= 11 ;
else if(hop_fre_mode<=22494) T_CAL_<= 11 ;
else if(hop_fre_mode<=22534) T_CAL_<= 11 ;
else if(hop_fre_mode<=22574) T_CAL_<= 11 ;
else if(hop_fre_mode<=22614) T_CAL_<= 11 ;
else if(hop_fre_mode<=22654) T_CAL_<= 11 ;
else if(hop_fre_mode<=22694) T_CAL_<= 11 ;
else if(hop_fre_mode<=22734) T_CAL_<= 11 ;
else if(hop_fre_mode<=22774) T_CAL_<= 11 ;
else if(hop_fre_mode<=22814) T_CAL_<= 11 ;
else if(hop_fre_mode<=22854) T_CAL_<= 11 ;
else if(hop_fre_mode<=22894) T_CAL_<= 11 ;
else if(hop_fre_mode<=22934) T_CAL_<= 11 ;
else if(hop_fre_mode<=22974) T_CAL_<= 11 ;
else if(hop_fre_mode<=23014) T_CAL_<= 11 ;
else if(hop_fre_mode<=23054) T_CAL_<= 10 ;
else if(hop_fre_mode<=23094) T_CAL_<= 10 ;
else if(hop_fre_mode<=23134) T_CAL_<= 10 ;
else if(hop_fre_mode<=23174) T_CAL_<= 10 ;
else if(hop_fre_mode<=23214) T_CAL_<= 10 ;
else if(hop_fre_mode<=23254) T_CAL_<= 10 ;
else if(hop_fre_mode<=23294) T_CAL_<= 10 ;
else if(hop_fre_mode<=23334) T_CAL_<= 10 ;
else if(hop_fre_mode<=23374) T_CAL_<= 10 ;
else if(hop_fre_mode<=23414) T_CAL_<= 10 ;
else if(hop_fre_mode<=23454) T_CAL_<= 10 ;
else if(hop_fre_mode<=23494) T_CAL_<= 10 ;
else if(hop_fre_mode<=23534) T_CAL_<= 10 ;
else if(hop_fre_mode<=23574) T_CAL_<= 10 ;
else if(hop_fre_mode<=23614) T_CAL_<= 9 ;
else if(hop_fre_mode<=23654) T_CAL_<= 9 ;
else if(hop_fre_mode<=23694) T_CAL_<= 9 ;
else if(hop_fre_mode<=23734) T_CAL_<= 9 ;
else if(hop_fre_mode<=23774) T_CAL_<= 9 ;
else if(hop_fre_mode<=23814) T_CAL_<= 9 ;
else if(hop_fre_mode<=23854) T_CAL_<= 9 ;
else if(hop_fre_mode<=23875) T_CAL_<= 9 ;
end
else if(i_temp>=8'sd0)//B环常温校准值
begin
if(hop_fre_mode<=20414) T_CAL_<= 14 ;
else if(hop_fre_mode<=20454) T_CAL_<= 14 ;
else if(hop_fre_mode<=20494) T_CAL_<= 14 ;
else if(hop_fre_mode<=20534) T_CAL_<= 14 ;
else if(hop_fre_mode<=20574) T_CAL_<= 15 ;
else if(hop_fre_mode<=20614) T_CAL_<= 15 ;
else if(hop_fre_mode<=20654) T_CAL_<= 15 ;
else if(hop_fre_mode<=20694) T_CAL_<= 15 ;
else if(hop_fre_mode<=20734) T_CAL_<= 15 ;
else if(hop_fre_mode<=20774) T_CAL_<= 16 ;
else if(hop_fre_mode<=20814) T_CAL_<= 16 ;
else if(hop_fre_mode<=20854) T_CAL_<= 16 ;
else if(hop_fre_mode<=20894) T_CAL_<= 16 ;
else if(hop_fre_mode<=20934) T_CAL_<= 16 ;
else if(hop_fre_mode<=20974) T_CAL_<= 16 ;
else if(hop_fre_mode<=21014) T_CAL_<= 16 ;
else if(hop_fre_mode<=21054) T_CAL_<= 16 ;
else if(hop_fre_mode<=21094) T_CAL_<= 15 ;
else if(hop_fre_mode<=21134) T_CAL_<= 14 ;
else if(hop_fre_mode<=21174) T_CAL_<= 14 ;
else if(hop_fre_mode<=21214) T_CAL_<= 13 ;
else if(hop_fre_mode<=21254) T_CAL_<= 13 ;
else if(hop_fre_mode<=21294) T_CAL_<= 13 ;
else if(hop_fre_mode<=21334) T_CAL_<= 13 ;
else if(hop_fre_mode<=21374) T_CAL_<= 14 ;
else if(hop_fre_mode<=21414) T_CAL_<= 14 ;
else if(hop_fre_mode<=21454) T_CAL_<= 15 ;
else if(hop_fre_mode<=21494) T_CAL_<= 15 ;
else if(hop_fre_mode<=21534) T_CAL_<= 15 ;
else if(hop_fre_mode<=21574) T_CAL_<= 15 ;
else if(hop_fre_mode<=21614) T_CAL_<= 15 ;
else if(hop_fre_mode<=21654) T_CAL_<= 15 ;
else if(hop_fre_mode<=21694) T_CAL_<= 15 ;
else if(hop_fre_mode<=21734) T_CAL_<= 14 ;
else if(hop_fre_mode<=21774) T_CAL_<= 14 ;
else if(hop_fre_mode<=21814) T_CAL_<= 13 ;
else if(hop_fre_mode<=21854) T_CAL_<= 13 ;
else if(hop_fre_mode<=21875) T_CAL_<= 13 ;
else if(hop_fre_mode<=21894) T_CAL_<= 11 ; //21894
else if(hop_fre_mode<=21934) T_CAL_<= 11 ;
else if(hop_fre_mode<=21974) T_CAL_<= 11 ;
else if(hop_fre_mode<=22014) T_CAL_<= 11 ;
else if(hop_fre_mode<=22054) T_CAL_<= 11 ;
else if(hop_fre_mode<=22094) T_CAL_<= 11 ;
else if(hop_fre_mode<=22134) T_CAL_<= 11 ;
else if(hop_fre_mode<=22174) T_CAL_<= 11 ;
else if(hop_fre_mode<=22214) T_CAL_<= 11 ;
else if(hop_fre_mode<=22254) T_CAL_<= 11 ;
else if(hop_fre_mode<=22294) T_CAL_<= 11 ;
else if(hop_fre_mode<=22334) T_CAL_<= 11 ;
else if(hop_fre_mode<=22374) T_CAL_<= 11 ;
else if(hop_fre_mode<=22414) T_CAL_<= 11 ;
else if(hop_fre_mode<=22454) T_CAL_<= 11 ;
else if(hop_fre_mode<=22494) T_CAL_<= 11 ;
else if(hop_fre_mode<=22534) T_CAL_<= 11 ;
else if(hop_fre_mode<=22574) T_CAL_<= 11 ;
else if(hop_fre_mode<=22614) T_CAL_<= 11 ;
else if(hop_fre_mode<=22654) T_CAL_<= 11 ;
else if(hop_fre_mode<=22694) T_CAL_<= 11 ;
else if(hop_fre_mode<=22734) T_CAL_<= 11 ;
else if(hop_fre_mode<=22774) T_CAL_<= 11 ;
else if(hop_fre_mode<=22814) T_CAL_<= 11 ;
else if(hop_fre_mode<=22854) T_CAL_<= 11 ;
else if(hop_fre_mode<=22894) T_CAL_<= 11 ;
else if(hop_fre_mode<=22934) T_CAL_<= 11 ;
else if(hop_fre_mode<=22974) T_CAL_<= 11 ;
else if(hop_fre_mode<=23014) T_CAL_<= 11 ;
else if(hop_fre_mode<=23054) T_CAL_<= 10 ;
else if(hop_fre_mode<=23094) T_CAL_<= 10 ;
else if(hop_fre_mode<=23134) T_CAL_<= 10 ;
else if(hop_fre_mode<=23174) T_CAL_<= 10 ;
else if(hop_fre_mode<=23214) T_CAL_<= 10 ;
else if(hop_fre_mode<=23254) T_CAL_<= 10 ;
else if(hop_fre_mode<=23294) T_CAL_<= 10 ;
else if(hop_fre_mode<=23334) T_CAL_<= 10 ;
else if(hop_fre_mode<=23374) T_CAL_<= 10 ;
else if(hop_fre_mode<=23414) T_CAL_<= 10 ;
else if(hop_fre_mode<=23454) T_CAL_<= 10 ;
else if(hop_fre_mode<=23494) T_CAL_<= 10 ;
else if(hop_fre_mode<=23534) T_CAL_<= 10 ;
else if(hop_fre_mode<=23574) T_CAL_<= 10 ;
else if(hop_fre_mode<=23614) T_CAL_<= 9 ;
else if(hop_fre_mode<=23654) T_CAL_<= 9 ;
else if(hop_fre_mode<=23694) T_CAL_<= 9 ;
else if(hop_fre_mode<=23734) T_CAL_<= 9 ;
else if(hop_fre_mode<=23774) T_CAL_<= 9 ;
else if(hop_fre_mode<=23814) T_CAL_<= 9 ;
else if(hop_fre_mode<=23854) T_CAL_<= 9 ;
else if(hop_fre_mode<=23875) T_CAL_<= 9 ;
end
else //B环低温校准值
begin
if(hop_fre_mode<=20414) T_CAL_<= 14 ;
else if(hop_fre_mode<=20454) T_CAL_<= 14 ;
else if(hop_fre_mode<=20494) T_CAL_<= 14 ;
else if(hop_fre_mode<=20534) T_CAL_<= 14 ;
else if(hop_fre_mode<=20574) T_CAL_<= 15 ;
else if(hop_fre_mode<=20614) T_CAL_<= 15 ;
else if(hop_fre_mode<=20654) T_CAL_<= 15 ;
else if(hop_fre_mode<=20694) T_CAL_<= 15 ;
else if(hop_fre_mode<=20734) T_CAL_<= 15 ;
else if(hop_fre_mode<=20774) T_CAL_<= 16 ;
else if(hop_fre_mode<=20814) T_CAL_<= 16 ;
else if(hop_fre_mode<=20854) T_CAL_<= 16 ;
else if(hop_fre_mode<=20894) T_CAL_<= 16 ;
else if(hop_fre_mode<=20934) T_CAL_<= 16 ;
else if(hop_fre_mode<=20974) T_CAL_<= 16 ;
else if(hop_fre_mode<=21014) T_CAL_<= 16 ;
else if(hop_fre_mode<=21054) T_CAL_<= 16 ;
else if(hop_fre_mode<=21094) T_CAL_<= 15 ;
else if(hop_fre_mode<=21134) T_CAL_<= 14 ;
else if(hop_fre_mode<=21174) T_CAL_<= 14 ;
else if(hop_fre_mode<=21214) T_CAL_<= 13 ;
else if(hop_fre_mode<=21254) T_CAL_<= 13 ;
else if(hop_fre_mode<=21294) T_CAL_<= 13 ;
else if(hop_fre_mode<=21334) T_CAL_<= 13 ;
else if(hop_fre_mode<=21374) T_CAL_<= 14 ;
else if(hop_fre_mode<=21414) T_CAL_<= 14 ;
else if(hop_fre_mode<=21454) T_CAL_<= 15 ;
else if(hop_fre_mode<=21494) T_CAL_<= 15 ;
else if(hop_fre_mode<=21534) T_CAL_<= 15 ;
else if(hop_fre_mode<=21574) T_CAL_<= 15 ;
else if(hop_fre_mode<=21614) T_CAL_<= 15 ;
else if(hop_fre_mode<=21654) T_CAL_<= 15 ;
else if(hop_fre_mode<=21694) T_CAL_<= 15 ;
else if(hop_fre_mode<=21734) T_CAL_<= 14 ;
else if(hop_fre_mode<=21774) T_CAL_<= 14 ;
else if(hop_fre_mode<=21814) T_CAL_<= 13 ;
else if(hop_fre_mode<=21854) T_CAL_<= 13 ;
else if(hop_fre_mode<=21875) T_CAL_<= 13 ;
else if(hop_fre_mode<=21894) T_CAL_<= 11 ; //21894
else if(hop_fre_mode<=21934) T_CAL_<= 11 ;
else if(hop_fre_mode<=21974) T_CAL_<= 11 ;
else if(hop_fre_mode<=22014) T_CAL_<= 11 ;
else if(hop_fre_mode<=22054) T_CAL_<= 11 ;
else if(hop_fre_mode<=22094) T_CAL_<= 11 ;
else if(hop_fre_mode<=22134) T_CAL_<= 11 ;
else if(hop_fre_mode<=22174) T_CAL_<= 11 ;
else if(hop_fre_mode<=22214) T_CAL_<= 11 ;
else if(hop_fre_mode<=22254) T_CAL_<= 11 ;
else if(hop_fre_mode<=22294) T_CAL_<= 11 ;
else if(hop_fre_mode<=22334) T_CAL_<= 11 ;
else if(hop_fre_mode<=22374) T_CAL_<= 11 ;
else if(hop_fre_mode<=22414) T_CAL_<= 11 ;
else if(hop_fre_mode<=22454) T_CAL_<= 11 ;
else if(hop_fre_mode<=22494) T_CAL_<= 11 ;
else if(hop_fre_mode<=22534) T_CAL_<= 11 ;
else if(hop_fre_mode<=22574) T_CAL_<= 11 ;
else if(hop_fre_mode<=22614) T_CAL_<= 11 ;
else if(hop_fre_mode<=22654) T_CAL_<= 11 ;
else if(hop_fre_mode<=22694) T_CAL_<= 11 ;
else if(hop_fre_mode<=22734) T_CAL_<= 11 ;
else if(hop_fre_mode<=22774) T_CAL_<= 11 ;
else if(hop_fre_mode<=22814) T_CAL_<= 11 ;
else if(hop_fre_mode<=22854) T_CAL_<= 11 ;
else if(hop_fre_mode<=22894) T_CAL_<= 11 ;
else if(hop_fre_mode<=22934) T_CAL_<= 11 ;
else if(hop_fre_mode<=22974) T_CAL_<= 11 ;
else if(hop_fre_mode<=23014) T_CAL_<= 11 ;
else if(hop_fre_mode<=23054) T_CAL_<= 10 ;
else if(hop_fre_mode<=23094) T_CAL_<= 10 ;
else if(hop_fre_mode<=23134) T_CAL_<= 10 ;
else if(hop_fre_mode<=23174) T_CAL_<= 10 ;
else if(hop_fre_mode<=23214) T_CAL_<= 10 ;
else if(hop_fre_mode<=23254) T_CAL_<= 10 ;
else if(hop_fre_mode<=23294) T_CAL_<= 10 ;
else if(hop_fre_mode<=23334) T_CAL_<= 10 ;
else if(hop_fre_mode<=23374) T_CAL_<= 10 ;
else if(hop_fre_mode<=23414) T_CAL_<= 10 ;
else if(hop_fre_mode<=23454) T_CAL_<= 10 ;
else if(hop_fre_mode<=23494) T_CAL_<= 10 ;
else if(hop_fre_mode<=23534) T_CAL_<= 10 ;
else if(hop_fre_mode<=23574) T_CAL_<= 10 ;
else if(hop_fre_mode<=23614) T_CAL_<= 9 ;
else if(hop_fre_mode<=23654) T_CAL_<= 9 ;
else if(hop_fre_mode<=23694) T_CAL_<= 9 ;
else if(hop_fre_mode<=23734) T_CAL_<= 9 ;
else if(hop_fre_mode<=23774) T_CAL_<= 9 ;
else if(hop_fre_mode<=23814) T_CAL_<= 9 ;
else if(hop_fre_mode<=23854) T_CAL_<= 9 ;
else if(hop_fre_mode<=23875) T_CAL_<= 9 ;
end
end
else //A环校准值
begin
if(i_temp>=8'sd70)//A环高温校准值
begin
if(hop_fre_mode<=20414) T_CAL_<= 14 ;
else if(hop_fre_mode<=20454) T_CAL_<= 14 ;
else if(hop_fre_mode<=20494) T_CAL_<= 14 ;
else if(hop_fre_mode<=20534) T_CAL_<= 14 ;
else if(hop_fre_mode<=20574) T_CAL_<= 15 ;
else if(hop_fre_mode<=20614) T_CAL_<= 15 ;
else if(hop_fre_mode<=20654) T_CAL_<= 15 ;
else if(hop_fre_mode<=20694) T_CAL_<= 15 ;
else if(hop_fre_mode<=20734) T_CAL_<= 15 ;
else if(hop_fre_mode<=20774) T_CAL_<= 16 ;
else if(hop_fre_mode<=20814) T_CAL_<= 16 ;
else if(hop_fre_mode<=20854) T_CAL_<= 16 ;
else if(hop_fre_mode<=20894) T_CAL_<= 16 ;
else if(hop_fre_mode<=20934) T_CAL_<= 16 ;
else if(hop_fre_mode<=20974) T_CAL_<= 16 ;
else if(hop_fre_mode<=21014) T_CAL_<= 16 ;
else if(hop_fre_mode<=21054) T_CAL_<= 16 ;
else if(hop_fre_mode<=21094) T_CAL_<= 15 ;
else if(hop_fre_mode<=21134) T_CAL_<= 14 ;
else if(hop_fre_mode<=21174) T_CAL_<= 14 ;
else if(hop_fre_mode<=21214) T_CAL_<= 13 ;
else if(hop_fre_mode<=21254) T_CAL_<= 13 ;
else if(hop_fre_mode<=21294) T_CAL_<= 13 ;
else if(hop_fre_mode<=21334) T_CAL_<= 13 ;
else if(hop_fre_mode<=21374) T_CAL_<= 14 ;
else if(hop_fre_mode<=21414) T_CAL_<= 14 ;
else if(hop_fre_mode<=21454) T_CAL_<= 15 ;
else if(hop_fre_mode<=21494) T_CAL_<= 15 ;
else if(hop_fre_mode<=21534) T_CAL_<= 15 ;
else if(hop_fre_mode<=21574) T_CAL_<= 15 ;
else if(hop_fre_mode<=21614) T_CAL_<= 15 ;
else if(hop_fre_mode<=21654) T_CAL_<= 15 ;
else if(hop_fre_mode<=21694) T_CAL_<= 15 ;
else if(hop_fre_mode<=21734) T_CAL_<= 14 ;
else if(hop_fre_mode<=21774) T_CAL_<= 14 ;
else if(hop_fre_mode<=21814) T_CAL_<= 13 ;
else if(hop_fre_mode<=21854) T_CAL_<= 13 ;
else if(hop_fre_mode<=21875) T_CAL_<= 13 ;
else if(hop_fre_mode<=21894) T_CAL_<= 11 ; //21894
else if(hop_fre_mode<=21934) T_CAL_<= 11 ;
else if(hop_fre_mode<=21974) T_CAL_<= 11 ;
else if(hop_fre_mode<=22014) T_CAL_<= 11 ;
else if(hop_fre_mode<=22054) T_CAL_<= 11 ;
else if(hop_fre_mode<=22094) T_CAL_<= 11 ;
else if(hop_fre_mode<=22134) T_CAL_<= 11 ;
else if(hop_fre_mode<=22174) T_CAL_<= 11 ;
else if(hop_fre_mode<=22214) T_CAL_<= 11 ;
else if(hop_fre_mode<=22254) T_CAL_<= 11 ;
else if(hop_fre_mode<=22294) T_CAL_<= 11 ;
else if(hop_fre_mode<=22334) T_CAL_<= 11 ;
else if(hop_fre_mode<=22374) T_CAL_<= 11 ;
else if(hop_fre_mode<=22414) T_CAL_<= 11 ;
else if(hop_fre_mode<=22454) T_CAL_<= 11 ;
else if(hop_fre_mode<=22494) T_CAL_<= 11 ;
else if(hop_fre_mode<=22534) T_CAL_<= 11 ;
else if(hop_fre_mode<=22574) T_CAL_<= 11 ;
else if(hop_fre_mode<=22614) T_CAL_<= 11 ;
else if(hop_fre_mode<=22654) T_CAL_<= 11 ;
else if(hop_fre_mode<=22694) T_CAL_<= 11 ;
else if(hop_fre_mode<=22734) T_CAL_<= 11 ;
else if(hop_fre_mode<=22774) T_CAL_<= 11 ;
else if(hop_fre_mode<=22814) T_CAL_<= 11 ;
else if(hop_fre_mode<=22854) T_CAL_<= 11 ;
else if(hop_fre_mode<=22894) T_CAL_<= 11 ;
else if(hop_fre_mode<=22934) T_CAL_<= 11 ;
else if(hop_fre_mode<=22974) T_CAL_<= 11 ;
else if(hop_fre_mode<=23014) T_CAL_<= 11 ;
else if(hop_fre_mode<=23054) T_CAL_<= 10 ;
else if(hop_fre_mode<=23094) T_CAL_<= 10 ;
else if(hop_fre_mode<=23134) T_CAL_<= 10 ;
else if(hop_fre_mode<=23174) T_CAL_<= 10 ;
else if(hop_fre_mode<=23214) T_CAL_<= 10 ;
else if(hop_fre_mode<=23254) T_CAL_<= 10 ;
else if(hop_fre_mode<=23294) T_CAL_<= 10 ;
else if(hop_fre_mode<=23334) T_CAL_<= 10 ;
else if(hop_fre_mode<=23374) T_CAL_<= 10 ;
else if(hop_fre_mode<=23414) T_CAL_<= 10 ;
else if(hop_fre_mode<=23454) T_CAL_<= 10 ;
else if(hop_fre_mode<=23494) T_CAL_<= 10 ;
else if(hop_fre_mode<=23534) T_CAL_<= 10 ;
else if(hop_fre_mode<=23574) T_CAL_<= 10 ;
else if(hop_fre_mode<=23614) T_CAL_<= 9 ;
else if(hop_fre_mode<=23654) T_CAL_<= 9 ;
else if(hop_fre_mode<=23694) T_CAL_<= 9 ;
else if(hop_fre_mode<=23734) T_CAL_<= 9 ;
else if(hop_fre_mode<=23774) T_CAL_<= 9 ;
else if(hop_fre_mode<=23814) T_CAL_<= 9 ;
else if(hop_fre_mode<=23854) T_CAL_<= 9 ;
else if(hop_fre_mode<=23875) T_CAL_<= 9 ;
end
else if(i_temp>=8'sd0)//A环常温校准值
begin
if(hop_fre_mode<=20414) T_CAL_<= 14 ; //20375 ~ 20414
else if(hop_fre_mode<=20454) T_CAL_<= 14 ; //20415 ~ 20454
else if(hop_fre_mode<=20494) T_CAL_<= 14 ; //20455 ~ 20494
else if(hop_fre_mode<=20534) T_CAL_<= 14 ; //20495 ~ 20534
else if(hop_fre_mode<=20574) T_CAL_<= 15 ; //20535 ~ 20574
else if(hop_fre_mode<=20614) T_CAL_<= 15 ; //20575 ~ 20614
else if(hop_fre_mode<=20654) T_CAL_<= 15 ; //20615 ~ 20654
else if(hop_fre_mode<=20694) T_CAL_<= 15 ; //20655 ~ 20694
else if(hop_fre_mode<=20734) T_CAL_<= 15 ; //20695 ~ 20734
else if(hop_fre_mode<=20774) T_CAL_<= 16 ; //20735 ~ 20774
else if(hop_fre_mode<=20814) T_CAL_<= 16 ; //20775 ~ 20814
else if(hop_fre_mode<=20854) T_CAL_<= 16 ; //20815 ~ 20854
else if(hop_fre_mode<=20894) T_CAL_<= 16 ; //20855 ~ 20894
else if(hop_fre_mode<=20934) T_CAL_<= 16 ; //20895 ~ 20934
else if(hop_fre_mode<=20974) T_CAL_<= 16 ; //20935 ~ 20974
else if(hop_fre_mode<=21014) T_CAL_<= 16 ; //20975 ~ 21014
else if(hop_fre_mode<=21054) T_CAL_<= 16 ; //21015 ~ 21054
else if(hop_fre_mode<=21094) T_CAL_<= 15 ; //21055 ~ 21094
else if(hop_fre_mode<=21134) T_CAL_<= 14 ; //21095 ~ 21134
else if(hop_fre_mode<=21174) T_CAL_<= 14 ; //21135 ~ 21174
else if(hop_fre_mode<=21214) T_CAL_<= 13 ; //21175 ~ 21214
else if(hop_fre_mode<=21254) T_CAL_<= 13 ; //21215 ~ 21254
else if(hop_fre_mode<=21294) T_CAL_<= 13 ; //21255 ~ 21294
else if(hop_fre_mode<=21334) T_CAL_<= 13 ; //21295 ~ 21334
else if(hop_fre_mode<=21374) T_CAL_<= 14 ; //21335 ~ 21374
else if(hop_fre_mode<=21414) T_CAL_<= 14 ; //21375 ~ 21414
else if(hop_fre_mode<=21454) T_CAL_<= 15 ; //21415 ~ 21454
else if(hop_fre_mode<=21494) T_CAL_<= 15 ; //21455 ~ 21494
else if(hop_fre_mode<=21534) T_CAL_<= 15 ; //21495 ~ 21534
else if(hop_fre_mode<=21574) T_CAL_<= 15 ; //21535 ~ 21574
else if(hop_fre_mode<=21614) T_CAL_<= 15 ; //21575 ~ 21614
else if(hop_fre_mode<=21654) T_CAL_<= 15 ; //21615 ~ 21654
else if(hop_fre_mode<=21694) T_CAL_<= 15 ; //21655 ~ 21694
else if(hop_fre_mode<=21734) T_CAL_<= 14 ; //21695 ~ 21734
else if(hop_fre_mode<=21774) T_CAL_<= 14 ; //21735 ~ 21774
else if(hop_fre_mode<=21814) T_CAL_<= 13 ; //21775 ~ 21814
else if(hop_fre_mode<=21854) T_CAL_<= 13 ; //21815 ~ 21854
else if(hop_fre_mode<=21875) T_CAL_<= 13 ; //21855 ~ 21875
else if(hop_fre_mode<=21894) T_CAL_<= 11 ; //21874 ~ 21894
else if(hop_fre_mode<=21934) T_CAL_<= 11 ; //21895 ~ 21934
else if(hop_fre_mode<=21974) T_CAL_<= 11 ; //21935 ~ 21974
else if(hop_fre_mode<=22014) T_CAL_<= 11 ; //21975 ~ 22014
else if(hop_fre_mode<=22054) T_CAL_<= 11 ; //22015 ~ 22054
else if(hop_fre_mode<=22094) T_CAL_<= 11 ; //22055 ~ 22094
else if(hop_fre_mode<=22134) T_CAL_<= 11 ; //22095 ~ 22134
else if(hop_fre_mode<=22174) T_CAL_<= 11 ; //22135 ~ 22174
else if(hop_fre_mode<=22214) T_CAL_<= 11 ; //22175 ~ 22214
else if(hop_fre_mode<=22254) T_CAL_<= 11 ; //22215 ~ 22254
else if(hop_fre_mode<=22294) T_CAL_<= 11 ; //22255 ~ 22294
else if(hop_fre_mode<=22334) T_CAL_<= 11 ; //22295 ~ 22334
else if(hop_fre_mode<=22374) T_CAL_<= 11 ; //22335 ~ 22374
else if(hop_fre_mode<=22414) T_CAL_<= 11 ; //22375 ~ 22414
else if(hop_fre_mode<=22454) T_CAL_<= 11 ; //22415 ~ 22454
else if(hop_fre_mode<=22494) T_CAL_<= 11 ; //22455 ~ 22494
else if(hop_fre_mode<=22534) T_CAL_<= 11 ; //22495 ~ 22534
else if(hop_fre_mode<=22574) T_CAL_<= 11 ; //22535 ~ 22574
else if(hop_fre_mode<=22614) T_CAL_<= 11 ; //22575 ~ 22614
else if(hop_fre_mode<=22654) T_CAL_<= 11 ; //22615 ~ 22654
else if(hop_fre_mode<=22694) T_CAL_<= 11 ; //22655 ~ 22694
else if(hop_fre_mode<=22734) T_CAL_<= 11 ; //22695 ~ 22734
else if(hop_fre_mode<=22774) T_CAL_<= 11 ; //22735 ~ 22774
else if(hop_fre_mode<=22814) T_CAL_<= 11 ; //22775 ~ 22814
else if(hop_fre_mode<=22854) T_CAL_<= 11 ; //22815 ~ 22854
else if(hop_fre_mode<=22894) T_CAL_<= 11 ; //22855 ~ 22894
else if(hop_fre_mode<=22934) T_CAL_<= 11 ; //22895 ~ 22934
else if(hop_fre_mode<=22974) T_CAL_<= 11 ; //22935 ~ 22974
else if(hop_fre_mode<=23014) T_CAL_<= 11 ; //22975 ~ 23014
else if(hop_fre_mode<=23054) T_CAL_<= 10 ; //23015 ~ 23054
else if(hop_fre_mode<=23094) T_CAL_<= 10 ; //23055 ~ 23094
else if(hop_fre_mode<=23134) T_CAL_<= 10 ; //23095 ~ 23134
else if(hop_fre_mode<=23174) T_CAL_<= 10 ; //23135 ~ 23174
else if(hop_fre_mode<=23214) T_CAL_<= 10 ; //23175 ~ 23214
else if(hop_fre_mode<=23254) T_CAL_<= 10 ; //23215 ~ 23254
else if(hop_fre_mode<=23294) T_CAL_<= 10 ; //23255 ~ 23294
else if(hop_fre_mode<=23334) T_CAL_<= 10 ; //23295 ~ 23334
else if(hop_fre_mode<=23374) T_CAL_<= 10 ; //23335 ~ 23374
else if(hop_fre_mode<=23414) T_CAL_<= 10 ; //23375 ~ 23414
else if(hop_fre_mode<=23454) T_CAL_<= 10 ; //23415 ~ 23454
else if(hop_fre_mode<=23494) T_CAL_<= 10 ; //23455 ~ 23494
else if(hop_fre_mode<=23534) T_CAL_<= 10 ; //23495 ~ 23534
else if(hop_fre_mode<=23574) T_CAL_<= 10 ; //23535 ~ 23574
else if(hop_fre_mode<=23614) T_CAL_<= 9 ; //23575 ~ 23614
else if(hop_fre_mode<=23654) T_CAL_<= 9 ; //23615 ~ 23654
else if(hop_fre_mode<=23694) T_CAL_<= 9 ; //23655 ~ 23694
else if(hop_fre_mode<=23734) T_CAL_<= 9 ; //23695 ~ 23734
else if(hop_fre_mode<=23774) T_CAL_<= 9 ; //23735 ~ 23774
else if(hop_fre_mode<=23814) T_CAL_<= 9 ; //23775 ~ 23814
else if(hop_fre_mode<=23854) T_CAL_<= 9 ; //23815 ~ 23854
else if(hop_fre_mode<=23875) T_CAL_<= 9 ; //23855 ~ 23875
end
else //A环低温校准值
begin
if(hop_fre_mode<=20414) T_CAL_<= 14 ;
else if(hop_fre_mode<=20454) T_CAL_<= 14 ;
else if(hop_fre_mode<=20494) T_CAL_<= 14 ;
else if(hop_fre_mode<=20534) T_CAL_<= 14 ;
else if(hop_fre_mode<=20574) T_CAL_<= 15 ;
else if(hop_fre_mode<=20614) T_CAL_<= 15 ;
else if(hop_fre_mode<=20654) T_CAL_<= 15 ;
else if(hop_fre_mode<=20694) T_CAL_<= 15 ;
else if(hop_fre_mode<=20734) T_CAL_<= 15 ;
else if(hop_fre_mode<=20774) T_CAL_<= 16 ;
else if(hop_fre_mode<=20814) T_CAL_<= 16 ;
else if(hop_fre_mode<=20854) T_CAL_<= 16 ;
else if(hop_fre_mode<=20894) T_CAL_<= 16 ;
else if(hop_fre_mode<=20934) T_CAL_<= 16 ;
else if(hop_fre_mode<=20974) T_CAL_<= 16 ;
else if(hop_fre_mode<=21014) T_CAL_<= 16 ;
else if(hop_fre_mode<=21054) T_CAL_<= 16 ;
else if(hop_fre_mode<=21094) T_CAL_<= 15 ;
else if(hop_fre_mode<=21134) T_CAL_<= 14 ;
else if(hop_fre_mode<=21174) T_CAL_<= 14 ;
else if(hop_fre_mode<=21214) T_CAL_<= 13 ;
else if(hop_fre_mode<=21254) T_CAL_<= 13 ;
else if(hop_fre_mode<=21294) T_CAL_<= 13 ;
else if(hop_fre_mode<=21334) T_CAL_<= 13 ;
else if(hop_fre_mode<=21374) T_CAL_<= 14 ;
else if(hop_fre_mode<=21414) T_CAL_<= 14 ;
else if(hop_fre_mode<=21454) T_CAL_<= 15 ;
else if(hop_fre_mode<=21494) T_CAL_<= 15 ;
else if(hop_fre_mode<=21534) T_CAL_<= 15 ;
else if(hop_fre_mode<=21574) T_CAL_<= 15 ;
else if(hop_fre_mode<=21614) T_CAL_<= 15 ;
else if(hop_fre_mode<=21654) T_CAL_<= 15 ;
else if(hop_fre_mode<=21694) T_CAL_<= 15 ;
else if(hop_fre_mode<=21734) T_CAL_<= 14 ;
else if(hop_fre_mode<=21774) T_CAL_<= 14 ;
else if(hop_fre_mode<=21814) T_CAL_<= 13 ;
else if(hop_fre_mode<=21854) T_CAL_<= 13 ;
else if(hop_fre_mode<=21875) T_CAL_<= 13 ;
else if(hop_fre_mode<=21894) T_CAL_<= 11 ; //21894
else if(hop_fre_mode<=21934) T_CAL_<= 11 ;
else if(hop_fre_mode<=21974) T_CAL_<= 11 ;
else if(hop_fre_mode<=22014) T_CAL_<= 11 ;
else if(hop_fre_mode<=22054) T_CAL_<= 11 ;
else if(hop_fre_mode<=22094) T_CAL_<= 11 ;
else if(hop_fre_mode<=22134) T_CAL_<= 11 ;
else if(hop_fre_mode<=22174) T_CAL_<= 11 ;
else if(hop_fre_mode<=22214) T_CAL_<= 11 ;
else if(hop_fre_mode<=22254) T_CAL_<= 11 ;
else if(hop_fre_mode<=22294) T_CAL_<= 11 ;
else if(hop_fre_mode<=22334) T_CAL_<= 11 ;
else if(hop_fre_mode<=22374) T_CAL_<= 11 ;
else if(hop_fre_mode<=22414) T_CAL_<= 11 ;
else if(hop_fre_mode<=22454) T_CAL_<= 11 ;
else if(hop_fre_mode<=22494) T_CAL_<= 11 ;
else if(hop_fre_mode<=22534) T_CAL_<= 11 ;
else if(hop_fre_mode<=22574) T_CAL_<= 11 ;
else if(hop_fre_mode<=22614) T_CAL_<= 11 ;
else if(hop_fre_mode<=22654) T_CAL_<= 11 ;
else if(hop_fre_mode<=22694) T_CAL_<= 11 ;
else if(hop_fre_mode<=22734) T_CAL_<= 11 ;
else if(hop_fre_mode<=22774) T_CAL_<= 11 ;
else if(hop_fre_mode<=22814) T_CAL_<= 11 ;
else if(hop_fre_mode<=22854) T_CAL_<= 11 ;
else if(hop_fre_mode<=22894) T_CAL_<= 11 ;
else if(hop_fre_mode<=22934) T_CAL_<= 11 ;
else if(hop_fre_mode<=22974) T_CAL_<= 11 ;
else if(hop_fre_mode<=23014) T_CAL_<= 11 ;
else if(hop_fre_mode<=23054) T_CAL_<= 10 ;
else if(hop_fre_mode<=23094) T_CAL_<= 10 ;
else if(hop_fre_mode<=23134) T_CAL_<= 10 ;
else if(hop_fre_mode<=23174) T_CAL_<= 10 ;
else if(hop_fre_mode<=23214) T_CAL_<= 10 ;
else if(hop_fre_mode<=23254) T_CAL_<= 10 ;
else if(hop_fre_mode<=23294) T_CAL_<= 10 ;
else if(hop_fre_mode<=23334) T_CAL_<= 10 ;
else if(hop_fre_mode<=23374) T_CAL_<= 10 ;
else if(hop_fre_mode<=23414) T_CAL_<= 10 ;
else if(hop_fre_mode<=23454) T_CAL_<= 10 ;
else if(hop_fre_mode<=23494) T_CAL_<= 10 ;
else if(hop_fre_mode<=23534) T_CAL_<= 10 ;
else if(hop_fre_mode<=23574) T_CAL_<= 10 ;
else if(hop_fre_mode<=23614) T_CAL_<= 9 ;
else if(hop_fre_mode<=23654) T_CAL_<= 9 ;
else if(hop_fre_mode<=23694) T_CAL_<= 9 ;
else if(hop_fre_mode<=23734) T_CAL_<= 9 ;
else if(hop_fre_mode<=23774) T_CAL_<= 9 ;
else if(hop_fre_mode<=23814) T_CAL_<= 9 ;
else if(hop_fre_mode<=23854) T_CAL_<= 9 ;
else if(hop_fre_mode<=23875) T_CAL_<= 9 ;
end
end
end
endmodule
@@ -0,0 +1,633 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2021/8/13 00:24:20
// Design Name:
// Module Name: LMX2595
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
// fRFOUT= (INT+ (FRAC1+FRAC2/MOD2)/MOD1)× (fPFD/R)
// fPFD = fPFD = REFIN × ((1 + D)/(R × (1 + T)))
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//////////////////////////////////////////////////////////////////////////////////
module adf4371_a(//20.375Ghz ~ 23.875Ghz
input sysclk ,//40MHZ
input arstn ,
output cs ,
input mux_out ,
output sclk ,
output sdio ,
input [3:0] rf_en ,
input SW_PLL ,
input CAL_F ,
input [3:0] ceshi_model ,
input adf4371_hop ,
output o_cfgover ,
input[11:0] fre_code
);
localparam DATA_WIDTH = 24 ;
localparam DATA_LENTH = 72 ;
localparam WAIT_ld = 40000 ;
//*****************************************************************************
reg[7:0] cnt_word = 8'd0 ;
reg csb_reg = 1'b1 ;
reg[5:0] cnt_bits = 6'd0 ;
reg[DATA_WIDTH-1:0] cfgdata = 0, regdata = 0 ;
reg[3:0] state = 4'b000 ;
reg spi_sdo = 1'b0, spi_csb = 1'b1;
wire pll_locked ;
reg cfgover ;
reg[31:0] cnt_lock = 32'd0 ;
reg[31:0] cnt_locked = 32'd0 ;
wire[15:0] band ;
assign o_cfgover =cfgover ;
//-----------------------------------
assign pll_locked = mux_out ;
assign sclk = spi_csb ? 1'b0 : ~sysclk ;
assign cs = spi_csb & csb_reg ;
assign sdio = spi_sdo ;
//-----------------------------------
wire [7:0] SI_BAND_SEL ; //VCO频段
wire [7:0] SI_VCO_SEL_BIAS_CODE ; //[7:4]=VCO内核, [3:0]=VCO偏置
reg[13:0] MOD2 ;
reg[13:0] FRAC2 ;
reg[24:0] FRAC1 ;
reg[15:0] INT ;
assign SI_BAND_SEL = band[15:8] ;
assign SI_VCO_SEL_BIAS_CODE = band[7:0] ;
reg[2:0] hop_en ;
reg[15:0] code ;
reg[11:0] pre_fre_code ;
reg[3:0] rf_en_r ;
reg[2:0] CAL_F_R ;
reg [3:0] R_DIV ;
reg [3:0] D ;
wire[13:0] douta3 ;
wire[13:0] douta4 ;
wire[24:0] douta2 ;
wire[15:0] douta1 ;
//-----------------------------------
INT_ROMb int_rom (
.sysclk(sysclk),
.addra(code),
.douta(douta1)
);
// Instantiate the module
FRAC1 frac1_rom (
.clka(sysclk),
.addra(code),
.douta(douta2)
);
// FRAC1_ROM FRAC1_ROM (
// .clka(sysclk), // input clka
// .addra(code), // input [11 : 0] addra
// .douta(douta2) // output [24 : 0] douta
//);
frac2_rom frac2_rom (
.sysclk(sysclk),
.addra(code),
.douta(douta4)
);
mod2_rom mod2_rom (
.sysclk(sysclk),
.addra(code),
.douta(douta3)
);
band_rom_a band_rom_a (
.sysclk(sysclk),
.addra(code),
.douta(band) // output [15 : 0] douta
);
//-------------------整数边界杂散用66.666666Mhz鉴相----------------------------------
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
INT<=douta1;
else if(code==24 || code==26 )
INT<=76;
else if(code==424 )
INT<=77;
else if(code==426 )
INT<=78;
else if(code==824 || code==826 )
INT<=79;
else if(code==1224)
INT<=80;
else if(code==1226 )
INT<=81;
else if(code==1624 || code==1626 )
INT<=82;
else if(code==2024 )
INT<=83;
else if(code==2026 )
INT<=84;
else if(code==2424 || code==2426 )
INT<=85;
else if(code==2824 )
INT<=86;
else if( code==2826 )
INT<=87;
else
INT<=douta1;
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
FRAC1<=douta2;
else if(code==24 )
FRAC1<=16651386;
else if(code==26 )
FRAC1<=16903045;
else if(code==424 )
FRAC1<=33428602;
else if(code==426 )
FRAC1<=125829;
else if(code==824 )
FRAC1<=16651386;
else if(code==826 )
FRAC1<=16903045;
else if(code==1224)
FRAC1<=33428602;
else if(code==1226 )
FRAC1<=125829;
else if(code==1624)
FRAC1<=16651386;
else if(code==1626 )
FRAC1<=16903045;
else if(code==2024 )
FRAC1<=33428602;
else if(code==2026 )
FRAC1<=125829;
else if(code==2424 )
FRAC1<=16651386;
else if(code==2426 )
FRAC1<=16903045;
else if(code==2824 )
FRAC1<=33428602;
else if( code==2826 )
FRAC1<=125829;
else
FRAC1<=douta2;
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
MOD2<=douta3;
else if(code==24 )
MOD2<=25;
else if(code==26 )
MOD2<=25;
else if(code==424 )
MOD2<=25;
else if(code==426 )
MOD2<=25;
else if(code==824 )
MOD2<=25;
else if(code==826 )
MOD2<=25;
else if(code==1224)
MOD2<=25;
else if(code==1226 )
MOD2<=25;
else if(code==1624)
MOD2<=25;
else if(code==1626 )
MOD2<=25;
else if(code==2024 )
MOD2<=25;
else if(code==2026 )
MOD2<=25;
else if(code==2424 )
MOD2<=25;
else if(code==2426 )
MOD2<=25;
else if(code==2824 )
MOD2<=25;
else if( code==2826 )
MOD2<=25;
else
MOD2<=douta3;
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
FRAC2<=douta4;
else if(code==24 )
FRAC2<=22;
else if(code==26 )
FRAC2<=3;
else if(code==424 )
FRAC2<=22;
else if(code==426 )
FRAC2<=3;
else if(code==824 )
FRAC2<=22;
else if(code==826 )
FRAC2<=3;
else if(code==1224)
FRAC2<=22;
else if(code==1226 )
FRAC2<=3;
else if(code==1624)
FRAC2<=22;
else if(code==1626 )
FRAC2<=3;
else if(code==2024 )
FRAC2<=22;
else if(code==2026 )
FRAC2<=3;
else if(code==2424 )
FRAC2<=22;
else if(code==2426 )
FRAC2<=3;
else if(code==2824 )
FRAC2<=22;
else if( code==2826 )
FRAC2<=3;
else
FRAC2<=douta4;
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)begin
R_DIV<=4'b1;
D<=4'b0;
end
else if(code==24 || code==26 || code==424 || code==426 || code==824 || code==826|| code==1224 || code==1226 || code==1624 || code==1626 ||code==2024 || code==2026 ||code==2424 || code==2426 ||code==2824 || code==2826 )
begin
R_DIV<= 4'd3;
D<=4'd2;
end
else
begin
R_DIV<=4'b1;
D<=4'b0;
end
end
//----------------------------------------------------------------
always@(posedge sysclk,negedge arstn)begin
if(~arstn)
pre_fre_code<=11'h6d6;
else if(CAL_F_R==3'b011)
pre_fre_code<=fre_code;
else
pre_fre_code<=pre_fre_code;
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)
code<=16'h0;
else if(hop_en==2'b01)
code<=fre_code;
else
code<=code;
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)begin
hop_en <= 3'b0;
rf_en_r <= 4'b0;
CAL_F_R <= 3'b0;
end
else begin
hop_en <= {hop_en[1:0],adf4371_hop};
CAL_F_R <= {CAL_F_R[1:0],CAL_F};
rf_en_r <= rf_en ;
end
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)
csb_reg <= 1'b1;
else
csb_reg <= spi_csb;
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)
cnt_locked<=32'b0;
else if(cnt_locked==WAIT_ld)
cnt_locked<=32'b0;
else if(!pll_locked)
cnt_locked<=cnt_locked+1'b1;
else
cnt_locked<=32'b0;
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)begin
cfgdata <= 0;
cnt_word <= 7'd0;
cnt_bits <= 6'd0;
state <= 4'b0;
cnt_lock <= 32'd0;
spi_csb <= 1'b1;
cfgover <= 1'b0;
spi_sdo <= 1'b0;
end
else begin
case(state)
4'd0:begin
cnt_word <= 7'd0;
if(rf_en==1'b1)
state <= 4'd0;
else if(cnt_lock >= 32'd4000)
state <= 4'd1;
else
state <= state;
if(rf_en==1'b0)
cnt_lock <= cnt_lock + 1'b1;
else
cnt_lock<=32'd0;
end
4'd1:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
if(rf_en==1'b1)
state <= 4'd0;
else
state <= 4'd2;
end
4'd2:begin
cfgdata <= regdata;
cnt_bits <= 6'd0;
state <= 4'd3;
end
4'd3:begin
spi_csb <= 1'b0;
spi_sdo <= cfgdata[DATA_WIDTH-1];
cfgdata <= cfgdata << 1'b1;
cnt_bits <= cnt_bits + 1'b1;
if(cnt_bits == DATA_WIDTH-1)begin
state <= 4'd4;
cnt_word <= cnt_word + 1'b1;
end
cnt_lock <= 32'd0;
end
4'd4:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
cnt_lock <= 32'd0;
cnt_bits <= 32'd0;
if(cnt_word == DATA_LENTH)begin
state <= 4'd5;
end
else
state <= 4'd1;
end
4'd5:begin
if(cnt_lock>=40000 || pll_locked)begin
cnt_lock <= 32'd0 ;
state <= 4'd6 ;
end
else begin
cnt_lock <=cnt_lock+1'b1;
state <= state ;
end
end
4'd6:begin
cnt_word <= 7'd0;
if(pll_locked)
state <= 4'd7 ;
else
state <= 4'b1 ;
end
//----------------------------------------------------------------
4'd7:begin//IDLE
cnt_word <= DATA_LENTH;
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
cnt_bits <= 6'd0;
cfgover <= 1'b0;
if(rf_en==4'b1)
state <= state;
else if(rf_en==4'b0 && rf_en_r==4'b1 )
state <= 4'd0;
else if(hop_en==2'b10 || cnt_locked==WAIT_ld )
state <= 4'd8;
else if(CAL_F_R==3'b011 && (pre_fre_code!=fre_code))//打开RF_OUT
state <= 4'd12;
else
state <= state;
end
4'd8:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
state <= 4'd9;
end
4'd9:begin
cfgdata <= regdata;
cnt_bits <= 6'd0;
state <= 4'd10;
end
4'd10:begin
spi_csb <= 1'b0;
spi_sdo <= cfgdata[DATA_WIDTH-1];
cfgdata <= cfgdata << 1'b1;
cnt_bits <= cnt_bits + 1'b1;
if(cnt_bits == DATA_WIDTH-1)begin
state <= 4'd11;
cnt_word <= cnt_word + 1'b1;
end
end
4'd11:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
cnt_lock <= 32'd0;
cnt_bits <= 32'd0;
if(cnt_word == 8'd85)begin
state <= 4'd7;
end
else
state <= 4'd8;
end
4'd12:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
state <= 4'd13;
end
4'd13:begin
cnt_bits <= 6'd0;
state <= 4'd14;
if(ceshi_model==4'ha)
cfgdata<={16'h0025,8'h13};
else if(ceshi_model==4'hb)
cfgdata<={16'h0025,8'h00};
else if(SW_PLL)
cfgdata<={16'h0025,8'h13};
else
cfgdata<={16'h0025,8'h00};
end
4'd14:begin
spi_csb <= 1'b0;
spi_sdo <= cfgdata[DATA_WIDTH-1];
cfgdata <= cfgdata << 1'b1;
cnt_bits <= cnt_bits + 1'b1;
if(cnt_bits == DATA_WIDTH-1)begin
state <= 4'd7;
cfgover <= 1'b1;
cnt_word <= cnt_word ;
end
end
//&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#//
default: begin
spi_csb <= 1'b1;
state <= 4'd0;
cnt_lock <= 32'd0;
cnt_word <= 8'd0;
end
endcase
end
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
regdata <= {16'h0000,8'h18 };
else case(cnt_word)
8'd0 : regdata <= {16'h0000,8'h18 };
8'd1 : regdata <= {16'h0001,8'h00 };
8'd2 : regdata <= {16'h0003,8'h00 };
8'd3 : regdata <= {16'h0004,8'h00 };
8'd4 : regdata <= {16'h0005,8'h00 };
8'd5 : regdata <= {16'h0006,8'hFF };
8'd6 : regdata <= {16'h000C,8'h00 };
8'd7 : regdata <= {16'h000D,8'h00 };
8'd8 : regdata <= {16'h0010 ,INT[7:0] } ;
8'd9 : regdata <= {16'h0011 ,INT[15:8] } ;
8'd10 : regdata <= {16'h0012,8'h00 };//[6]No Autocalibration
//8'd10 : regdata <= {16'h0012,8'h40 };//[6]Autocalibration
8'd11 : regdata <= {16'h0014 ,FRAC1[7:0]} ;
8'd12 : regdata <= {16'h0015 ,FRAC1[15:8]} ;
8'd13 : regdata <= {16'h0016 ,FRAC1[23:16]} ;
8'd14 : regdata <= {16'h0017 ,FRAC2[6:0],FRAC1[24]} ;
8'd15 : regdata <= {16'h0018 ,1'b0,FRAC2[13:7] } ;
8'd16 : regdata <= {16'h0019 ,MOD2[7:0]} ;
8'd17 : regdata <= {16'h001A ,2'b0,MOD2[13:8]} ;
8'd18 : regdata <= {16'h001B,8'h00 };
8'd19 : regdata <= {16'h001C,8'h00 };
8'd20 : regdata <= {16'h001D,8'h00 };
8'd21 : regdata <= {16'h001E,8'h18 };//CP_CURRENT 电荷泵
// 8'd21 : regdata <= { 16'h001E,cp,4'h8 };//CP_CURRENT 电荷泵
8'd22 : regdata <= { 16'h001F,4'h0,R_DIV };//R DIV R分频器
8'd23 : regdata <= {16'h0020,8'h1c };//digital lock detect 数字锁定ld
8'd24 : regdata <= {16'h0021,8'h00 };
8'd25 : regdata <= {16'h0022,D,4'd0 };//[4]2分频 [5]double 2倍频器
8'd26 : regdata <= {16'h0023,8'h00 };
8'd27 : regdata <= {16'h0024,8'h80 };//Fout_clk DIV_SEL
8'd28 : regdata <= {16'h0025,8'h13 };//X4_EN
8'd29 : regdata <= {16'h0026,8'h1F };
8'd30 : regdata <= {16'h0027,8'hCD };
//8'd30 : regdata <= {16'h0027,8'hCD };
8'd31 : regdata <= {16'h0028,8'h83 };
8'd32 : regdata <= {16'h002A,8'h00 };
8'd33 : regdata <= {16'h002B,8'h00 };
8'd34 : regdata <= {16'h002C,8'h44 };
8'd35 : regdata <= {16'h002D,8'h11 };
8'd36 : regdata <= {16'h002E,8'h12 };
8'd37 : regdata <= {16'h002F,8'h94 };
8'd38 : regdata <= {16'h0030,8'h2A };
8'd39 : regdata <= {16'h0031,8'h02 };
8'd40 : regdata <= {16'h0032,8'h04 };
8'd41 : regdata <= {16'h0033,8'h22 };
8'd42 : regdata <= {16'h0034,8'h25 };
8'd43 : regdata <= {16'h0035,8'hFA };
8'd44 : regdata <= {16'h0036,8'h30 };
8'd45 : regdata <= {16'h0037,SI_BAND_SEL} ;//VCO频段
8'd46 : regdata <= {16'h0038,SI_VCO_SEL_BIAS_CODE };//[7:4]=VCO内核,[3:0]VCO偏置
8'd47 : regdata <= {16'h0039,8'h07 };
8'd48 : regdata <= {16'h003A,8'h55 };
8'd49 : regdata <= {16'h003D,8'h00 };
8'd50 : regdata <= {16'h003E,8'h0C };
8'd51 : regdata <= {16'h003F,8'h80 };
8'd52 : regdata <= {16'h0040,8'h50 };
8'd53 : regdata <= {16'h0041,8'h28 };
8'd54 : regdata <= {16'h0042,8'h00 };
8'd55 : regdata <= {16'h0043,8'h00 };
8'd56 : regdata <= {16'h0044,8'h00 };
8'd57 : regdata <= {16'h0045,8'h00 };
8'd58 : regdata <= {16'h0046,8'h00 };
8'd59 : regdata <= {16'h0047,8'hC0 };
8'd60 : regdata <= {16'h0052,8'hF4 };
8'd61 : regdata <= {16'h006C,8'h00 };
8'd62 : regdata <= {16'h006E,8'h00 };
8'd63 : regdata <= {16'h006F,8'h00 };
8'd64 : regdata <= {16'h0070,8'hE3 };
8'd65 : regdata <= {16'h0071,8'h60 };
8'd66 : regdata <= {16'h0072,8'h32 };
8'd67 : regdata <= {16'h0073,8'h00 };
8'd68 : regdata <= {16'h0079,8'h00 };
8'd69 : regdata <= {16'h007A,8'h00 };
8'd70 : regdata <= {16'h007B,8'h00 };
8'd71 : regdata <= {16'h007C,8'h00 };
//跳频
8'd72:regdata <= { 16'h0022,D,4'd0 };//double D倍频器
8'd73:regdata <= { 16'h001F,4'h0,R_DIV };//R DIV R分频器
8'd74:regdata <= { 16'h001A ,2'b0,MOD2[13:8] } ;
8'd75:regdata <= { 16'h0019 ,MOD2[7:0] } ;
8'd76:regdata <= { 16'h0018 ,1'b0,FRAC2[13:7] } ;
8'd77:regdata <= { 16'h0017 ,FRAC2[6:0],FRAC1[24] } ;
8'd78:regdata <= { 16'h0016 ,FRAC1[23:16] } ;
8'd79:regdata <= { 16'h0015 ,FRAC1[15:8] } ;
8'd80:regdata <= { 16'h0014 ,FRAC1[7:0] } ;
8'd81:regdata <= { 16'h0037 ,SI_BAND_SEL } ;
8'd82:regdata <= { 16'h0038 ,SI_VCO_SEL_BIAS_CODE } ;
8'd83:regdata <= { 16'h0011 ,INT[15:8] } ;
8'd84:regdata <= { 16'h0010 ,INT[7:0] } ;
default: regdata <= regdata;
endcase
end
endmodule
@@ -0,0 +1,622 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2021/8/13 00:24:20
// Design Name:
// Module Name: LMX2595
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
// fRFOUT= (INT+ (FRAC1+FRAC2/MOD2)/MOD1)× (fPFD/R)
// fPFD = fPFD = REFIN × ((1 + D)/(R × (1 + T)))
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//////////////////////////////////////////////////////////////////////////////////
module adf4371_b(//20.375Ghz ~ 23.875Ghz
input sysclk ,//40MHZ
input arstn ,
output cs ,
input mux_out ,
output sclk ,
output sdio ,
input [3:0] rf_en ,
input CAL_F ,
input SW_PLL ,
input i_cfgover ,
input [3:0] ceshi_model ,
input adf4371_hop ,
input[11:0] fre_code
);
localparam DATA_WIDTH = 24 ;
localparam DATA_LENTH = 72 ;
localparam WAIT_ld = 40000 ;
//***********************************************************************************************************//
reg[7:0] cnt_word = 8'd0 ;
reg csb_reg = 1'b1 ;
reg[5:0] cnt_bits = 6'd0 ;
reg[DATA_WIDTH-1:0] cfgdata = 0, regdata = 0 ;
reg[3:0] state = 4'b000 ;
reg spi_sdo = 1'b0, spi_csb = 1'b1;
wire pll_locked ;
reg[31:0] cnt_lock = 32'd0 ;
reg[31:0] cnt_locked = 32'd0 ;
wire[15:0] band ;
//-----------------------------------
assign pll_locked = mux_out ;
assign sclk = spi_csb ? 1'b0 : ~sysclk ;
assign cs = spi_csb & csb_reg ;
assign sdio = spi_sdo ;
//-----------------------------------
wire [7:0] SI_BAND_SEL ; //VCO频段
wire [7:0] SI_VCO_SEL_BIAS_CODE ; //[7:4]=VCO内核, [3:0]=VCO偏置
reg[13:0] MOD2 ;
reg[13:0] FRAC2 ;
reg[24:0] FRAC1 ;
reg[15:0] INT ;
assign SI_BAND_SEL = band[15:8] ;
assign SI_VCO_SEL_BIAS_CODE = band[7:0] ;
reg[2:0] hop_en;
reg[15:0] code;
reg[11:0] pre_fre_code;
reg[3:0] cp_r;
reg[3:0] rf_en_r;
reg[2:0] CAL_F_R;
reg [3:0] R_DIV ;
reg [3:0] D ;
wire[13:0] douta3 ;
wire[13:0] douta4 ;
wire[24:0] douta2 ;
wire[15:0] douta1 ;
//-----------------------------------
INT_ROMb int_rom (
.sysclk(sysclk),
.addra(code),
.douta(douta1)
);
FRAC1 frac1_rom (
.clka(sysclk),
.addra(code),
.douta(douta2)
);
// FRAC1_ROM FRAC1_ROM (
// .clka(sysclk), // input clka
// .addra(code), // input [11 : 0] addra
// .douta(douta2) // output [24 : 0] douta
//);
frac2_rom frac2_rom (
.sysclk(sysclk),
.addra(code),
.douta(douta4)
);
mod2_rom mod2_rom (
.sysclk(sysclk),
.addra(code),
.douta(douta3)
);
band_rom_b band_rom_b (
.sysclk(sysclk),
.addra(code),
.douta(band) // output [15 : 0] douta
);
//-------------------整数边界杂散用66.666666Mhz鉴相----------------------------------
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
INT<=douta1;
else if(code==24 || code==26 )
INT<=76;
else if(code==424 )
INT<=77;
else if(code==426 )
INT<=78;
else if(code==824 || code==826 )
INT<=79;
else if(code==1224)
INT<=80;
else if(code==1226 )
INT<=81;
else if(code==1624 || code==1626 )
INT<=82;
else if(code==2024 )
INT<=83;
else if(code==2026 )
INT<=84;
else if(code==2424 || code==2426 )
INT<=85;
else if(code==2824 )
INT<=86;
else if( code==2826 )
INT<=87;
else
INT<=douta1;
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
FRAC1<=douta2;
else if(code==24 )
FRAC1<=16651386;
else if(code==26 )
FRAC1<=16903045;
else if(code==424 )
FRAC1<=33428602;
else if(code==426 )
FRAC1<=125829;
else if(code==824 )
FRAC1<=16651386;
else if(code==826 )
FRAC1<=16903045;
else if(code==1224)
FRAC1<=33428602;
else if(code==1226 )
FRAC1<=125829;
else if(code==1624)
FRAC1<=16651386;
else if(code==1626 )
FRAC1<=16903045;
else if(code==2024 )
FRAC1<=33428602;
else if(code==2026 )
FRAC1<=125829;
else if(code==2424 )
FRAC1<=16651386;
else if(code==2426 )
FRAC1<=16903045;
else if(code==2824 )
FRAC1<=33428602;
else if( code==2826 )
FRAC1<=125829;
else
FRAC1<=douta2;
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
MOD2<=douta3;
else if(code==24 )
MOD2<=25;
else if(code==26 )
MOD2<=25;
else if(code==424 )
MOD2<=25;
else if(code==426 )
MOD2<=25;
else if(code==824 )
MOD2<=25;
else if(code==826 )
MOD2<=25;
else if(code==1224)
MOD2<=25;
else if(code==1226 )
MOD2<=25;
else if(code==1624)
MOD2<=25;
else if(code==1626 )
MOD2<=25;
else if(code==2024 )
MOD2<=25;
else if(code==2026 )
MOD2<=25;
else if(code==2424 )
MOD2<=25;
else if(code==2426 )
MOD2<=25;
else if(code==2824 )
MOD2<=25;
else if( code==2826 )
MOD2<=25;
else
MOD2<=douta3;
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
FRAC2<=douta4;
else if(code==24 )
FRAC2<=22;
else if(code==26 )
FRAC2<=3;
else if(code==424 )
FRAC2<=22;
else if(code==426 )
FRAC2<=3;
else if(code==824 )
FRAC2<=22;
else if(code==826 )
FRAC2<=3;
else if(code==1224)
FRAC2<=22;
else if(code==1226 )
FRAC2<=3;
else if(code==1624)
FRAC2<=22;
else if(code==1626 )
FRAC2<=3;
else if(code==2024 )
FRAC2<=22;
else if(code==2026 )
FRAC2<=3;
else if(code==2424 )
FRAC2<=22;
else if(code==2426 )
FRAC2<=3;
else if(code==2824 )
FRAC2<=22;
else if( code==2826 )
FRAC2<=3;
else
FRAC2<=douta4;
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)begin
R_DIV<=4'b1;
D<=4'b0;
end
else if(code==24 || code==26 || code==424 || code==426 || code==824 || code==826|| code==1224 || code==1226 || code==1624 || code==1626 ||code==2024 || code==2026 ||code==2424 || code==2426 ||code==2824 || code==2826 )
begin
R_DIV<= 4'd3;
D<=4'd2;
end
else
begin
R_DIV<=4'b1;
D<=4'b0;
end
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)
pre_fre_code<=11'h6d6;
else if(CAL_F_R==3'b011)
pre_fre_code<=fre_code;
else
pre_fre_code<=pre_fre_code;
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)
code<=16'h6d6;
else if(hop_en==2'b01)
code<=fre_code;
else
code<=code;
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)begin
hop_en <= 3'b0;
CAL_F_R <= 3'b0;
rf_en_r <= 4'b0;
end
else begin
hop_en <= {hop_en[1:0],adf4371_hop};
CAL_F_R <= {CAL_F_R[1:0],CAL_F};
rf_en_r <= rf_en ;
end
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)
csb_reg <= 1'b1;
else
csb_reg <= spi_csb;
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)
cnt_locked<=32'b0;
else if(cnt_locked==WAIT_ld)
cnt_locked<=32'b0;
else if(!pll_locked)
cnt_locked<=cnt_locked+1'b1;
else
cnt_locked<=32'b0;
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)begin
cfgdata <= 0;
cnt_word <= 7'd0;
cnt_bits <= 6'd0;
state <= 4'b0;
cnt_lock <= 32'd0;
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
end
else begin
case(state)
4'd0:begin
cnt_word <= 7'd0;
if(rf_en==1'b1)
state <= 4'd0;
else if(cnt_lock >= 32'd6000)
state <= 4'd1;
else
state <= state;
if(rf_en==1'b0)
cnt_lock <= cnt_lock + 1'b1;
else
cnt_lock<=32'd0;
end
4'd1:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
state <= 4'd2;
end
4'd2:begin
cfgdata <= regdata;
cnt_bits <= 6'd0;
state <= 4'd3;
end
4'd3:begin
spi_csb <= 1'b0;
spi_sdo <= cfgdata[DATA_WIDTH-1];
cfgdata <= cfgdata << 1'b1;
cnt_bits <= cnt_bits + 1'b1;
if(cnt_bits == DATA_WIDTH-1)begin
state <= 4'd4;
cnt_word <= cnt_word + 1'b1;
end
cnt_lock <= 32'd0;
end
4'd4:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
cnt_lock <= 32'd0;
cnt_bits <= 32'd0;
if(cnt_word == DATA_LENTH)begin
state <= 4'd5;
end
else
state <= 4'd1;
end
4'd5:begin
if(cnt_lock>=40000 || pll_locked)begin
cnt_lock <= 32'd0 ;
state <= 4'd6 ;
end
else begin
cnt_lock <=cnt_lock+1'b1;
state <= state ;
end
end
4'd6:begin
cnt_word <= 7'd0;
if(pll_locked)
state <= 4'd7 ;
else
state <= 4'b1 ;
end
//&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#//
4'd7:begin//IDLE
cnt_word <= DATA_LENTH;
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
cnt_bits <= 6'd0;
if(rf_en==4'b1)
state <= state;
else if(rf_en==4'b0 && rf_en_r==4'b1 )
state <= 4'd0;
else if(hop_en==2'b10 || cnt_locked==WAIT_ld )
state <= 4'd8;
//else if(CAL_F_R==3'b011 && (pre_fre_code!=fre_code))//打开RF_OUT
else if(i_cfgover)
state <= 4'd12;
else
state <= state;
end
4'd8:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
state <= 4'd9;
end
4'd9:begin
cfgdata <= regdata;
cnt_bits <= 6'd0;
state <= 4'd10;
end
4'd10:begin
spi_csb <= 1'b0;
spi_sdo <= cfgdata[DATA_WIDTH-1];
cfgdata <= cfgdata << 1'b1;
cnt_bits <= cnt_bits + 1'b1;
if(cnt_bits == DATA_WIDTH-1)begin
state <= 4'd11;
cnt_word <= cnt_word + 1'b1;
end
end
4'd11:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
cnt_lock <= 32'd0;
cnt_bits <= 32'd0;
if(cnt_word == 8'd85)begin
state <= 4'd7;
end
else
state <= 4'd8;
end
4'd12:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
state <= 4'd13;
end
4'd13:begin
cnt_bits <= 6'd0;
state <= 4'd14;
if(ceshi_model==4'hb)
cfgdata <= {16'h0025,8'h13};
else if(ceshi_model==4'ha)
cfgdata <= {16'h0025,8'h00};
else if (SW_PLL)
cfgdata <= {16'h0025,8'h00};
else
cfgdata <= {16'h0025,8'h13};
end
4'd14:begin
spi_csb <= 1'b0;
spi_sdo <= cfgdata[DATA_WIDTH-1];
cfgdata <= cfgdata << 1'b1;
cnt_bits <= cnt_bits + 1'b1;
if(cnt_bits == DATA_WIDTH-1)begin
state <= 4'd7;
cnt_word <= cnt_word ;
end
end
//&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#//
default: begin
spi_csb <= 1'b1;
state <= 4'd0;
cnt_lock <= 32'd0;
cnt_word <= 8'd0;
end
endcase
end
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
regdata <= {16'h0000,8'h18 };
else case(cnt_word)
8'd0 : regdata <= {16'h0000,8'h18 };
8'd1 : regdata <= {16'h0001,8'h00 };
8'd2 : regdata <= {16'h0003,8'h00 };
8'd3 : regdata <= {16'h0004,8'h00 };
8'd4 : regdata <= {16'h0005,8'h00 };
8'd5 : regdata <= {16'h0006,8'hFF };
8'd6 : regdata <= {16'h000C,8'h00 };
8'd7 : regdata <= {16'h000D,8'h00 };
8'd8 : regdata <= {16'h0010 ,INT[7:0] } ;
8'd9 : regdata <= {16'h0011 ,INT[15:8] } ;
8'd10 : regdata <= {16'h0012,8'h00 };//[6]Autocalibration
//8'd10 : regdata <= {16'h0012,8'h40 };//[6]Autocalibration
8'd11 : regdata <= {16'h0014 ,FRAC1[7:0]} ;
8'd12 : regdata <= {16'h0015 ,FRAC1[15:8]} ;
8'd13 : regdata <= {16'h0016 ,FRAC1[23:16]} ;
8'd14 : regdata <= {16'h0017 ,FRAC2[6:0],FRAC1[24]} ;
8'd15 : regdata <= {16'h0018 ,1'b0,FRAC2[13:7] } ;
8'd16 : regdata <= {16'h0019 ,MOD2[7:0]} ;
8'd17 : regdata <= {16'h001A ,2'b0,MOD2[13:8]} ;
8'd18 : regdata <= {16'h001B,8'h00 };
8'd19 : regdata <= {16'h001C,8'h00 };
8'd20 : regdata <= {16'h001D,8'h00 };
8'd21 : regdata <= {16'h001E,8'h18 };//CP_CURRENT 电荷泵
//8'd21 : regdata <= {16'h001E,cp,4'h8 };//CP_CURRENT 电荷泵
8'd22 : regdata <= { 16'h001F,4'h0,R_DIV };//R DIV R分频器
8'd23 : regdata <= {16'h0020,8'h1c };//digital lock detect 数字锁定ld
8'd24 : regdata <= {16'h0021,8'h00 };
8'd25 : regdata <= { 16'h0022,D,4'd0 };//double D倍频器
8'd26 : regdata <= {16'h0023,8'h00 };
8'd27 : regdata <= {16'h0024,8'h80 };//DIV_SEL
8'd28 : regdata <= {16'h0025,8'h13 };//X4_EN
8'd29 : regdata <= {16'h0026,8'h1F };
8'd30 : regdata <= {16'h0027,8'hCD };
//8'd30 : regdata <= {16'h0027,8'hCD };
8'd31 : regdata <= {16'h0028,8'h83 };
8'd32 : regdata <= {16'h002A,8'h00 };
8'd33 : regdata <= {16'h002B,8'h00 };
8'd34 : regdata <= {16'h002C,8'h44 };
8'd35 : regdata <= {16'h002D,8'h11 };
8'd36 : regdata <= {16'h002E,8'h12 };
8'd37 : regdata <= {16'h002F,8'h94 };
8'd38 : regdata <= {16'h0030,8'h2A };
8'd39 : regdata <= {16'h0031,8'h02 };
8'd40 : regdata <= {16'h0032,8'h04 };
8'd41 : regdata <= {16'h0033,8'h22 };
8'd42 : regdata <= {16'h0034,8'h25 };
8'd43 : regdata <= {16'h0035,8'hFA };
8'd44 : regdata <= {16'h0036,8'h30 };
8'd45 : regdata <= {16'h0037,SI_BAND_SEL} ;//VCO频段
8'd46 : regdata <= {16'h0038,SI_VCO_SEL_BIAS_CODE };//[7:4]=VCO内核,[3:0]VCO偏置
8'd47 : regdata <= {16'h0039,8'h07 };
8'd48 : regdata <= {16'h003A,8'h55 };
8'd49 : regdata <= {16'h003D,8'h00 };
8'd50 : regdata <= {16'h003E,8'h0C };
8'd51 : regdata <= {16'h003F,8'h80 };
8'd52 : regdata <= {16'h0040,8'h50 };
8'd53 : regdata <= {16'h0041,8'h28 };
8'd54 : regdata <= {16'h0042,8'h00 };
8'd55 : regdata <= {16'h0043,8'h00 };
8'd56 : regdata <= {16'h0044,8'h00 };
8'd57 : regdata <= {16'h0045,8'h00 };
8'd58 : regdata <= {16'h0046,8'h00 };
8'd59 : regdata <= {16'h0047,8'hC0 };
8'd60 : regdata <= {16'h0052,8'hF4 };
8'd61 : regdata <= {16'h006C,8'h00 };
8'd62 : regdata <= {16'h006E,8'h00 };
8'd63 : regdata <= {16'h006F,8'h00 };
8'd64 : regdata <= {16'h0070,8'hE3 };
8'd65 : regdata <= {16'h0071,8'h60 };
8'd66 : regdata <= {16'h0072,8'h32 };
8'd67 : regdata <= {16'h0073,8'h00 };
8'd68 : regdata <= {16'h0079,8'h00 };
8'd69 : regdata <= {16'h007A,8'h00 };
8'd70 : regdata <= {16'h007B,8'h00 };
8'd71 : regdata <= {16'h007C,8'h00 };
//跳频
8'd72:regdata <= { 16'h0022,D,4'd0 };//double D倍频器
8'd73:regdata <= { 16'h001F,4'h0,R_DIV };//R DIV R分频器
8'd74:regdata <= { 16'h001A ,2'b0,MOD2[13:8] } ;
8'd75:regdata <= { 16'h0019 ,MOD2[7:0] } ;
8'd76:regdata <= { 16'h0018 ,1'b0,FRAC2[13:7] } ;
8'd77:regdata <= { 16'h0017 ,FRAC2[6:0],FRAC1[24] } ;
8'd78:regdata <= { 16'h0016 ,FRAC1[23:16] } ;
8'd79:regdata <= { 16'h0015 ,FRAC1[15:8] } ;
8'd80:regdata <= { 16'h0014 ,FRAC1[7:0] } ;
8'd81:regdata <= { 16'h0037 ,SI_BAND_SEL } ;
8'd82:regdata <= { 16'h0038 ,SI_VCO_SEL_BIAS_CODE } ;
8'd83:regdata <= { 16'h0011 ,INT[15:8] } ;
8'd84:regdata <= { 16'h0010 ,INT[7:0] } ;
default: regdata <= regdata;
endcase
end
endmodule
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,368 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 13:59:21 10/19/2020
// Design Name:
// Module Name: DS18B20
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//+125 0000 0111 1101 0000 07D0h
//+85* 0000 0101 0101 0000 0550h
//+25.0625 0000 0001 1001 0001 0191h
//+10.125 0000 0000 1010 0010 00A2h
//+0.5 0000 0000 0000 1000 0008h
//0 0000 0000 0000 0000 0000h
//-0.5 1111 1111 1111 1000 FFF8h
//-10.125 1111 1111 0101 1110 FF5Eh
//-25.0625 1111 1110 0110 1111 FE6Fh
//-55 1111 1100 1001 0000 FC90h
//////////////////////////////////////////////////////////////////////////////////
module ds18b20_temp(
input clk , //40_000_000
input rstn ,
inout dq ,
output reg signed[15:0] temp_data //LSB =0.625 C
);
parameter FRE = 40 ;// //clk为40M时钟,若clk为50M,则 FRE=50;
parameter INIT = 3'b000 , //Gray code
WR_CMD = 3'b001 ,
WAIT = 3'b011 ,
INIT_AGAIN = 3'b010 ,
RD_CMD = 3'b110 ,
RD_TEMP = 3'b111 ;
localparam WR_CC_44 = 16'h44cc ;
localparam WR_CC_BE = 16'hbecc ;
localparam cnt_max = FRE[31:1]-1 ;
localparam WAIT_TEMP_CNT = 20'd750_000 ;//750ms
reg flag ;
reg [15:0] data_reg ;
reg [2:0] state ;
reg clk_1us ;
reg [31:0] cnt_1us ;
reg dq_en ;
reg dq_reg ;
reg [19:0] cnt ;
reg [3:0] bit_cnt ;
assign dq = dq_en ? dq_reg : 1'bz;
always@(posedge clk,negedge rstn)
if(!rstn)
cnt_1us<=32'b0;
else if(cnt_1us==cnt_max)
cnt_1us<=32'b0;
else
cnt_1us<=cnt_1us+1'b1;
always@(posedge clk,negedge rstn)
if(!rstn)
clk_1us<=1'b0;
else if(cnt_1us==cnt_max)
clk_1us<=~clk_1us;
else
clk_1us<=clk_1us;
always@(posedge clk_1us,negedge rstn)
if(!rstn)
begin
dq_en <=1'b1;
dq_reg <=1'b0;
state <=INIT;
cnt <=20'd0;
flag <=1'b0;
bit_cnt <=4'b0;
data_reg <=16'd0;
temp_data<=12'b0;
end
else case(state)
INIT :begin
//if(cnt==16'd999)begin //for sim
if(cnt==16'd9999)
cnt <=20'd0;
else if(cnt==16'd999&&flag)begin
cnt <=20'd0;
state<=WR_CMD;
end
else begin
cnt <=cnt+1'd1;
state<=INIT;
end
//------------------
if(cnt==16'd9999)begin
dq_en <=1'b1;
dq_reg<=1'b0;
end
//else if(cnt==16'd499)begin
else if(cnt==16'd599)begin
dq_en <=1'b0;
dq_reg<=1'b0;
end
else begin
dq_en <=dq_en;
dq_reg<=dq_reg;
end
//------------------
// if(cnt==20'd570)//&&dq==1'b0)
if(cnt==20'd670)//&&dq==1'b0)
flag<= ~dq;
else if(cnt==20'd999)
flag<=1'b0;
else
flag<=flag;
end
/* INIT :begin
//if(cnt==16'd999)begin //for sim
if(cnt==16'd999&&flag)begin
cnt <=20'd0;
state<=WR_CMD;
end
else begin
cnt <=cnt+1'd1;
state<=INIT;
end
//------------------
if(cnt==16'd499)begin
dq_en <=1'b0;
dq_reg<=1'b0;
end
else begin
dq_en <=dq_en;
dq_reg<=dq_reg;
end
//------------------
if(cnt==20'd570)//&&dq==1'b0)
flag<= ~dq;
else if(cnt==20'd999)
flag<=1'b0;
else
flag<=flag;
end */
WR_CMD :begin
if(cnt==20'd64 && bit_cnt==4'd15)
begin
bit_cnt<=4'd0;
state<=WAIT;
end
else if(cnt==20'd64)
begin
bit_cnt<=bit_cnt+1'd1;
state<=WR_CMD;
end
else
begin
bit_cnt<=bit_cnt;
state<=WR_CMD;
end
//------------------
if(cnt==20'd64 && bit_cnt==4'd15)
cnt<=20'd0;
else if(cnt==20'd64)
cnt<=20'd0;
else
cnt<=cnt+1'd1;
//------------------
if(WR_CC_44[bit_cnt]==1'b0 && cnt<=20'd62)
begin
dq_en <=1'b1;
dq_reg<=1'b0;
end
else if(WR_CC_44[bit_cnt]==1'b1 && cnt<=20'd1)
begin
dq_en <=1'b1;
dq_reg<=1'b0;
end
else
begin
dq_en <=1'b0;
dq_reg<=1'b0;
end
end
WAIT : if(cnt==WAIT_TEMP_CNT)
begin
dq_en <=1'b1;
dq_reg<=1'b0;
cnt<=20'd0;
state<=INIT_AGAIN;
end
else
begin
dq_en <=1'b1;
dq_reg<=1'b1;
cnt<=cnt+1'd1;
state<=WAIT;
end
INIT_AGAIN :begin
if(cnt==16'd999&&flag)
//if(cnt==16'd999) //for sim
begin
cnt <=20'd0;
state<=RD_CMD;
end
else
begin
cnt <=cnt+1'd1;
state<=INIT_AGAIN;
end
//------------------
if(cnt==16'd499)
begin
dq_en <=1'b0;
dq_reg<=1'b0;
end
else
begin
dq_en <=dq_en;
dq_reg<=dq_reg;
end
//------------------
if(cnt==20'd570)//&&dq==1'b0)
flag<=~dq;
else if(cnt==20'd999)
flag<=1'b0;
else
flag<=flag;
end
RD_CMD :begin
if(cnt==20'd64 && bit_cnt==4'd15)
begin
bit_cnt<=4'd0;
state<=RD_TEMP;
end
else if(cnt==20'd64)
begin
bit_cnt<=bit_cnt+1'd1;
state<=RD_CMD;
end
else
begin
bit_cnt<=bit_cnt;
state<=RD_CMD;
end
//------------------
if(cnt==20'd64 && bit_cnt==4'd15)
cnt<=20'd0;
else if(cnt==20'd64)
cnt<=20'd0;
else
cnt<=cnt+1'd1;
//------------------
if(WR_CC_BE[bit_cnt]==1'b0 && cnt<=20'd62)
begin
dq_en <=1'b1;
dq_reg<=1'b0;
end
else if(WR_CC_BE[bit_cnt]==1'b1 && cnt<=20'd1)
begin
dq_en <=1'b1;
dq_reg<=1'b0;
end
else
begin
dq_en <=1'b0;
dq_reg<=1'b0;
end
end
RD_TEMP :begin
if(cnt==20'd64 && bit_cnt==4'd15)
cnt <=20'd0;
else if(cnt==20'd64)
cnt<=20'd0;
else
cnt<=cnt+1'd1;
//------------------
if(cnt<=20'd1|| (cnt==20'd64 && bit_cnt==4'd15))
begin
dq_en <=1'b1;
dq_reg<=1'b0;
end
else
begin
dq_en <=1'b0;
dq_reg<=1'b0;
end
//------------------
if(cnt==20'd64 && bit_cnt==4'd15)
begin
bit_cnt<=4'd0;
state<=INIT;
end
else if(cnt==20'd64)
begin
bit_cnt<=bit_cnt+1'd1;
state<=RD_TEMP;
end
else
begin
bit_cnt<=bit_cnt;
state<=RD_TEMP;
end
//------------------
if(cnt==20'd8)
data_reg<={dq,data_reg[15:1]};
else
data_reg<=data_reg;
//------------------
if(cnt==20'd64 && bit_cnt==4'd15)
temp_data<=data_reg;
else
temp_data<=temp_data;
end
default: state<=INIT;
endcase
/* wire[33:0]SYNC_OUT;
wire[35:0]CONTROL0;
wire[35:0]CONTROL1;
wire[149:0]TRIG0;
vio u_vio (
.CONTROL (CONTROL0), // INOUT BUS [35:0]
.CLK (clk), // IN
.SYNC_OUT (SYNC_OUT) // OUT BUS [33:0]
);
icon u_icon (
.CONTROL0 (CONTROL0), // INOUT BUS [35:0]
.CONTROL1 (CONTROL1) // INOUT BUS [35:0]
);
ila u_ila (
.CONTROL (CONTROL1), // INOUT BUS [35:0]
.CLK (clk), // IN
.TRIG0 (TRIG0) // IN BUS [39:0]
);
assign TRIG0[2:0] = state ;
assign TRIG0[21:3] = cnt ;
assign TRIG0[22] = dq ;
*/
endmodule
@@ -0,0 +1,72 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 15:35:03 01/27/2022
// Design Name:
// Module Name: mod2_rom
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module frac2_rom(
input sysclk,
input [11 : 0] addra,
output reg[13:0] douta
);
reg[11:0] addr=0;
always@(posedge sysclk)begin
addr<=addra%25;
end
always@(posedge sysclk)begin
case(addr)
0 : douta <= 0;
1 : douta <= 2;
2 : douta <= 4;
3 : douta <= 6;
4 : douta <= 8;
5 : douta <= 2;
6 : douta <= 12;
7 : douta <= 14;
8 : douta <= 16;
9 : douta <= 18;
10 : douta <= 4;
11 : douta <= 22;
12 : douta <= 24;
13 : douta <= 1;
14 : douta <= 3;
15 : douta <= 1;
16 : douta <= 7;
17 : douta <= 9;
18 : douta <= 11;
19 : douta <= 13;
20 : douta <= 3;
21 : douta <= 17;
22 : douta <= 19;
23 : douta <= 21;
24 : douta <= 23;
default:douta <= douta ;
endcase
end
endmodule
@@ -0,0 +1,210 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 10:03:33 09/24/2021
// Design Name:
// Module Name: fre_caliatt
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module fre_caliatt(
input i_clk ,
input i_rstn ,
output ENABLE ,
output SC ,
output SD ,
output END_SYN ,
input SDOUT ,
input CAL_F ,
input signed[7:0] i_temp ,
input[15:0] i_fre_mode ,
input[15:0] i_cal_fre_code ,
input [3:0] cal1_mgc ,
input [3:0] cal2_mgc ,
input [3:0] cal3_mgc ,
input [3:0] cal4_mgc ,
input [3:0] i_ceshi_module ,
input [40:0] SYNC_OUT ,
input SW ,
output [3:0] R_CAL1 ,
output [3:0] R_CAL2 ,
output [3:0] R_CAL3 ,
output [3:0] R_CAL4 ,
input [4:0] tx_mgc ,
input [4:0] tx_cal_mgc ,
output [4:0] T_CAL
);
wire[15:0] fre_mode ;
wire[31:0] hop_fre_mode ;
assign fre_mode = i_cal_fre_code/40 ;//20.375Ghz~23.875Ghz
assign hop_fre_mode = i_cal_fre_code+20375 ;//20.375Ghz~23.875Ghz
wire [3:0] R_CAL4_r ;
wire [3:0] R_CAL3_r ;
wire [3:0] R_CAL2_r ;
wire [3:0] R_CAL1_r ;
wire [4:0] T_CAL_r ;
wire [31:0] data_in ;
reg [31:0] data_in_r ;
reg R_CAL_F ;
wire[15:0] cal_mgc_r ;
reg [15:0] cal_mgc_rr ;
reg tx_en ;
reg vio_en ;
always@(posedge i_clk)
begin
cal_mgc_rr <= cal_mgc_r;
end
//------------------vio_debug------------------------//
/* always@(posedge i_clk)
begin
vio_R_CAL_4 <= SYNC_OUT[4:0];
vio_R_CAL_3 <= SYNC_OUT[9:5];
vio_R_CAL_2 <= SYNC_OUT[14:10];
vio_R_CAL_1 <= SYNC_OUT[19:15];
vio_T_CAL <= SYNC_OUT[24:20];
vio_en <= SYNC_OUT[25];
end */
//------------------vio_debug------------------------//
assign R_CAL1 = R_CAL1_r + cal1_mgc ;//通道1
assign R_CAL2 = R_CAL2_r + cal2_mgc ;//通道2
assign R_CAL3 = R_CAL3_r + cal3_mgc ;//通道3
assign R_CAL4 = R_CAL4_r + cal4_mgc ;//通道4
assign T_CAL = ( i_ceshi_module==4'ha || i_ceshi_module==4'hb) ? (tx_mgc[4:0] + tx_cal_mgc) : (T_CAL_r + tx_cal_mgc) ;//发射通道,低衰减
assign cal_mgc_r = {cal1_mgc,cal2_mgc,cal3_mgc,cal4_mgc};
assign data_in = { 4'h0,3'b0,
T_CAL , //发射通道
R_CAL1[0], //接收通道1_1dB
R_CAL1[1], //接收通道1_2dB
R_CAL1[2], //接收通道1_4dB
R_CAL1[3], //接收通道1_8dB
R_CAL2[0], //接收通道2_1dB
R_CAL2[1], //接收通道2_2dB
R_CAL2[2], //接收通道2_4dB
R_CAL2[3], //接收通道2_8dB
R_CAL3[0], //接收通道3_1dB
R_CAL3[1], //接收通道3_2dB
R_CAL3[2], //接收通道3_4dB
R_CAL3[3], //接收通道3_8dB
R_CAL4 , //
4'b0 };
reg [31:0] cnt5us=0;
always@(posedge i_clk)begin
if(cnt5us==2000)
cnt5us<=2000;
else
cnt5us<=cnt5us+1'b1;
end
always@(posedge i_clk or negedge i_rstn)begin
if(!i_rstn)
R_CAL_F <= 1'b0;
else
R_CAL_F <= CAL_F;
end
always@(posedge i_clk or negedge i_rstn)begin
if(!i_rstn)
tx_en<=1'b0;
else if(cnt5us==1999)
tx_en<=1'b1;
else if({R_CAL_F,CAL_F}==2'b01 || cal_mgc_rr!=cal_mgc_r)
tx_en<=1'b1;
else
tx_en<=1'b0;
end
R_CAL_1 R_CAL_1 (
.i_clk(i_clk),
.i_rstn(i_rstn),
.i_temp(i_temp),
.fre_mode(fre_mode),
.R_CAL(R_CAL1_r)
);
R_CAL_2 R_CAL_2 (
.i_clk(i_clk),
.i_rstn(i_rstn),
.i_temp(i_temp),
.fre_mode(fre_mode),
.R_CAL(R_CAL2_r)
);
R_CAL_3 R_CAL_3 (
.i_clk(i_clk),
.i_rstn(i_rstn),
.i_temp(i_temp),
.fre_mode(fre_mode),
.R_CAL(R_CAL3_r)
);
R_CAL_4 R_CAL_4 (
.i_clk(i_clk),
.i_rstn(i_rstn),
.i_temp(i_temp),
.fre_mode(fre_mode),
.R_CAL(R_CAL4_r)
);
T_CAL T_CAL__ (
.i_clk(i_clk),
.i_rstn(i_rstn),
.SW(SW),
.i_temp(i_temp),
.hop_fre_mode(hop_fre_mode),
.T_CAL_(T_CAL_r)
);
spi_tx SPI_TX (
.clk (i_clk ) ,
.rstn (i_rstn ) ,
.tx_en (tx_en ) ,
.data_in (data_in ) ,
.spi_cs (ENABLE ) ,
.spi_sclk (SC ) ,
.spi_sdo (SD ) ,
.DARY (END_SYN )
);
endmodule
@@ -0,0 +1,434 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 19:54:29 09/06/2021
// Design Name:
// Module Name: mgc_ctrl
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module mgc_ctrl(
input i_sys_clk ,
input i_rst_n ,
input i_TR_SW_F ,
input i_TP_EN_F ,
input i_CAL_F ,
input i_T_MGC_EN_F ,
input i_R_MGC_EN_F ,
input [15:0] i_fre_code ,
input [7:0] i_tx_mgc ,
input [7:0] i_rx1_mgc ,
input [7:0] i_rx2_mgc ,
input [7:0] i_rx3_mgc ,
input [7:0] i_rx4_mgc ,
input [3:0] i_ceshi_module,
output [15:0] o_current_fre_code,
output [15:0] o_cal_fre_code,
output [15:0] o_hop_fre_code,
output o_adf4371_hop1,
output o_adf4371_hop2,
output o_SW,
output o_SW2,
output o_SW3,
output o_SW_C1,
//发射通道MGC控制,高衰。31dB,步进1dB。初始态直通(全置1)
output o_T_MGC_1dB,
output o_T_MGC_2dB,
output o_T_MGC_4dB,
output o_T_MGC_8dB,
output o_T_MGC_16dB,
//接收通道1MGC控制,高衰。31dB,步进1dB。初始态直通(全置1)
output reg[7:0] o_R_MGC_1,
//接收通道2MGC控制,高衰。31dB,步进1dB。初始态直通(全置1)
output reg[7:0] o_R_MGC_2,
//接收通道3MGC控制,高衰。31dB,步进1dB。初始态直通(全置1)
output reg[7:0] o_R_MGC_3,
//接收通道4MGC控制,高衰。31dB,步进1dB。初始态直通(全置1)
output reg[7:0] o_R_MGC_4
);
reg TR_SW_F;
reg [2:0] TP_EN_r;
reg [2:0] T_MGC_EN_r;
reg [2:0] R_MGC_EN_r;
reg [2:0] R_CAL_F;
reg [15:0] hop_fre_code;
reg [15:0] current_fre_code;
wire [15:0] cal_fre_code;
reg [47:0] fre_code_a_b;
reg hop_en;
reg hop_en_r;
reg hop_en_rr;
reg cfg_en;
reg cfg_en_r;
reg cfg_en_rr;
reg hmc704_1_hop;
reg hmc704_2_hop;
reg [1:0] cnt_cfg;
reg [1:0] cnt_hop;
reg sw1;
reg sw2;
reg sw3;
reg SW_C1;
reg T_MGC_1dB_r ;
reg T_MGC_2dB_r ;
reg T_MGC_4dB_r ;
reg T_MGC_8dB_r ;
reg T_MGC_16dB_r;
assign o_SW = sw1;
assign o_SW2 = sw2;
assign o_SW3 = sw3;
assign o_SW_C1 = SW_C1;
assign o_current_fre_code= current_fre_code;
assign o_cal_fre_code = cal_fre_code;
assign o_hop_fre_code = hop_fre_code;
assign o_adf4371_hop1 = hmc704_1_hop;
assign o_adf4371_hop2 = hmc704_2_hop;
assign o_T_MGC_1dB = T_MGC_1dB_r ;
assign o_T_MGC_2dB = T_MGC_2dB_r ;
assign o_T_MGC_4dB = T_MGC_4dB_r ;
assign o_T_MGC_8dB = T_MGC_8dB_r ;
assign o_T_MGC_16dB = T_MGC_16dB_r ;
always@(posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
TR_SW_F <= 1'b0;
TP_EN_r <= 3'b0;
T_MGC_EN_r <= 3'b0;
R_MGC_EN_r <= 3'b0;
R_CAL_F <= 3'b0;
end
else begin
TR_SW_F <= i_TR_SW_F;
TP_EN_r <= {TP_EN_r[1:0] ,i_TP_EN_F};
T_MGC_EN_r <= {T_MGC_EN_r[1:0] ,i_T_MGC_EN_F};
R_MGC_EN_r <= {R_MGC_EN_r[1:0] ,i_R_MGC_EN_F};
R_CAL_F <= {R_CAL_F[1:0] ,i_CAL_F};
end
end
always@(posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
SW_C1 <= 1'b0;
current_fre_code <= 16'h6d6 ;
end
else begin
current_fre_code <= hop_en ? hop_fre_code : current_fre_code ;
if(TR_SW_F==1'b1)begin
if(current_fre_code<=1500)//20.375Ghz~21.875Ghz
SW_C1 <= 1'b1;
else //21.875Ghz~23.875Ghz
SW_C1 <= 1'b0;
end
else begin
SW_C1 <= SW_C1;
end
end
end
assign cal_fre_code = R_CAL_F==3'b001 ? hop_fre_code : cal_fre_code ;
always@(posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
fre_code_a_b <= 48'h0000000006d6;
end
else if(cfg_en)begin
fre_code_a_b <= {fre_code_a_b[31:0],i_fre_code};
end
else begin
fre_code_a_b <= fre_code_a_b;
end
end
always@(posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
hop_en <= 1'b0;
end
else if(TP_EN_r==3'b011)begin
hop_en <= 1'b1;
end
else begin
hop_en <= 1'b0;
end
end
always@(posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
hop_fre_code <= 16'h6d6;
end
else begin
hop_fre_code <= i_fre_code;
end
end
always@(posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
cfg_en <= 1'b0;
end
else if(hop_fre_code != i_fre_code)begin
cfg_en <= 1'b1;
end
else begin
cfg_en <= 1'b0;
end
end
always @ (posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
hop_en_r <= 1'b0;
hop_en_rr <= 1'b0;
end
else begin
hop_en_r <= hop_en;
hop_en_rr <= hop_en_r;
end
end
always @ (posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
cfg_en_r <= 1'b0;
cfg_en_rr <= 1'b0;
end
else begin
cfg_en_r <= cfg_en;
cfg_en_rr <= cfg_en_r;
end
end
reg [15:0] pre_hop_fre_code;
always @ (posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
cnt_hop <= 2'b00;
end
else if(cnt_hop == 2'b10)begin
cnt_hop <= 2'b00;
end
else if(~hop_en_r & hop_en && (pre_hop_fre_code!=hop_fre_code ))begin
cnt_hop <= cnt_hop + 1'b1;
end
else begin
cnt_hop <= cnt_hop;
end
end
always @ (posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
cnt_cfg <= 2'b00;
end
else if(cnt_cfg == 2'b10)begin
cnt_cfg <= 2'b00;
end
else if(~cfg_en_r&cfg_en)begin
cnt_cfg <= cnt_cfg + 1'b1;
end
else begin
cnt_cfg <= cnt_cfg;
end
end
always @ (posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)
pre_hop_fre_code<=16'h6d6;
else if(hop_en_rr)
pre_hop_fre_code<=hop_fre_code;
else
pre_hop_fre_code<=pre_hop_fre_code;
end
always @ (posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
sw1 <= 1'b1;
sw2 <= 1'b1;
sw3 <= 1'b0;
end
else if(i_ceshi_module==4'ha)//自动校准开关到a
begin
sw1 <= 1'b0;
sw2 <= 1'b0;
sw3 <= 1'b1;
end
else if(i_ceshi_module==4'hb)//自动校准开关到b
begin
sw1 <= 1'b1;
sw2 <= 1'b1;
sw3 <= 1'b0;
end
else if(hop_en_rr && pre_hop_fre_code != hop_fre_code)begin
if(cnt_hop == 2'b01)begin
sw1 <= 1'b0;
sw2 <= 1'b0;
sw3 <= 1'b1;
end
else begin
sw1 <= 1'b1;
sw2 <= 1'b1;
sw3 <= 1'b0;
end
end
else begin
sw1 <= sw1;
sw2 <= sw2;
sw3 <= sw3;
end
end
always @ (posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
hmc704_1_hop <= 1'b0;
hmc704_2_hop <= 1'b0;
end
else if(i_ceshi_module==4'ha&&cfg_en_rr)begin
hmc704_1_hop <= 1'b1;
hmc704_2_hop <= 1'b0;
end
else if(i_ceshi_module==4'hb&&cfg_en_rr)begin
hmc704_1_hop <= 1'b0;
hmc704_2_hop <= 1'b1;
end
else if(cfg_en_rr)begin
if(fre_code_a_b[47:32]==fre_code_a_b[15:0])begin
hmc704_1_hop <= 1'b0;
hmc704_2_hop <= 1'b0;
end
else if(cnt_cfg == 2'b01)begin
hmc704_1_hop <= 1'b1;
hmc704_2_hop <= 1'b0;
end
else begin
hmc704_1_hop <= 1'b0;
hmc704_2_hop <= 1'b1;
end
end
else begin
hmc704_1_hop <= 1'b0;
hmc704_2_hop <= 1'b0;
end
end
/* always @ (posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
sw1 <= 1'b1;
sw2 <= 1'b1;
sw3 <= 1'b0;
end
end
always @ (posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
hmc704_1_hop <= 1'b0;
hmc704_2_hop <= 1'b0;
end
else if(cfg_en_rr)begin
hmc704_1_hop <= 1'b0;
hmc704_2_hop <= 1'b1;
end
else begin
hmc704_1_hop <= 1'b0;
hmc704_2_hop <= 1'b0;
end
end */
always@(posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
T_MGC_1dB_r <= 1'b0;
T_MGC_2dB_r <= 1'b0;
T_MGC_4dB_r <= 1'b0;
T_MGC_8dB_r <= 1'b0;
T_MGC_16dB_r <= 1'b0;
end
else if(i_ceshi_module==4'ha || i_ceshi_module==4'hb )begin
T_MGC_1dB_r <= 1'b0;
T_MGC_2dB_r <= 1'b0;
T_MGC_4dB_r <= 1'b0;
T_MGC_8dB_r <= 1'b0;
T_MGC_16dB_r <= 1'b0;
end
else if(T_MGC_EN_r==3'b011)begin
T_MGC_1dB_r <= i_tx_mgc[0];
T_MGC_2dB_r <= i_tx_mgc[1];
T_MGC_4dB_r <= i_tx_mgc[2];
T_MGC_8dB_r <= i_tx_mgc[3];
T_MGC_16dB_r <= i_tx_mgc[4];
end
else begin
T_MGC_1dB_r <= T_MGC_1dB_r ;
T_MGC_2dB_r <= T_MGC_2dB_r ;
T_MGC_4dB_r <= T_MGC_4dB_r ;
T_MGC_8dB_r <= T_MGC_8dB_r ;
T_MGC_16dB_r <= T_MGC_16dB_r ;
end
end
always@(posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
o_R_MGC_1 <= 1'b0;
end
else if(R_MGC_EN_r==3'b011)begin
o_R_MGC_1 <= i_rx1_mgc;
end
end
always@(posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
o_R_MGC_2 <= 1'b0;
end
else if(R_MGC_EN_r==3'b011)begin
o_R_MGC_2 <= i_rx2_mgc;
end
end
always@(posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
o_R_MGC_3 <= 1'b0;
end
else if(R_MGC_EN_r==3'b011)begin
o_R_MGC_3 <= i_rx3_mgc;
end
end
always@(posedge i_sys_clk or negedge i_rst_n)begin
if(!i_rst_n)begin
o_R_MGC_4 <= 1'b0;
end
else if(R_MGC_EN_r==3'b011)begin
o_R_MGC_4 <= i_rx4_mgc;
end
end
endmodule
@@ -0,0 +1,71 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 15:35:03 01/27/2022
// Design Name:
// Module Name: mod2_rom
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module mod2_rom(
input sysclk,
input [11 : 0] addra,
output reg[13:0] douta
);
reg[11:0] addr=0;
always@(posedge sysclk)begin
addr<=addra%25;
end
always@(posedge sysclk)begin
case(addr)
0 : douta <= 1 ;
1 : douta <= 25 ;
2 : douta <= 25 ;
3 : douta <= 25 ;
4 : douta <= 25 ;
5 : douta <= 5 ;
6 : douta <= 25 ;
7 : douta <= 25 ;
8 : douta <= 25 ;
9 : douta <= 25 ;
10 : douta <= 5 ;
11 : douta <= 25 ;
12 : douta <= 25 ;
13 : douta <= 25 ;
14 : douta <= 25 ;
15 : douta <= 5 ;
16 : douta <= 25 ;
17 : douta <= 25 ;
18 : douta <= 25 ;
19 : douta <= 25 ;
20 : douta <= 5 ;
21 : douta <= 25 ;
22 : douta <= 25 ;
23 : douta <= 25 ;
24 : douta <= 25 ;
default:douta <= douta ;
endcase
end
endmodule
@@ -0,0 +1,150 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 20:42:39 09/29/2021
// Design Name:
// Module Name: spi_master
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module spi_master #(parameter BIT_NUM = 95 )(
input i_clk ,
input debug_clk ,
input i_sys_rst_n ,
input i_spi_sck ,
input i_spi_cs ,
output o_spi_sdo ,
input i_spi_sdi ,
input i_LD_LO3 ,
input i_LD1 ,
input i_LD2 ,
input[3:0] i_cal1_mgc ,
input[3:0] i_cal2_mgc ,
input[3:0] i_cal3_mgc ,
input[3:0] i_cal4_mgc ,
input[7:0] i_temp ,
input[31:0] i_frame_count
);
wire [BIT_NUM:0] data ;
reg [BIT_NUM:0] data_r ;
reg [BIT_NUM:0] data_reg ;
assign data={ 8'hAA ,
i_temp ,
7'b0,i_LD_LO3 ,
7'b0,i_LD1 ,
7'b0,i_LD2 ,
i_cal1_mgc,i_cal2_mgc ,
i_cal3_mgc,i_cal4_mgc ,
i_frame_count ,
8'hCC } ;
wire spi_sck ;
wire spi_cs ;
reg spi_sdo ;
reg [2:0] reg_cs ;
reg [31:0] cnt ;
assign spi_sck = i_spi_sck;
assign spi_cs = i_spi_cs;
assign o_spi_sdo = spi_sdo;
always@(negedge spi_sck,negedge i_sys_rst_n)begin
if(!i_sys_rst_n)
reg_cs<=3'b111;
else
reg_cs<={reg_cs[1:0],i_spi_cs};
end
always@(negedge spi_sck,negedge i_sys_rst_n)begin
if(!i_sys_rst_n)
data_r<={8'hAA,80'b0,8'hCC};
else if(reg_cs[2:1]==2'b10)
data_r<={8'hAA,data[87:8],8'hCC};
end
always@(negedge spi_sck,negedge i_sys_rst_n)begin
if(!i_sys_rst_n)
spi_sdo <= 1'b0 ;
else if(!spi_cs)
spi_sdo <= data_r[cnt];
else
spi_sdo <= 1'b0 ;
end
always@(posedge spi_sck,negedge i_sys_rst_n)begin
if(!i_sys_rst_n)
cnt<=BIT_NUM;
else if(spi_cs==1 | cnt==0)
cnt<=BIT_NUM;
else
cnt<=cnt-1;
end
//------------debug------------
always@(posedge spi_sck,negedge i_sys_rst_n)begin
if(!i_sys_rst_n)
data_reg <= 0 ;
else if(!spi_cs)
data_reg <= {data_reg,spi_sdo} ;
else
data_reg <= data_reg ;
end
//------------debug------------
/*
wire [40:0] SYNC_OUT ;
wire [35:0] CONTROL0 ;
wire [35:0] CONTROL1 ;
wire [150:0] TRIG0 ;
vio u_vio (
.CONTROL (CONTROL0), // INOUT BUS [35:0]
.CLK (i_clk), // IN
.SYNC_OUT (SYNC_OUT) // OUT BUS [33:0]
);
icon u_icon (
.CONTROL0 (CONTROL0), // INOUT BUS [35:0]
.CONTROL1 (CONTROL1) // INOUT BUS [35:0]
);
ila u_ila (
.CONTROL (CONTROL1), // INOUT BUS [35:0]
.CLK (debug_clk), // IN
.TRIG0 (TRIG0) // IN BUS [39:0]
);
assign TRIG0[0] = i_LD_LO3;
assign TRIG0[1] = i_LD1 ;
assign TRIG0[2] = i_LD2 ;
assign TRIG0[98:3] = data_r ;
assign TRIG0[101:99] = reg_cs ;
assign TRIG0[132:102] = cnt ;
assign TRIG0[133] = i_spi_sck ;
assign TRIG0[134] = i_spi_cs ;
assign TRIG0[135] = o_spi_sdo ;
assign TRIG0[136] = i_spi_sdi ;
*/
endmodule
@@ -0,0 +1,171 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2020/09/02 10:48:55
// Design Name:
// Module Name: d
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
// SPI时钟频率50MHz。每一帧数据12个字节,共96bit数据。
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module spi_slave#(
parameter BIT_NUM = 96
)
(
input i_sys_clk,
input i_sys_rst_n,
input i_spi_sck, //从机在时钟下降沿采样数据
input i_spi_cs, //低电平时从机接收数据指令
input i_spi_sdi,
output [31:0] o_frame_count, //帧计数
output [15:0] o_fre_code , //天线频率
output [7:0] o_tx_mgc, //发射MGC
output [3:0] o_model, //模式字
output [3:0] o_rf_en, //射频使能
output [3:0] o_cal1_mgc, //接收校准1mgc
output [3:0] o_cal2_mgc, //接收校准2mgc
output [3:0] o_cal3_mgc, //接收校准3mgc
output [3:0] o_cal4_mgc, //接收校准4mgc
output [7:0] o_tx_cal_mgc, //发射校准mgc
output [7:0] o_rx1_mgc, //接收1mgc
output [7:0] o_rx2_mgc, //接收2mgc
output [7:0] o_rx3_mgc, //接收3mgc
output [7:0] o_rx4_mgc , //接收4mgc
output [3:0] o_ceshi_model
);
reg [BIT_NUM -1:0] receive_data;
reg [3:0] rf_en ;
reg [3:0] model;
reg [31:0] frame_count;
reg [11:0] fre_code;
reg [7:0] tx_mgc;
reg [7:0] rx1_mgc;
reg [7:0] rx2_mgc;
reg [7:0] rx3_mgc;
reg [7:0] rx4_mgc;
reg [3:0] cal1_mgc;
reg [3:0] cal2_mgc;
reg [3:0] cal3_mgc;
reg [3:0] cal4_mgc;
reg [7:0] tx_cal_mgc;
reg [3:0] ceshi_module;
assign o_frame_count= frame_count;
assign o_fre_code = {4'b0,fre_code};
assign o_rf_en = rf_en;
assign o_model = model;
assign o_tx_mgc = tx_mgc;
assign o_cal1_mgc = cal1_mgc;
assign o_cal2_mgc = cal2_mgc;
assign o_cal3_mgc = cal3_mgc;
assign o_cal4_mgc = cal4_mgc;
assign o_tx_cal_mgc = tx_cal_mgc;
assign o_rx1_mgc = rx1_mgc;
assign o_rx2_mgc = rx2_mgc;
assign o_rx3_mgc = rx3_mgc;
assign o_rx4_mgc = rx4_mgc;
assign o_ceshi_model = ceshi_module;
always @ ( negedge i_spi_sck or negedge i_sys_rst_n)begin
if( !i_sys_rst_n )
receive_data <= 'b0;
else if(i_spi_cs == 1'b0)
receive_data <= {receive_data,i_spi_sdi};
else
receive_data <= receive_data;
end
reg [2:0] cs_reg;
always @ ( posedge i_sys_clk or negedge i_sys_rst_n)begin
if( !i_sys_rst_n )
cs_reg <= 3'b111;
else
cs_reg <= {cs_reg[1:0],i_spi_cs};
end
always @ ( posedge i_sys_clk or negedge i_sys_rst_n)begin
if(!i_sys_rst_n)begin
tx_cal_mgc<=8'h0;
end
else if(cs_reg[2:1]==2'b01 && (receive_data[95:88] == 8'hbb) && (receive_data[7:0] == 8'hdd))begin
tx_cal_mgc<=receive_data[15:8];
end
else begin
tx_cal_mgc<=tx_cal_mgc;
end
end
always @ ( posedge i_sys_clk or negedge i_sys_rst_n)begin
if(!i_sys_rst_n)begin
fre_code <= 12'h6d6;
tx_mgc <= 8'h00;
rf_en <= 4'b1;
model <= 4'b0;
frame_count <= 32'd1;
rx1_mgc <= 4'h0;
rx2_mgc <= 4'h0;
rx3_mgc <= 4'h0;
rx4_mgc <= 4'h0;
cal1_mgc <= 4'h0;
cal2_mgc <= 4'h0;
cal3_mgc <= 4'h0;
cal4_mgc <= 4'h0;
ceshi_module <= 4'h0;
end
else if(cs_reg[2:1]==2'b01 && (receive_data[95:88] == 8'haa) && (receive_data[7:0] == 8'hcc))begin
frame_count <= frame_count+1'b1;
rf_en <= receive_data[87:84];
model <= receive_data[83:80];
ceshi_module<= receive_data[79:76];
fre_code <= receive_data[75:64];
tx_mgc <= receive_data[63:56];
cal1_mgc <= receive_data[55:52];
cal2_mgc <= receive_data[51:48];
cal3_mgc <= receive_data[47:44];
cal4_mgc <= receive_data[43:40];
rx1_mgc <= receive_data[39:32];
rx2_mgc <= receive_data[31:24];
rx3_mgc <= receive_data[23:16];
rx4_mgc <= receive_data[15:8];
end
else begin
frame_count <= frame_count ;
rf_en <= rf_en ;
model <= model ;
fre_code <= fre_code ;
tx_mgc <= tx_mgc ;
cal1_mgc <= cal1_mgc ;
cal2_mgc <= cal2_mgc ;
cal3_mgc <= cal3_mgc ;
cal4_mgc <= cal4_mgc ;
rx1_mgc <= rx1_mgc ;
rx2_mgc <= rx2_mgc ;
rx3_mgc <= rx3_mgc ;
rx4_mgc <= rx4_mgc ;
end
end
endmodule
@@ -0,0 +1,118 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 15:23:58 10/12/2020
// Design Name: spi发送模块
// Module Name: spi
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module spi_tx #(parameter WHITH=32)(
input clk,//系统时钟
input rstn,//异步复位
input tx_en,//发送使能
input [WHITH-1:0] data_in,//待发送数据
output reg spi_cs, //片选
output reg spi_sclk, //同步时钟,等于clk/2
output reg spi_sdo, //发送数据的线
output reg DARY
);
//localparam [1:0] polaeity = 2'b10;//negedge 数据下降沿保持
localparam [1:0] polaeity = 2'b01;//posedge 数据上降沿保持
reg [2:0] state ; //状态机
reg [WHITH-1:0] reg_data;//移位寄存器
reg [5:0] cnt;//计数器,必须大于数据位宽
wire CPOL ; //时钟空闲时电平
wire CPHA ; //极性
assign CPOL = polaeity[0] ;
assign CPHA = polaeity[1] ;
always @(posedge clk,negedge rstn)begin
if(!rstn)begin
state <= 3'd0;
spi_cs <= 1'b1;
spi_sclk <= CPOL;
reg_data <= 1'd0;
cnt <= 5'b0;
spi_sdo <= 1'b0;
DARY <= 1'b1;
end
else begin
case(state)
3'd0:begin//空闲态
spi_sclk <= CPOL ;
spi_cs <= 1'b1 ;
spi_sdo <= 1'b0 ;
DARY <= 1'b1 ;
cnt <= 5'b0 ;
reg_data <= data_in ;
if(tx_en)//发送使能跳下一个状态
state <= 3'd1 ;
else
state <= state ;
end
3'd1:begin
spi_cs <= 1'b0 ;
state <= 3'd2 ;
reg_data <= data_in ;
end
3'd2:begin//数据移位态
spi_cs <= 1'b0 ;
reg_data <= reg_data<<1'b1 ;
spi_sdo <= reg_data[WHITH-1] ;
spi_sclk <= CPHA ;
state <= (cnt >= WHITH-1) ? 3'd4:3'd3;
end
3'd3:begin//时钟翻转
cnt <= cnt+1'b1 ;
spi_sclk <= ~CPHA ;
state <= 3'd2 ;
end
3'd4:begin//结束态
state <= 3'd5;
spi_sclk <= ~CPHA;
end
3'd5:begin//结束态
state <= 3'd6;
DARY <= 0;
spi_sdo <= 1'b0 ;
spi_cs <= 1'b1 ;
end
3'd6:begin//结束态
state <= 3'd7;
DARY <= 1;
spi_cs <= 1'b1 ;
end
3'd7:begin//结束态
state <= 3'd8;
DARY <= 0;
end
3'd8:begin//结束态
state <= 3'd0;
DARY <= 1;
end
default :state<=3'd0;
endcase
end
end
endmodule
@@ -0,0 +1,509 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2022/07/13 14:20:24
// Design Name:
// Module Name: ant_rf_ctrl
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module ant_rf_ctrl
(
input clk_48m ,
input clk_96m ,
input clk_32m ,
input clk_19p2m ,
input sys_rst ,
output ant_clk ,
output ant_en ,
output ant_data ,
output ant_tr ,
output ant_dary ,
input ant_dout ,
output rf_standby ,
output rf_sw_pll ,
output rf_t ,
output rf_r ,
output rf_sw_bpf ,
output rf_sclk1 ,
output rf_sdio1 ,
output rf_cs1 ,
input rf_ld1 ,
output rf_sclk2 ,
output rf_sdio2 ,
output rf_cs2 ,
input rf_ld2 ,
output rf_sclk3 ,
output rf_sdio3 ,
output rf_cs3 ,
input rf_ld3 ,
output rf_tmgc_16 ,
output rf_tmgc_8 ,
output rf_tmgc_4 ,
output rf_tmgc_2 ,
output rf_tmgc_1 ,
output rf_rmgc_16 ,
output rf_rmgc_8 ,
output rf_rmgc_4 ,
output rf_rmgc_2 ,
output rf_rmgc_1 ,
output rf_enable ,
output rf_sc ,
output rf_sd ,
output rf_endsyn ,
input rf_sdout ,
inout rf_dq_wd ,
output rf_sw_rx
);
(*dont_touch = "true"*) wire vio_switch ; // 键控开关,沿有效
(*dont_touch = "true"*) wire vio_trdirection ; // 收发方向
(*dont_touch = "true"*) wire [15:0] vio_frequency ; // 收发频率
(*dont_touch = "true"*) wire [ 7:0] vio_emitMGC ; // 发送MGC
(*dont_touch = "true"*) wire [ 3:0] vio_ch01MGC ; // 1通道校准MGC
(*dont_touch = "true"*) wire [ 3:0] vio_ch02MGC ; // 2通道校准MGC
(*dont_touch = "true"*) wire [ 3:0] vio_ch03MGC ; // 3通道校准MGC
(*dont_touch = "true"*) wire [ 3:0] vio_ch04MGC ; // 4通道校准MGC
(*dont_touch = "true"*) wire [ 7:0] vio_recvMGC ; // 接收MGC
(*dont_touch = "true"*) wire [ 7:0] vio_AntMod ; // 天线工作模式
(*dont_touch = "true"*) wire [15:0] vio_AntOffAxis ; // 天线离轴角
(*dont_touch = "true"*) wire [15:0] vio_AntYaw ; // 天线偏航角
(*dont_touch = "true"*) wire [15:0] vio_PrecessTime ; // 处理时间,从EN拉低到DARY拉低
(*dont_touch = "true"*)wire vio_mode_ant ; // 0定频手动,1扫频模式
(*dont_touch = "true"*)wire vio_hop_start ; // 0跳频终止,1重新跳频
(*dont_touch = "true"*)wire vio_standby ; // 0待机模式,1工作模式
(*dont_touch = "true"*)wire [15:0] vio_hoptime ; // 单跳时间计数器
reg Ant_switch_D1 = 0;
reg data_valid = 0;
reg switch_valid = 0;
reg [95:0] RF_CtrlWord = 0;
reg [127:0] Ant_CtrlWord = 0;
reg [15:0] data_valid_countdown = 0;
reg [15:0] rst_countdown = 100;
reg [95:0] RF_CtrlWord_running = 0;
reg [127:0] Ant_CtrlWord_running = 0;
reg rst_n = 0;
reg SPI_SYN_F = 1;
reg SPI_MOSI_F = 1;
reg TP_EN_F = 0;
reg TR_MGC_F = 0;
reg CAL_F = 0;
reg PRF = 0;
wire SPI_MISO_F;
reg Ant_DATA = 0;
reg Ant_EN = 0;
reg Ant_DARY = 0;
reg Ant_TR = 0;
//相控阵测试程序
reg [15:0] cnt_freq_change = 16'd0;
reg Ant_switch ; // 键控开关,沿有效
reg [15:0] Ant_frequency; // 收发频率
reg [ 7:0] Ant_mode ; // 相控阵模式
reg [ 7:0] RF_mode ; // 射频模式
always @ (posedge clk_48m) begin
if(sys_rst) begin
Ant_switch <= 1'b0;
cnt_freq_change[15:0] <= 16'd0;
Ant_frequency[15:0] <= 16'd0;
RF_mode[7:0] <= 8'h10;
Ant_mode[7:0] <= 8'h0f;
end
else begin
if(vio_mode_ant) begin
if(vio_hop_start) begin
if(cnt_freq_change[15:0] == (vio_hoptime[15:0] - 16'd1)) begin
Ant_switch <= ~Ant_switch;
if(Ant_frequency[15:0] == 16'd3500) begin
Ant_frequency[15:0] <= 16'd0;
end
else begin
Ant_frequency[15:0] <= Ant_frequency[15:0] + 16'd1;
end
cnt_freq_change[15:0] <= 16'd0;
end
else begin
Ant_switch <= Ant_switch;
Ant_frequency[15:0] <= Ant_frequency[15:0];
cnt_freq_change[15:0] <= cnt_freq_change[15:0] + 16'd1;
end
end
else begin
Ant_switch <= Ant_switch;
Ant_frequency[15:0] <= 16'd0;
cnt_freq_change[15:0] <= 16'd0;
end
end
else begin
Ant_switch <= vio_switch;
Ant_frequency[15:0] <= vio_frequency[15:0];
cnt_freq_change[15:0] <= 16'd0;
end
if(vio_standby) begin
RF_mode[7:0] <= 8'h10;
Ant_mode[7:0] <= 8'h0f;
end
else begin
RF_mode[7:0] <= 8'h00;
Ant_mode[7:0] <= vio_AntMod[7:0];
end
end
end
always @(posedge clk_48m)
begin
Ant_switch_D1 <= Ant_switch;
if(Ant_switch_D1 != Ant_switch)
switch_valid <= 1'b1;
else
switch_valid <= 1'b0;
if(switch_valid)
begin
RF_CtrlWord[95:88] <= 8'hAA;
RF_CtrlWord[87:80] <= RF_mode[7:0];
RF_CtrlWord[79:64] <= Ant_frequency[15:0];
RF_CtrlWord[63:56] <= vio_emitMGC[7:0];
RF_CtrlWord[55:52] <= vio_ch01MGC[3:0];
RF_CtrlWord[51:48] <= vio_ch02MGC[3:0];
RF_CtrlWord[47:44] <= vio_ch03MGC[3:0];
RF_CtrlWord[43:40] <= vio_ch04MGC[3:0];
RF_CtrlWord[39:32] <= vio_recvMGC[7:0];
RF_CtrlWord[31:8] <= 24'h00_0000;
RF_CtrlWord[7:0] <= 8'hCC;
Ant_CtrlWord[127:120] <= 8'hAA;
Ant_CtrlWord[119:112] <= 8'h00;
Ant_CtrlWord[111:104] <= Ant_mode[7:0];
Ant_CtrlWord[103: 88] <= vio_AntOffAxis[15:0];
Ant_CtrlWord[ 87: 72] <= vio_AntYaw[15:0];
Ant_CtrlWord[ 71: 56] <= Ant_frequency[15:0];
Ant_CtrlWord[ 55: 8] <= 48'h00_00_00_00_00_00;
Ant_CtrlWord[ 7: 0] <= 8'hCC;
end
else
begin
RF_CtrlWord[95:0] <= RF_CtrlWord[95:0];
Ant_CtrlWord[127:0] <= Ant_CtrlWord[127:0];
end
if(switch_valid)
data_valid_countdown[15:0] <= vio_PrecessTime[15:0];
else if(data_valid_countdown[15:0] != 16'd0)
data_valid_countdown[15:0] <= data_valid_countdown[15:0] - 16'd1;
// RF控制
if(data_valid_countdown[15:0] == vio_PrecessTime[15:0])
RF_CtrlWord_running[95:0] <= RF_CtrlWord[95:0];
else
RF_CtrlWord_running[95:0] <= {RF_CtrlWord_running[94:0],1'b0};
if(data_valid_countdown[15:0] >= vio_PrecessTime[15:0]-16'd96 && data_valid_countdown[15:0] < vio_PrecessTime[15:0])
begin
SPI_SYN_F <= 1'b0;
SPI_MOSI_F <= RF_CtrlWord_running[95];
end
else
begin
SPI_SYN_F <= 1'b1;
SPI_MOSI_F <= 1'b0;
end
if(data_valid_countdown[15:0] <= 16'd128 && data_valid_countdown[15:0] > 16'd80)
CAL_F <= 1'b1;
else
CAL_F <= 1'b0;
if(data_valid_countdown[15:0] <= 16'd48 && data_valid_countdown[15:0] > 16'd0)
begin
TP_EN_F <= 1'b1;
TR_MGC_F <= 1'b1;
end
else
begin
TP_EN_F <= 1'b0;
TR_MGC_F <= 1'b0;
end
if(data_valid_countdown[15:0] == 16'd48)
PRF <= vio_trdirection;
else
PRF <= PRF;
if(sys_rst)
rst_countdown[15:0] <= 16'd100;
else if(rst_countdown[15:0] != 0)
begin
rst_countdown[15:0] <= rst_countdown[15:0] - 16'd1;
rst_n <= 1'b0;
end
else
begin
rst_countdown[15:0] <= rst_countdown[15:0];
rst_n <= 1'b1;
end
// 天线控制
if(data_valid_countdown[15:0] == vio_PrecessTime[15:0])
Ant_CtrlWord_running[127:0] <= Ant_CtrlWord[127:0];
else
Ant_CtrlWord_running[127:0] <= {Ant_CtrlWord_running[126:0],1'b0};
if(data_valid_countdown[15:0] >= vio_PrecessTime[15:0]-16'd128 && data_valid_countdown[15:0] < vio_PrecessTime[15:0])
begin
Ant_EN <= 1'b0;
Ant_DATA <= Ant_CtrlWord_running[127];
end
else
begin
Ant_EN <= 1'b1;
Ant_DATA <= 1'b0;
end
if(data_valid_countdown[15:0] <= 16'd48 && data_valid_countdown[15:0] > 16'd0)
Ant_DARY <= 1'b0;
else
Ant_DARY <= 1'b1;
if(data_valid_countdown[15:0] == 16'd48)
Ant_TR <= vio_trdirection;
else
Ant_TR <= Ant_TR;
end
//RF recv_data
reg [1:0] state_rfdata;
reg SPI_SYN_F_d1 = 1'b0;
reg [15:0] cnt_rfdata = 16'd0;
reg [95:0] RF_RecvWord = 96'd0;
reg [95:0] RF_RecvWord_last = 96'd0;
reg [7:0] RF_temperature = 8'd0 ;
reg [7:0] RF_IFlocked = 8'd0 ;
reg [7:0] RF_RFAlocked = 8'd0 ;
reg [7:0] RF_RFBlocked = 8'd0 ;
reg [3:0] RF_ch1mgc = 4'd0 ;
reg [3:0] RF_ch2mgc = 4'd0 ;
reg [3:0] RF_ch3mgc = 4'd0 ;
reg [3:0] RF_ch4mgc = 4'd0 ;
reg [31:0] RF_Framecount = 32'd0 ;
always @ (posedge clk_48m) begin
if(sys_rst) begin
state_rfdata[1:0] <= 2'd0;
SPI_SYN_F_d1 <= 1'b0;
RF_RecvWord[95:0] <= 96'd0;
cnt_rfdata[15:0] <= 16'd0;
RF_temperature[7:0] <= 8'd0 ;
RF_IFlocked[7:0] <= 8'd0 ;
RF_RFAlocked[7:0] <= 8'd0 ;
RF_RFBlocked[7:0] <= 8'd0 ;
RF_ch1mgc[3:0] <= 4'd0 ;
RF_ch2mgc[3:0] <= 4'd0 ;
RF_ch3mgc[3:0] <= 4'd0 ;
RF_ch4mgc[3:0] <= 4'd0 ;
RF_Framecount[31:0] <= 32'd0;
end
else begin
RF_RecvWord[95:0] <= {RF_RecvWord[94:0],SPI_MISO_F};
if (RF_RecvWord[95:88] == 8'hAA && RF_RecvWord[7:0] == 8'hCC) begin//校验帧头帧尾
RF_temperature[7:0] <= RF_RecvWord[87:80];
RF_IFlocked[7:0] <= RF_RecvWord[79:72];
RF_RFAlocked[7:0] <= RF_RecvWord[71:64];
RF_RFBlocked[7:0] <= RF_RecvWord[63:56];
RF_ch1mgc[3:0] <= RF_RecvWord[55:52];
RF_ch2mgc[3:0] <= RF_RecvWord[51:48];
RF_ch3mgc[3:0] <= RF_RecvWord[47:44];
RF_ch4mgc[3:0] <= RF_RecvWord[43:40];
RF_Framecount[31:0] <= RF_RecvWord[39:8];
RF_RecvWord_last <= RF_RecvWord;
end
else begin // hold otherwise
RF_temperature[7:0] <= RF_temperature[7:0];
RF_IFlocked[7:0] <= RF_IFlocked[7:0] ;
RF_RFAlocked[7:0] <= RF_RFAlocked[7:0] ;
RF_RFBlocked[7:0] <= RF_RFBlocked[7:0] ;
RF_ch1mgc[3:0] <= RF_ch1mgc[3:0] ;
RF_ch2mgc[3:0] <= RF_ch2mgc[3:0] ;
RF_ch3mgc[3:0] <= RF_ch3mgc[3:0] ;
RF_ch4mgc[3:0] <= RF_ch4mgc[3:0] ;
RF_Framecount[31:0] <= RF_Framecount[31:0];
RF_RecvWord_last <= RF_RecvWord_last;
end
end
end
// 天线的输出时钟转换
reg Ant_dclk_96m = 1;
wire [3:0] fifo_wr_din, fifo_rd_dout;
wire fifo_full, fifo_empty;
reg Ant_EN_96m = 0;
reg Ant_DATA_96m = 0;
reg Ant_DARY_96m = 1;
reg Ant_TR_96m = 0;
assign fifo_wr_din[3] = Ant_EN;
assign fifo_wr_din[2] = Ant_DATA;
assign fifo_wr_din[1] = Ant_DARY;
assign fifo_wr_din[0] = Ant_TR;
reg fifo_rd_en = 0;
reg fifo_rst = 0;
reg [8:0] Ant_clk_countdown = 0;
always @(posedge clk_96m)
begin
fifo_rst <= sys_rst;
fifo_rd_en <= (fifo_rst == 1'b1)? 1'b0:!fifo_rd_en;
if(fifo_rd_en)
{Ant_EN_96m,Ant_DATA_96m,Ant_DARY_96m,Ant_TR_96m} <= fifo_rd_dout[3:0];
else
{Ant_EN_96m,Ant_DATA_96m,Ant_DARY_96m,Ant_TR_96m} <= {Ant_EN_96m,Ant_DATA_96m,Ant_DARY_96m,Ant_TR_96m};
if(fifo_rd_en && Ant_EN_96m && !fifo_rd_dout[3])
Ant_clk_countdown[8:0] <= 9'd276;
else if(Ant_clk_countdown[8:0] != 9'd0)
Ant_clk_countdown[8:0] <= Ant_clk_countdown[8:0] - 9'd1;
else
Ant_clk_countdown[8:0] <= Ant_clk_countdown[8:0];
end
assign ant_clk = !Ant_clk_countdown[0];
assign ant_en = Ant_EN_96m;
assign ant_data = Ant_DATA_96m;
assign ant_tr = Ant_TR_96m;
assign ant_dary = Ant_DARY_96m;
fifo_AntCtrl fifo_AntCtrl
(
.rst (fifo_rst ), // input wire rst
.wr_clk (clk_48m ), // input wire wr_clk
.rd_clk (clk_96m ), // input wire rd_clk
.din (fifo_wr_din[3:0] ), // input wire [3 : 0] din
.wr_en (!fifo_rst ), // input wire wr_en
.rd_en (fifo_rd_en ), // input wire rd_en
.dout (fifo_rd_dout[3:0] ), // output wire [3 : 0] dout
.full (fifo_full ), // output wire full
.empty (fifo_empty ) // output wire empty
);
//Ant recv_data
reg [1:0] state_antdata;
reg Ant_EN_96m_d1 = 1'b0;
reg [15:0] cnt_antdata = 16'd0;
reg [95:0] Ant_RecvWord = 'b0;
reg [95:0] Ant_RecvWord_last = 'b0;
reg [7:0] Ant_Ant_Volt = 8'd0 ;
reg [7:0] Ant_RF_Volt = 8'd0 ;
reg [7:0] Ant_IF_Volt = 8'd0 ;
reg [7:0] Ant_state = 8'd0 ;
reg [31:0] Ant_Framecount = 32'd0 ;
always @ (posedge clk_96m) begin
if(sys_rst) begin
state_antdata[1:0] <= 2'd0;
Ant_EN_96m_d1 <= 1'b0;
Ant_RecvWord[95:0] <= 'd0;
cnt_antdata[15:0] <= 16'd0;
Ant_Ant_Volt[7:0] <= 8'd0 ;
Ant_RF_Volt[7:0] <= 8'd0 ;
Ant_IF_Volt[7:0] <= 8'd0 ;
Ant_state[7:0] <= 8'd0 ;
Ant_Framecount[31:0] <= 32'd0;
end
else begin
Ant_RecvWord[95:0] <= {Ant_RecvWord[94:0],ant_dout};
if(Ant_RecvWord[95:88] == 8'hAA && Ant_RecvWord[7:0] == 8'hCC) begin//校验帧头帧尾
Ant_Ant_Volt[7:0] <= Ant_RecvWord[87:80];
Ant_RF_Volt[7:0] <= Ant_RecvWord[79:72];
Ant_IF_Volt[7:0] <= Ant_RecvWord[71:64];
Ant_state[7:0] <= Ant_RecvWord[47:40];
Ant_Framecount[31:0] <= Ant_RecvWord[39:8] ;
Ant_RecvWord_last <= Ant_RecvWord ;
end
else begin // hold otherwise
Ant_Ant_Volt[7:0] <= Ant_Ant_Volt[7:0] ;
Ant_RF_Volt[7:0] <= Ant_RF_Volt[7:0] ;
Ant_IF_Volt[7:0] <= Ant_IF_Volt[7:0] ;
Ant_state[7:0] <= Ant_state[7:0] ;
Ant_Framecount[31:0] <= Ant_Framecount[31:0] ;
Ant_RecvWord_last <= Ant_RecvWord_last ;
end
end
end
Sisyif uut(
.clk_40m(clk_32m),
.clk_20m(clk_19p2m),
.SPI_CLK_F(clk_48m),
.rst_n(rst_n),
.SPI_SYN_F(SPI_SYN_F),
.SPI_MOSI_F(SPI_MOSI_F),
.SPI_MISO_F(SPI_MISO_F),
.TP_EN_F(TP_EN_F),
.TR_MGC_F(TR_MGC_F),
.CAL_F(CAL_F),
.PRF(PRF),
.standby(rf_standby),
.SW_PLL(rf_sw_pll),
.T(rf_t),
.R(rf_r),
.SW_BPF(rf_sw_bpf),
.SCLK1(rf_sclk1),
.SDIO1(rf_sdio1),
.CS1(rf_cs1),
.LD1(rf_ld1),
.SCLK2(rf_sclk2),
.SDIO2(rf_sdio2),
.CS2(rf_cs2),
.LD2(rf_ld2),
.SCLK3(rf_sclk3),
.SDIO3(rf_sdio3),
.CS3(rf_cs3),
.LD3(rf_ld3),
.TMGC_16db(rf_tmgc_16),
.TMGC_8db(rf_tmgc_8),
.TMGC_4db(rf_tmgc_4),
.TMGC_2db(rf_tmgc_2),
.TMGC_1db(rf_tmgc_1),
.RMGC_16db(rf_rmgc_16),
.RMGC_8db(rf_rmgc_8),
.RMGC_4db(rf_rmgc_4),
.RMGC_2db(rf_rmgc_2),
.RMGC_1db(rf_rmgc_1),
.ENABLE(rf_enable),
.SC(rf_sc),
.SD(rf_sd),
.END_SYN(rf_endsyn),
.SDOUT(rf_sdout),
.DQ_WD(rf_dq_wd),
.SW_RX(rf_sw_rx)
);
endmodule
@@ -0,0 +1,133 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
// _ _ ____
// | | ___ ___| |__ / ___| __ _ ___
// _ | |/ _ \/ __| '_ \ | | _ / _` |/ _ \
// | |_| | (_) \__ \ | | | | |_| | (_| | (_) |
// \___/ \___/|___/_| |_| \____|\__,_|\___/
//
// Create Date: 2022/11/01 11:15:25
// Design Name:
// Module Name: clk_dist
// Project Name:
// Target Devices:
// Tool Versions:
// Description: Clock distribution module
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module clk_dist
(
// input clocks
input clk_250m_p , // generated by ad9516, 250mhz
input clk_250m_n ,
input ad9361_1_rx_data_clk, // ad9361 rx data clock, 83.3333mhz
input ad9361_2_rx_data_clk, // ad9361 rx data clock, 83.3333mhz
// output clocks & reset
// global reset
output sys_rst , // global reset signal, active high
output ant_rst , // phased-array & rf control reset signal, active high
// pl signal processing clock
output sys_clk , // 41.6667mhz
output sys_clk_2x , // 83.3333mhz
output sys_clk_3x , // 125mhz
output sys_clk_4x , // 166.6667mhz
output sys_clk_ld , // system main clock locked indicator
// ad9361-1 clocks
output ad9361_1_clk , // 41.6667mhz
output ad9361_1_clk_2x , // 83.3333mhz
output ad9361_1_clk_3x , // 125mhz
output ad9361_1_clk_4x , // 166.6667mhz
output ad9361_1_clk_ld , // ad9361-1 clock group locked indicator
// ad9361-2 clocks
output ad9361_2_clk , // 41.6667mhz
output ad9361_2_clk_2x , // 83.3333mhz
output ad9361_2_clk_3x , // 125mhz
output ad9361_2_clk_4x , // 166.6667mhz
output ad9361_2_clk_ld , // ad9361-2 clock group locked indicator
// phased-array & rf control clocks
output clk_96m ,
output clk_48m ,
output clk_32m ,
output clk_19p2m
);
assign sys_clk = ad9361_1_clk ;
assign sys_clk_2x = ad9361_1_clk_2x;
assign sys_clk_3x = ad9361_1_clk_3x;
assign sys_clk_4x = ad9361_1_clk_4x;
assign sys_clk_ld = ad9361_1_clk_ld;
assign sys_rst = ~sys_clk_ld;
ad9361_clk_gen_cmos_2t2r u_ad9361_1_clk_gen
(
// Clock out ports
.clk_out1 (ad9361_1_clk ), // output clk_out1
.clk_out2 (ad9361_1_clk_2x ), // output clk_out2
.clk_out3 (ad9361_1_clk_3x ), // output clk_out3
.clk_out4 (ad9361_1_clk_4x ), // output clk_out4
// Status and control signals
.locked (ad9361_1_clk_ld ), // output locked
// Clock in ports
.clk_in1 (ad9361_1_rx_data_clk ) // input clk_in1
);
ad9361_clk_gen_cmos_2t2r u_ad9361_2_clk_gen
(
// Clock out ports
.clk_out1 (ad9361_2_clk ), // output clk_out1
.clk_out2 (ad9361_2_clk_2x ), // output clk_out2
.clk_out3 (ad9361_2_clk_3x ), // output clk_out3
.clk_out4 (ad9361_2_clk_4x ), // output clk_out4
// Status and control signals
.locked (ad9361_2_clk_ld ), // output locked
// Clock in ports
.clk_in1 (ad9361_2_rx_data_clk ) // input clk_in1
);
wire ant_clk_stg1_96m;
wire ant_clk_stg1_ld;
wire ant_clk_stg2_ld;
assign ant_rst = ~ant_clk_stg2_ld;
ant_clk_gen_stg1 u_ant_clk_gen_stg1
(
// Clock out ports
.clk_out1 (ant_clk_stg1_96m ), // output clk_out1
// Status and control signals
.locked (ant_clk_stg1_ld ), // output locked
// Clock in ports
.clk_in1_p (clk_250m_p ), // input clk_in1_p
.clk_in1_n (clk_250m_n ) // input clk_in1_n
);
ant_clk_gen_stg2 u_ant_clk_gen_stg2
(
// Clock out ports
.clk_out1 (clk_96m ), // output clk_out1
.clk_out2 (clk_48m ), // output clk_out2
.clk_out3 (clk_32m ), // output clk_out3
.clk_out4 (clk_19p2m ), // output clk_out4
// Status and control signals
.locked (ant_clk_stg2_ld ), // output locked
// Clock in ports
.clk_in1 (ant_clk_stg1_96m ) // input clk_in1
);
endmodule
@@ -0,0 +1,715 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 05/06/2023 02:33:07 PM
// Design Name:
// Module Name: freq_comp
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module freq_comp
#(
parameter DATA_I_WIDTH = 12,
parameter DATA_O_WIDTH = 18,
parameter FREQ_WORD_WIDTH = 32,
parameter FREQ_WORD_LOWER = -4194304,
parameter FREQ_WORD_UPPER = 4194303,
parameter FREQ_WORD_STEP = 1024,
parameter MAX_DMF_NUM = 64,
parameter CHANNEL_NUM = 4,
// length of pseudorandom bit sequence, need to be a power of 2
parameter PRBS_LEN = 128,
// interpolation of input signal, need to be a power of 2
parameter INTERP_RATE = 8,
// signal processing interpolation, need to be a power of 2
parameter PROCESS_INTERP = 2,
// possible position of pn code
parameter PRBS_POS = PRBS_LEN*PROCESS_INTERP
)
(
// clock & reset
input clk ,
input rst ,
// module enable switch
input freq_comp_start ,
output freq_comp_busy ,
// input data
input rx_data_valid ,
input [DATA_I_WIDTH-1 : 0] rx_ch1_i ,
input [DATA_I_WIDTH-1 : 0] rx_ch1_q ,
input [DATA_I_WIDTH-1 : 0] rx_ch2_i ,
input [DATA_I_WIDTH-1 : 0] rx_ch2_q ,
input [DATA_I_WIDTH-1 : 0] rx_ch3_i ,
input [DATA_I_WIDTH-1 : 0] rx_ch3_q ,
input [DATA_I_WIDTH-1 : 0] rx_ch4_i ,
input [DATA_I_WIDTH-1 : 0] rx_ch4_q ,
// configuration
input [$clog2(MAX_DMF_NUM)-1 : 0] dmf_num_per_ch ,
input [FREQ_WORD_WIDTH-1 : 0] freq_manual ,
input freq_manual_en ,
// output frequency result
output [FREQ_WORD_WIDTH-1 : 0] freq_target ,
output freq_target_valid ,
// output dmf result
output ch_peak_valid ,
output [DATA_O_WIDTH-1 : 0] ch1_peak_value_abs ,
output [DATA_O_WIDTH-1 : 0] ch1_peak_value_i ,
output [DATA_O_WIDTH-1 : 0] ch1_peak_value_q ,
output [$clog2(PRBS_POS)-1 : 0] ch1_peak_index ,
output [DATA_O_WIDTH-1 : 0] ch2_peak_value_abs ,
output [DATA_O_WIDTH-1 : 0] ch2_peak_value_i ,
output [DATA_O_WIDTH-1 : 0] ch2_peak_value_q ,
output [$clog2(PRBS_POS)-1 : 0] ch2_peak_index ,
output [DATA_O_WIDTH-1 : 0] ch3_peak_value_abs ,
output [DATA_O_WIDTH-1 : 0] ch3_peak_value_i ,
output [DATA_O_WIDTH-1 : 0] ch3_peak_value_q ,
output [$clog2(PRBS_POS)-1 : 0] ch3_peak_index ,
output [DATA_O_WIDTH-1 : 0] ch4_peak_value_abs ,
output [DATA_O_WIDTH-1 : 0] ch4_peak_value_i ,
output [DATA_O_WIDTH-1 : 0] ch4_peak_value_q ,
output [$clog2(PRBS_POS)-1 : 0] ch4_peak_index
);
localparam STATE_NUM = 5;
localparam [$clog2(STATE_NUM)-1:0]
STATE_IDLE = 0,
STATE_FREQ_SW = 1,
STATE_FREQ_DMF = 2,
STATE_CH_SW = 3,
STATE_CH_DMF = 4;
localparam FREQ_WORD_LOWER_WIDTH = $clog2(FREQ_WORD_LOWER);
localparam FREQ_WORD_UPPER_WIDTH = $clog2(FREQ_WORD_UPPER);
localparam FREQ_WORD_STEP_WIDTH = $clog2(FREQ_WORD_STEP );
localparam DDS_DATA_WIDTH = 8;
localparam STABLE_COUNT_MOD = 16;
localparam CMPY_A_WIDTH = DATA_I_WIDTH;
localparam CMPY_B_WIDTH = DDS_DATA_WIDTH;
localparam CMPY_P_WIDTH = CMPY_A_WIDTH+CMPY_B_WIDTH;
localparam CMPY_P_FULL_WIDTH = CMPY_P_WIDTH+1;
localparam CMPY_OUTPUT_WIDTH = DATA_I_WIDTH;
genvar m;
////////////////////////////////////////////////////////////////////////////////
///////////////////////////// Center State Control /////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// current and next state
reg [$clog2(STATE_NUM)-1 : 0] state_curr = STATE_IDLE;
reg [$clog2(STATE_NUM)-1 : 0] state_next = STATE_IDLE;
// edge detection
reg freq_comp_start_d1 = 'b0;
reg freq_comp_start_d2 = 'b0;
// stable counter, for dds frequency and complex multiplier to be ready
reg [$clog2(STABLE_COUNT_MOD)-1 : 0] cnt_stable = 'b0;
// dmf finish indicator
wire dmf_freq_last_peak_valid;
wire dmf_ch_last_peak_valid [0 : CHANNEL_NUM-1];
// current frequency word
reg signed [FREQ_WORD_WIDTH-1 : 0] freq_word = 'b0;
// frequency scan finish indicator
reg freq_end = 'b0;
// -----------------------------------------------------------------------------
// 1st always block, sequential state transition
// -----------------------------------------------------------------------------
always @(posedge clk) begin
if (rst) begin
state_curr <= STATE_IDLE;
end
else begin
state_curr <= state_next;
end
end
// -----------------------------------------------------------------------------
// 2nd always block, combinational condition judgment
// -----------------------------------------------------------------------------
always @(*) begin
case (state_curr)
STATE_IDLE: begin
if (rx_data_valid && (freq_comp_start_d2 != freq_comp_start_d1)) begin
// when input data valid & either edge of start signal is detected
state_next = STATE_FREQ_SW;
end
else begin
state_next = STATE_IDLE;
end
end
STATE_FREQ_SW: begin
if (cnt_stable == STABLE_COUNT_MOD-1) begin
// wait util dds frequency and complex multiplier is ready
state_next = STATE_FREQ_DMF;
end
else begin
state_next = STATE_FREQ_SW;
end
end
STATE_FREQ_DMF: begin
if (dmf_freq_last_peak_valid) begin
// when dmf is done, check if frequency compensation is over
state_next = freq_end ? STATE_CH_SW : STATE_FREQ_SW;
end
else begin
state_next = STATE_FREQ_DMF;
end
end
STATE_CH_SW : begin
if (cnt_stable == STABLE_COUNT_MOD-1) begin
// wait util dds frequency and complex multiplier is ready
state_next = STATE_CH_DMF;
end
else begin
state_next = STATE_CH_SW;
end
end
STATE_CH_DMF : begin
if (dmf_ch_last_peak_valid[0]) begin
// wait until dmf is done
state_next = STATE_IDLE;
end
else begin
state_next = STATE_CH_DMF;
end
end
default: begin
// hold
state_next = state_next;
end
endcase
end
// -----------------------------------------------------------------------------
// 3rd always block, the sequential FSM output
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// edge detection
// -----------------------------------------------------------------------------
always @(posedge clk) begin
freq_comp_start_d1 <= freq_comp_start;
freq_comp_start_d2 <= freq_comp_start_d1;
end
// -----------------------------------------------------------------------------
// busy indicator
// -----------------------------------------------------------------------------
reg freq_comp_busy_buf = 'b0;
assign freq_comp_busy = freq_comp_busy_buf;
always @(posedge clk) begin
if (rst) begin
freq_comp_busy_buf <= 'b0;
end
else begin
case (state_next)
// change between states
STATE_IDLE : freq_comp_busy_buf <= 1'b0;
STATE_FREQ_SW : freq_comp_busy_buf <= 1'b1;
STATE_FREQ_DMF: freq_comp_busy_buf <= 1'b1;
STATE_CH_SW : freq_comp_busy_buf <= 1'b1;
STATE_CH_DMF : freq_comp_busy_buf <= 1'b1;
default : freq_comp_busy_buf <= freq_comp_busy_buf;
endcase
end
end
// -----------------------------------------------------------------------------
// stable counter, for dds frequency and complex multiplier to be ready
// -----------------------------------------------------------------------------
always @(posedge clk) begin
if (rst) begin
cnt_stable <= 'b0;
end
else case (state_curr)
// change within one state
STATE_FREQ_SW: cnt_stable <= cnt_stable + 1'b1;
STATE_CH_SW : cnt_stable <= cnt_stable + 1'b1;
default : cnt_stable <= 'b0;
endcase
end
// -----------------------------------------------------------------------------
// frequency word control
// -----------------------------------------------------------------------------
// record the frequency word generating the maximum peak
reg [FREQ_WORD_WIDTH-1 : 0] max_freq_peak_freq = 'b0;
always @(posedge clk) begin
if (rst) begin
freq_word <= FREQ_WORD_LOWER;
end
else case (state_next)
// change between states
STATE_FREQ_SW: begin
if (state_curr == STATE_IDLE) begin
// initialization
freq_word <= FREQ_WORD_LOWER;
end
else if (state_curr == STATE_FREQ_DMF) begin
// switch frequency
freq_word <= freq_word + FREQ_WORD_STEP;
end
end
STATE_CH_SW: begin
freq_word <= (freq_manual_en) ? freq_manual : max_freq_peak_freq;
end
default: begin
freq_word <= freq_word;
end
endcase
end
// -----------------------------------------------------------------------------
// frequency scan finish indicator
// -----------------------------------------------------------------------------
always @(posedge clk) begin
if (rst) begin
freq_end <= 'b0;
end
else if (freq_word > FREQ_WORD_UPPER) begin
freq_end <= 1'b1;
end
else begin
freq_end <= 'b0;
end
end
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////// DDS //////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
localparam AXIS_FREQ_WORD_WIDTH = 8*((FREQ_WORD_WIDTH-1)/8+1);
localparam AXIS_DDS_DATA_WIDTH = 8*((DDS_DATA_WIDTH-1)/8+1);
wire [DDS_DATA_WIDTH-1:0] sin_dds, cos_dds;
wire dds_valid;
wire dds_s_axis_config_tvalid;
wire [AXIS_FREQ_WORD_WIDTH-1 : 0] dds_s_axis_config_ttdata;
wire dds_m_axis_data_tvalid ;
wire [2*AXIS_DDS_DATA_WIDTH-1 : 0] dds_m_axis_data_ttdata ;
assign dds_s_axis_config_tvalid = freq_comp_busy;
assign dds_s_axis_config_ttdata = freq_word;
assign dds_valid = dds_m_axis_data_tvalid;
assign {sin_dds,cos_dds} = dds_m_axis_data_ttdata;
dds_32b_8b u_dds_bb_shift
(
.aclk (clk ), // input wire aclk
.s_axis_config_tvalid (dds_s_axis_config_tvalid ), // input wire s_axis_config_tvalid
.s_axis_config_tdata (dds_s_axis_config_ttdata ), // input wire [31 : 0] s_axis_config_tdata
.m_axis_data_tvalid (dds_m_axis_data_tvalid ), // output wire m_axis_data_tvalid
.m_axis_data_tdata (dds_m_axis_data_ttdata ) // output wire [15 : 0] m_axis_data_tdata
);
////////////////////////////////////////////////////////////////////////////////
///////////// Complex Multiplier for Frequency Shift Compensation //////////////
////////////////////////////////////////////////////////////////////////////////
localparam AXIS_CMPY_A_WIDTH = 8*((CMPY_A_WIDTH-1)/8+1);
localparam AXIS_CMPY_B_WIDTH = 8*((CMPY_B_WIDTH-1)/8+1);
localparam AXIS_CMPY_P_WIDTH = 8*((CMPY_P_FULL_WIDTH-1)/8+1);
// input data
wire [DATA_I_WIDTH-1 : 0] din_freq_real;
wire [DATA_I_WIDTH-1 : 0] din_freq_imag;
assign din_freq_real = rx_ch2_i;
assign din_freq_imag = rx_ch2_q;
// cmpy
wire [CMPY_OUTPUT_WIDTH-1 : 0] din_freq_cxr_real;
wire [CMPY_OUTPUT_WIDTH-1 : 0] din_freq_cxr_imag;
wire din_freq_cxr_valid; // declared ahead
wire cmpy_a_valid;
wire [2*AXIS_CMPY_A_WIDTH-1 : 0] cmpy_a ;
wire cmpy_b_valid;
wire [2*AXIS_CMPY_B_WIDTH-1 : 0] cmpy_b ;
wire cmpy_p_valid;
wire [2*AXIS_CMPY_P_WIDTH-1 : 0] cmpy_p ;
assign cmpy_a_valid = freq_comp_busy;
assign cmpy_b_valid = dds_valid;
assign din_freq_cxr_valid = cmpy_p_valid;
// sign bit extension to fit axis 8-bit data format
assign cmpy_a = {{(AXIS_CMPY_A_WIDTH-CMPY_A_WIDTH){din_freq_imag[DATA_I_WIDTH-1]}},din_freq_imag,
{(AXIS_CMPY_A_WIDTH-CMPY_A_WIDTH){din_freq_real[DATA_I_WIDTH-1]}},din_freq_real};
assign cmpy_b = {{(AXIS_CMPY_B_WIDTH-CMPY_B_WIDTH){sin_dds[DDS_DATA_WIDTH-1]}},sin_dds,
{(AXIS_CMPY_B_WIDTH-CMPY_B_WIDTH){cos_dds[DDS_DATA_WIDTH-1]}},cos_dds};
if (CMPY_OUTPUT_WIDTH > CMPY_P_WIDTH) begin
// append zeros
assign din_freq_cxr_real = {cmpy_p[0 +: CMPY_P_WIDTH],{(CMPY_OUTPUT_WIDTH-CMPY_P_WIDTH){1'b0}}};
assign din_freq_cxr_imag = {cmpy_p[AXIS_CMPY_P_WIDTH +: CMPY_P_WIDTH],{(CMPY_OUTPUT_WIDTH-CMPY_P_WIDTH){1'b0}}};
end
else begin
// truncate valid msb
assign din_freq_cxr_real = cmpy_p[CMPY_P_WIDTH-1 -: CMPY_OUTPUT_WIDTH];
assign din_freq_cxr_imag = cmpy_p[AXIS_CMPY_P_WIDTH+CMPY_P_WIDTH-1 -: CMPY_OUTPUT_WIDTH];
end
cmpy_12x8 u_cmpy_12x8_freq
(
.aclk (clk ), // input wire aclk
.s_axis_a_tvalid (cmpy_a_valid ), // input wire s_axis_a_tvalid
.s_axis_a_tdata (cmpy_a ), // input wire [31 : 0] s_axis_a_tdata
.s_axis_b_tvalid (cmpy_b_valid ), // input wire s_axis_b_tvalid
.s_axis_b_tdata (cmpy_b ), // input wire [15 : 0] s_axis_b_tdata
.m_axis_dout_tvalid (cmpy_p_valid ), // output wire m_axis_dout_tvalid
.m_axis_dout_tdata (cmpy_p ) // output wire [47 : 0] m_axis_dout_tdata
);
////////////////////////////////////////////////////////////////////////////////
/////////// Digital Matched Filter for Frequency Shift Compensation ////////////
////////////////////////////////////////////////////////////////////////////////
reg dmf_freq_start = 'b0;
wire dmf_freq_busy;
wire dmf_freq_din_valid;
wire [DATA_I_WIDTH-1 : 0] dmf_freq_din_real;
wire [DATA_I_WIDTH-1 : 0] dmf_freq_din_imag;
wire dmf_freq_peak_valid;
wire [DATA_O_WIDTH-1 : 0] dmf_freq_peak_value_abs;
wire [DATA_O_WIDTH-1 : 0] dmf_freq_peak_value_i;
wire [DATA_O_WIDTH-1 : 0] dmf_freq_peak_value_q;
wire [$clog2(PRBS_POS)-1 : 0] dmf_freq_peak_index;
wire [DATA_O_WIDTH-1 : 0] dmf_freq_moduli_abs;
assign dmf_freq_din_valid = din_freq_cxr_valid;
if (DATA_I_WIDTH > CMPY_OUTPUT_WIDTH) begin
// append zeros
assign dmf_freq_din_real = {din_freq_cxr_real,{(DATA_I_WIDTH-CMPY_OUTPUT_WIDTH){1'b0}}};
assign dmf_freq_din_imag = {din_freq_cxr_imag,{(DATA_I_WIDTH-CMPY_OUTPUT_WIDTH){1'b0}}};
end
else begin
// truncate msb
assign dmf_freq_din_real = din_freq_cxr_real[CMPY_OUTPUT_WIDTH-1 -: DATA_I_WIDTH];
assign dmf_freq_din_imag = din_freq_cxr_imag[CMPY_OUTPUT_WIDTH-1 -: DATA_I_WIDTH];
end
// -----------------------------------------------------------------------------
// dmf start control
// -----------------------------------------------------------------------------
always @(posedge clk) begin
if (rst) begin
dmf_freq_start <= 'b0;
end
else case (state_next)
STATE_FREQ_DMF: dmf_freq_start <= (state_curr == STATE_FREQ_SW) ? ~dmf_freq_start : dmf_freq_start;
default: dmf_freq_start <= dmf_freq_start;
endcase
end
// dmf instantiation
rx_dmf #(
.PRBS_LEN (PRBS_LEN ),
.INTERP_RATE (INTERP_RATE ),
.PROCESS_INTERP (PROCESS_INTERP ),
.DATA_I_WIDTH (DATA_I_WIDTH ),
.DATA_O_WIDTH (DATA_O_WIDTH )
) u_rx_dmf_freq
(
.clk (clk ),
.rst (rst ),
.dmf_start (dmf_freq_start ),
.dmf_busy (dmf_freq_busy ),
.dmf_num (1 ),
.din_valid (dmf_freq_din_valid ),
.din_real (dmf_freq_din_real ),
.din_imag (dmf_freq_din_imag ),
.peak_valid (dmf_freq_peak_valid ),
.last_peak_valid(dmf_freq_last_peak_valid ),
.peak_value_abs (dmf_freq_peak_value_abs ),
.peak_value_i (dmf_freq_peak_value_i ),
.peak_value_q (dmf_freq_peak_value_q ),
.peak_index (dmf_freq_peak_index )
);
assign dmf_freq_moduli_abs = u_rx_dmf_freq.moduli_abs;
// -----------------------------------------------------------------------------
// peak finding at different frequencies
// -----------------------------------------------------------------------------
reg max_freq_peak_valid = 'b0;
reg [DATA_O_WIDTH-1 : 0] max_freq_peak_value_abs = 'b0;
reg [DATA_O_WIDTH-1 : 0] max_freq_peak_value_i = 'b0;
reg [DATA_O_WIDTH-1 : 0] max_freq_peak_value_q = 'b0;
reg [$clog2(PRBS_POS)-1 : 0] max_freq_peak_index = 'b0;
// output result to port
assign freq_target_valid = max_freq_peak_valid;
assign freq_target = max_freq_peak_freq;
always @(posedge clk) begin
if (rst) begin
max_freq_peak_valid <= 'b0;
max_freq_peak_value_abs <= 'b0;
max_freq_peak_value_i <= 'b0;
max_freq_peak_value_q <= 'b0;
max_freq_peak_index <= 'b0;
max_freq_peak_freq <= 'b0;
end
else case (state_next)
STATE_IDLE: begin
max_freq_peak_valid <= 'b0;
max_freq_peak_value_abs <= 'b0;
max_freq_peak_value_i <= 'b0;
max_freq_peak_value_q <= 'b0;
max_freq_peak_index <= 'b0;
max_freq_peak_freq <= 'b0;
end
STATE_FREQ_SW: begin
if ((state_curr == STATE_FREQ_DMF) && (dmf_freq_peak_value_abs > max_freq_peak_value_abs)) begin
// at the end of [STATE_FREQ_DMF] state, check if peak is valid
max_freq_peak_value_abs <= dmf_freq_peak_value_abs;
max_freq_peak_value_i <= dmf_freq_peak_value_i ;
max_freq_peak_value_q <= dmf_freq_peak_value_q ;
max_freq_peak_index <= dmf_freq_peak_index ;
max_freq_peak_freq <= freq_word ;
end
else begin
// hold otherwise
max_freq_peak_value_abs <= max_freq_peak_value_abs;
max_freq_peak_value_i <= max_freq_peak_value_i ;
max_freq_peak_value_q <= max_freq_peak_value_q ;
max_freq_peak_index <= max_freq_peak_index ;
max_freq_peak_freq <= max_freq_peak_freq ;
end
end
STATE_CH_SW: begin
if (state_curr == STATE_FREQ_DMF) begin
// indicate the target frequency word is found
max_freq_peak_valid <= 1'b1;
end
else begin
max_freq_peak_valid <= 'b0;
end
end
default: begin
max_freq_peak_valid <= 'b0;
max_freq_peak_value_abs <= max_freq_peak_value_abs;
max_freq_peak_value_i <= max_freq_peak_value_i ;
max_freq_peak_value_q <= max_freq_peak_value_q ;
max_freq_peak_index <= max_freq_peak_index ;
max_freq_peak_freq <= max_freq_peak_freq ;
end
endcase
end
////////////////////////////////////////////////////////////////////////////////
//////////////////// Complex Multiplier for Signal Channels ////////////////////
////////////////////////////////////////////////////////////////////////////////
// cmpy input
wire [CMPY_OUTPUT_WIDTH-1 : 0] din_ch_real [0 : CHANNEL_NUM-1];
wire [CMPY_OUTPUT_WIDTH-1 : 0] din_ch_imag [0 : CHANNEL_NUM-1];
assign din_ch_real[0] = rx_ch1_i;
assign din_ch_real[1] = rx_ch2_i;
assign din_ch_real[2] = rx_ch3_i;
assign din_ch_real[3] = rx_ch4_i;
assign din_ch_imag[0] = rx_ch1_q;
assign din_ch_imag[1] = rx_ch2_q;
assign din_ch_imag[2] = rx_ch3_q;
assign din_ch_imag[3] = rx_ch4_q;
// cmpy output
wire [CMPY_OUTPUT_WIDTH-1 : 0] din_ch_cxr_real [0 : CHANNEL_NUM-1];
wire [CMPY_OUTPUT_WIDTH-1 : 0] din_ch_cxr_imag [0 : CHANNEL_NUM-1];
wire din_ch_cxr_valid [0 : CHANNEL_NUM-1];
generate
for (m = 0; m < CHANNEL_NUM; m = m + 1) begin: cmpy_ch
wire cmpy_a_valid;
wire [2*AXIS_CMPY_A_WIDTH-1 : 0] cmpy_a ;
wire cmpy_b_valid;
wire [2*AXIS_CMPY_B_WIDTH-1 : 0] cmpy_b ;
wire cmpy_p_valid;
wire [2*AXIS_CMPY_P_WIDTH-1 : 0] cmpy_p ;
assign cmpy_a_valid = freq_comp_busy;
assign cmpy_b_valid = dds_valid;
assign din_ch_cxr_valid[m] = cmpy_p_valid;
// sign bit extension to fit axis 8-bit data format
assign cmpy_a = {{(AXIS_CMPY_A_WIDTH-CMPY_A_WIDTH){din_ch_imag[m][DATA_I_WIDTH-1]}},din_ch_imag[m],
{(AXIS_CMPY_A_WIDTH-CMPY_A_WIDTH){din_ch_real[m][DATA_I_WIDTH-1]}},din_ch_real[m]};
assign cmpy_b = {{(AXIS_CMPY_B_WIDTH-CMPY_B_WIDTH){sin_dds[DDS_DATA_WIDTH-1]}},sin_dds,
{(AXIS_CMPY_B_WIDTH-CMPY_B_WIDTH){cos_dds[DDS_DATA_WIDTH-1]}},cos_dds};
if (CMPY_OUTPUT_WIDTH > CMPY_P_WIDTH) begin
// append zeros
assign din_ch_cxr_real[m] = {cmpy_p[0 +: CMPY_P_WIDTH],{(CMPY_OUTPUT_WIDTH-CMPY_P_WIDTH){1'b0}}};
assign din_ch_cxr_imag[m] = {cmpy_p[AXIS_CMPY_P_WIDTH +: CMPY_P_WIDTH],{(CMPY_OUTPUT_WIDTH-CMPY_P_WIDTH){1'b0}}};
end
else begin
// truncate valid msb
assign din_ch_cxr_real[m] = cmpy_p[CMPY_P_WIDTH-1 -: CMPY_OUTPUT_WIDTH];
assign din_ch_cxr_imag[m] = cmpy_p[AXIS_CMPY_P_WIDTH+CMPY_P_WIDTH-1 -: CMPY_OUTPUT_WIDTH];
end
cmpy_12x8 u_cmpy_12x8_ch
(
.aclk (clk ), // input wire aclk
.s_axis_a_tvalid (cmpy_a_valid ), // input wire s_axis_a_tvalid
.s_axis_a_tdata (cmpy_a ), // input wire [31 : 0] s_axis_a_tdata
.s_axis_b_tvalid (cmpy_b_valid ), // input wire s_axis_b_tvalid
.s_axis_b_tdata (cmpy_b ), // input wire [15 : 0] s_axis_b_tdata
.m_axis_dout_tvalid (cmpy_p_valid ), // output wire m_axis_dout_tvalid
.m_axis_dout_tdata (cmpy_p ) // output wire [47 : 0] m_axis_dout_tdata
);
end
endgenerate
////////////////////////////////////////////////////////////////////////////////
////////////////// Digital Matched Filter for Signal Channels //////////////////
////////////////////////////////////////////////////////////////////////////////
reg dmf_ch_start = 'b0;
wire dmf_ch_busy [0 : CHANNEL_NUM-1];
wire dmf_ch_din_valid [0 : CHANNEL_NUM-1];
wire [DATA_I_WIDTH-1 : 0] dmf_ch_din_real [0 : CHANNEL_NUM-1];
wire [DATA_I_WIDTH-1 : 0] dmf_ch_din_imag [0 : CHANNEL_NUM-1];
wire dmf_ch_peak_valid [0 : CHANNEL_NUM-1];
wire [DATA_O_WIDTH-1 : 0] dmf_ch_peak_value_abs [0 : CHANNEL_NUM-1];
wire [DATA_O_WIDTH-1 : 0] dmf_ch_peak_value_i [0 : CHANNEL_NUM-1];
wire [DATA_O_WIDTH-1 : 0] dmf_ch_peak_value_q [0 : CHANNEL_NUM-1];
wire [$clog2(PRBS_POS)-1 : 0] dmf_ch_peak_index [0 : CHANNEL_NUM-1];
wire [DATA_O_WIDTH-1 : 0] dmf_ch_moduli_abs [0 : CHANNEL_NUM-1];
// -----------------------------------------------------------------------------
// dmf start control
// -----------------------------------------------------------------------------
always @(posedge clk) begin
if (rst) begin
dmf_ch_start <= 'b0;
end
else case (state_next)
STATE_CH_DMF: dmf_ch_start <= (state_curr == STATE_CH_SW) ? ~dmf_ch_start : dmf_ch_start;
default: dmf_ch_start <= dmf_ch_start;
endcase
end
generate
for (m = 0; m < CHANNEL_NUM; m = m + 1) begin: dmf_ch
assign dmf_ch_din_valid[m] = din_ch_cxr_valid[m];
if (DATA_I_WIDTH > CMPY_OUTPUT_WIDTH) begin
// append zeros
assign dmf_ch_din_real[m] = {din_ch_cxr_real[m],{(DATA_I_WIDTH-CMPY_OUTPUT_WIDTH){1'b0}}};
assign dmf_ch_din_imag[m] = {din_ch_cxr_imag[m],{(DATA_I_WIDTH-CMPY_OUTPUT_WIDTH){1'b0}}};
end
else begin
// truncate msb
assign dmf_ch_din_real[m] = din_ch_cxr_real[m][CMPY_OUTPUT_WIDTH-1 -: DATA_I_WIDTH];
assign dmf_ch_din_imag[m] = din_ch_cxr_imag[m][CMPY_OUTPUT_WIDTH-1 -: DATA_I_WIDTH];
end
// dmf instantiation
rx_dmf #(
.PRBS_LEN (PRBS_LEN ),
.INTERP_RATE (INTERP_RATE ),
.PROCESS_INTERP (PROCESS_INTERP ),
.DATA_I_WIDTH (DATA_I_WIDTH ),
.DATA_O_WIDTH (DATA_O_WIDTH )
) u_rx_dmf_ch
(
.clk (clk ),
.rst (rst ),
.dmf_start (dmf_ch_start ),
.dmf_busy (dmf_ch_busy[m] ),
.dmf_num (dmf_num_per_ch ),
.din_valid (dmf_ch_din_valid[m] ),
.din_real (dmf_ch_din_real[m] ),
.din_imag (dmf_ch_din_imag[m] ),
.peak_valid (dmf_ch_peak_valid[m] ),
.last_peak_valid(dmf_ch_last_peak_valid[m] ),
.peak_value_abs (dmf_ch_peak_value_abs[m] ),
.peak_value_i (dmf_ch_peak_value_i[m] ),
.peak_value_q (dmf_ch_peak_value_q[m] ),
.peak_index (dmf_ch_peak_index[m] )
);
assign dmf_ch_moduli_abs[m] = u_rx_dmf_ch.moduli_abs;
end
endgenerate
assign ch_peak_valid = dmf_ch_peak_valid[0];
assign ch1_peak_value_abs = dmf_ch_peak_value_abs[0];
assign ch1_peak_value_i = dmf_ch_peak_value_i[0] ;
assign ch1_peak_value_q = dmf_ch_peak_value_q [0] ;
assign ch1_peak_index = dmf_ch_peak_index[0] ;
assign ch2_peak_value_abs = dmf_ch_peak_value_abs[1];
assign ch2_peak_value_i = dmf_ch_peak_value_i[1] ;
assign ch2_peak_value_q = dmf_ch_peak_value_q [1] ;
assign ch2_peak_index = dmf_ch_peak_index[1] ;
assign ch3_peak_value_abs = dmf_ch_peak_value_abs[2];
assign ch3_peak_value_i = dmf_ch_peak_value_i[2] ;
assign ch3_peak_value_q = dmf_ch_peak_value_q [2] ;
assign ch3_peak_index = dmf_ch_peak_index[2] ;
assign ch4_peak_value_abs = dmf_ch_peak_value_abs[3];
assign ch4_peak_value_i = dmf_ch_peak_value_i[3] ;
assign ch4_peak_value_q = dmf_ch_peak_value_q [3] ;
assign ch4_peak_index = dmf_ch_peak_index[3] ;
endmodule
@@ -0,0 +1,167 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2023/05/06 15:37:29
// Design Name:
// Module Name: rf_auto_switch_freq
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module rf_auto_switch_freq(
input clk ,
input rst ,
// vio control
input start , // rise-edge active, if start, change freq word to the first
input rf_ctrl_mode , // 1 : auto switch, 0 : manual switch
input switch_next_freq , // rise-edge active
input switch_last_freq , // rise-edge active
input [15:0] cnt_valid_to_switch , // clock number from valid to switch
// input
input [15:0] freq_hop_words_vio ,
input hop_words_valid_vio ,
input freq_hop_switch_vio ,
// output
output reg [15:0] freq_hop_words_auto = 11'd0 ,
output reg hop_words_valid_auto = 1'd0 ,
output reg freq_hop_switch_auto = 1'd0
);
//************************* rise-edge detect ***********************************
reg start_d1 = 1'b0;
reg start_d2 = 1'b0;
reg start_pulse = 1'b0;
reg switch_next_freq_d1 = 1'b0;
reg switch_next_freq_d2 = 1'b0;
reg [9:0] switch_next_freq_pulse = 10'd0;
reg switch_last_freq_d1 = 1'b0;
reg switch_last_freq_d2 = 1'b0;
reg [9:0] switch_last_freq_pulse = 10'd0;
always @ (posedge clk)
if(rst) begin
start_d1 <= 1'b0;
start_d2 <= 1'b0;
start_pulse <= 1'b0;
switch_next_freq_d1 <= 1'b0;
switch_next_freq_d2 <= 1'b0;
switch_next_freq_pulse <= 10'd0;
switch_last_freq_d1 <= 1'b0;
switch_last_freq_d2 <= 1'b0;
switch_last_freq_pulse <= 10'd0;
end else begin
start_d1 <= start;
start_d2 <= start_d1;
start_pulse <= start_d1 & ~start_d2;
switch_next_freq_d1 <= switch_next_freq;
switch_next_freq_d2 <= switch_next_freq_d1;
switch_next_freq_pulse[0] <= switch_next_freq_d1 & ~switch_next_freq_d2;
switch_next_freq_pulse[9:1] <= switch_next_freq_pulse[8:0];
switch_last_freq_d1 <= switch_last_freq;
switch_last_freq_d2 <= switch_last_freq_d1;
switch_last_freq_pulse[0] <= switch_last_freq_d1 & ~switch_last_freq_d2;
switch_last_freq_pulse[9:1] <= switch_last_freq_pulse[8:0];
end
//******************** local freq word control *********************************
reg [15:0] local_freq_word = 16'd0;
reg local_freq_word_valid = 1'b0;
reg local_freq_word_switch = 1'b0;
reg [7:0] freq_word_cnt = 8'd0; // range 0 -> 80
wire [15:0] rom_freq_word_dout;
// 2 clock latency
rom_freq_word rom_freq_word_inst(
.clka (clk ),
.addra (freq_word_cnt[6:0] ),
.douta (rom_freq_word_dout )
);
always @ (posedge clk)
if(rst | start_pulse)
freq_word_cnt <= 8'd0;
else if(freq_word_cnt == 8'd80 && switch_next_freq_pulse[0])
freq_word_cnt <= 8'd0;
else if(freq_word_cnt == 8'd0 && switch_last_freq_pulse[0])
freq_word_cnt <= 8'd80;
else if(switch_next_freq_pulse[0])
freq_word_cnt <= freq_word_cnt + 1'b1;
else if(switch_last_freq_pulse[0])
freq_word_cnt <= freq_word_cnt - 1'b1;
else
freq_word_cnt <= freq_word_cnt;
always @ (posedge clk)
if(rst | start_pulse)
local_freq_word_valid <= 1'b0;
else if(switch_next_freq_pulse[4] | switch_last_freq_pulse[4])
local_freq_word_valid <= 1'b1;
else
local_freq_word_valid <= 1'b0;
reg [15:0] freq_word_valid_cnt = 16'd0;
always @ (posedge clk)
if(rst | start_pulse)
freq_word_valid_cnt <= 16'd0;
else if(freq_word_valid_cnt == cnt_valid_to_switch)
freq_word_valid_cnt <= 16'd0;
else if(local_freq_word_valid)
freq_word_valid_cnt <= freq_word_valid_cnt + 1'b1;
else if(freq_word_valid_cnt != 16'd0)
freq_word_valid_cnt <= freq_word_valid_cnt + 1'b1;
else
freq_word_valid_cnt <= freq_word_valid_cnt;
always @ (posedge clk)
if(rst | start_pulse)
local_freq_word_switch <= 1'b0;
else if(freq_word_valid_cnt == cnt_valid_to_switch)
local_freq_word_switch <= ~local_freq_word_switch;
else
local_freq_word_switch <= local_freq_word_switch;
always @ (posedge clk)
if(rst | start_pulse)
local_freq_word <= 16'd0;
else
local_freq_word <= rom_freq_word_dout;
//******************** output freq switch signal *******************************
// freq_hop_words_auto
always @ (posedge clk)
if(rst | start_pulse)
freq_hop_words_auto <= 11'd0;
else if(rf_ctrl_mode)
freq_hop_words_auto <= local_freq_word;
else
freq_hop_words_auto <= freq_hop_words_vio;
// hop_words_valid_auto
always @ (posedge clk)
if(rst | start_pulse)
hop_words_valid_auto <= 1'b0;
else if(rf_ctrl_mode)
hop_words_valid_auto <= local_freq_word_valid;
else
hop_words_valid_auto <= hop_words_valid_vio;
// freq_hop_switch_auto
always @ (posedge clk)
if(rst | start_pulse)
freq_hop_switch_auto <= 1'b0;
else if(rf_ctrl_mode)
freq_hop_switch_auto <= local_freq_word_switch;
else
freq_hop_switch_auto <= freq_hop_switch_vio;
endmodule
@@ -0,0 +1,471 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
// _ _ ____
// | | ___ ___| |__ / ___| __ _ ___
// _ | |/ _ \/ __| '_ \ | | _ / _` |/ _ \
// | |_| | (_) \__ \ | | | | |_| | (_| | (_) |
// \___/ \___/|___/_| |_| \____|\__,_|\___/
//
// Create Date: 04/25/2023 05:53:44 PM
// Design Name:
// Module Name: rx_dmf
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module rx_dmf
#(
// length of pseudorandom bit sequence, need to be a power of 2
parameter PRBS_LEN = 128,
// interpolation of input signal, need to be a power of 2
parameter INTERP_RATE = 8,
// signal processing interpolation, need to be a power of 2
parameter PROCESS_INTERP = 2,
// possible position of pn code
parameter PRBS_POS = PRBS_LEN*PROCESS_INTERP,
parameter MAX_DMF_NUM = 64,
parameter DATA_I_WIDTH = 12,
parameter DATA_O_WIDTH = 18
)
(
input clk ,
input rst ,
input dmf_start ,
output dmf_busy ,
input din_valid ,
input [DATA_I_WIDTH-1 : 0] din_real ,
input [DATA_I_WIDTH-1 : 0] din_imag ,
input [$clog2(MAX_DMF_NUM+1)-1 : 0] dmf_num ,
output peak_valid ,
output last_peak_valid ,
output [DATA_O_WIDTH-1 : 0] peak_value_abs ,
output [DATA_O_WIDTH-1 : 0] peak_value_i ,
output [DATA_O_WIDTH-1 : 0] peak_value_q ,
output [$clog2(PRBS_POS)-1 : 0] peak_index
);
localparam CMPLX_DIM = 2;
localparam APPROX_ABS_WIDTH = 29;
localparam ABS_WIDTH = 18;
localparam DMF_I_WIDTH = 12;
localparam DMF_O_WIDTH = DMF_I_WIDTH+$clog2(PRBS_POS);
localparam AXIS_DMF_I_WIDTH = 8*((DMF_I_WIDTH-1)/8+1);
localparam AXIS_DMF_O_WIDTH = 8*((DMF_O_WIDTH-1)/8+1);
genvar m;
integer i;
////////////////////////////////////////////////////////////////////////////////
///////////////////////////// Center State Control /////////////////////////////
////////////////////////////////////////////////////////////////////////////////
reg dmf_busy_buf = 'b0;
reg dmf_start_d1 = 'b0;
reg dmf_start_d2 = 'b0;
reg [$clog2(MAX_DMF_NUM)-1 : 0] cnt_dmf_num = 'b0;
reg moduli_max_valid = 'b0;
assign dmf_busy = dmf_busy_buf;
always @(posedge clk) begin
dmf_start_d1 <= dmf_start;
dmf_start_d2 <= dmf_start_d1;
end
always @(posedge clk) begin
if (rst) begin
cnt_dmf_num <= 'b0;
end
else if (dmf_busy) begin
cnt_dmf_num <= (moduli_max_valid) ? cnt_dmf_num + 1'b1 : cnt_dmf_num;
end
else begin
cnt_dmf_num <= 'b0;
end
end
always @(posedge clk) begin
if (rst) begin
dmf_busy_buf <= 'b0;
end
else if (cnt_dmf_num == dmf_num+1) begin
// clear when output is valid
dmf_busy_buf <= 'b0;
end
else if (din_valid && (dmf_start_d2 != dmf_start_d1) && (dmf_num != 'b0)) begin
// set when either edge is detected
dmf_busy_buf <= 1'b1;
end
else begin
// otherwise keep
dmf_busy_buf <= dmf_busy_buf;
end
end
////////////////////////////////////////////////////////////////////////////////
////////////////////////////// Decimation Counter //////////////////////////////
////////////////////////////////////////////////////////////////////////////////
reg [$clog2(INTERP_RATE/PROCESS_INTERP)-1 : 0] cnt_deci = 'b0;
reg din_deci_valid = 'b0;
always @(posedge clk) begin
if (rst) begin
cnt_deci <= 'b0;
end
else if (dmf_busy && din_valid) begin
cnt_deci <= cnt_deci + 1'b1;
end
else begin
cnt_deci <= 'b0;
end
end
always @(posedge clk) begin
if (rst) begin
din_deci_valid <= 'b0;
end
else begin
din_deci_valid <= (cnt_deci == INTERP_RATE/PROCESS_INTERP-1) ? 1'b1 : 'b0;
end
end
////////////////////////////////////////////////////////////////////////////////
//////////////////////////// Digital Matched Filter ////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// input & output signals
wire [AXIS_DMF_I_WIDTH-1 : 0] dmf_axis_i_real;
wire [AXIS_DMF_I_WIDTH-1 : 0] dmf_axis_i_imag;
wire signed [AXIS_DMF_O_WIDTH-1 : 0] dmf_axis_o_real;
wire signed [AXIS_DMF_O_WIDTH-1 : 0] dmf_axis_o_imag;
wire signed [DMF_O_WIDTH-1 : 0] dmf_o_real;
wire signed [DMF_O_WIDTH-1 : 0] dmf_o_imag;
wire dmf_o_valid;
// dmf input data formatting
if (AXIS_DMF_I_WIDTH > DATA_I_WIDTH) begin
// sign extension to fit 8-bit axis data format
assign dmf_axis_i_real = {{(AXIS_DMF_I_WIDTH-DATA_I_WIDTH){din_real[DATA_I_WIDTH-1]}},din_real};
assign dmf_axis_i_imag = {{(AXIS_DMF_I_WIDTH-DATA_I_WIDTH){din_imag[DATA_I_WIDTH-1]}},din_imag};
end
else begin
// truncate msb
assign dmf_axis_i_real = din_real[DATA_I_WIDTH-1 -: AXIS_DMF_I_WIDTH];
assign dmf_axis_i_imag = din_imag[DATA_I_WIDTH-1 -: AXIS_DMF_I_WIDTH];
end
// dmf output data formatting, truncate valid bits
assign dmf_o_real = dmf_axis_o_real[DMF_O_WIDTH-1 -: DMF_O_WIDTH];
assign dmf_o_imag = dmf_axis_o_imag[DMF_O_WIDTH-1 -: DMF_O_WIDTH];
// fir port definition
wire s_axis_data_tvalid_real;
wire s_axis_data_tready_real;
wire [AXIS_DMF_I_WIDTH-1 : 0] s_axis_data_ttdata_real;
wire m_axis_data_tvalid_real;
wire [AXIS_DMF_O_WIDTH-1 : 0] m_axis_data_ttdata_real;
wire s_axis_data_tvalid_imag;
wire s_axis_data_tready_imag;
wire [AXIS_DMF_I_WIDTH-1 : 0] s_axis_data_ttdata_imag;
wire m_axis_data_tvalid_imag;
wire [AXIS_DMF_O_WIDTH-1 : 0] m_axis_data_ttdata_imag;
// fir port connection
assign s_axis_data_tvalid_real = din_deci_valid;
assign s_axis_data_ttdata_real = dmf_axis_i_real;
assign dmf_axis_o_real = m_axis_data_ttdata_real;
assign s_axis_data_tvalid_imag = din_deci_valid;
assign s_axis_data_ttdata_imag = dmf_axis_i_imag;
assign dmf_axis_o_imag = m_axis_data_ttdata_imag;
assign dmf_o_valid = m_axis_data_tvalid_real;
// fir ip core instantiation
fir_prbs7_invert_rep2 u_dmf_real
(
.aclk (clk ), // input wire aclk
.aresetn (dmf_busy ), // input aresetn
.s_axis_data_tvalid (s_axis_data_tvalid_real), // input wire s_axis_data_tvalid
.s_axis_data_tready (s_axis_data_tready_real), // output wire s_axis_data_tready
.s_axis_data_tdata (s_axis_data_ttdata_real), // input wire [15 : 0] s_axis_data_tdata
.m_axis_data_tvalid (m_axis_data_tvalid_real), // output wire m_axis_data_tvalid
.m_axis_data_tdata (m_axis_data_ttdata_real) // output wire [23 : 0] m_axis_data_tdata
);
fir_prbs7_invert_rep2 u_dmf_imag
(
.aclk (clk ), // input wire aclk
.aresetn (dmf_busy ), // input aresetn
.s_axis_data_tvalid (s_axis_data_tvalid_imag), // input wire s_axis_data_tvalid
.s_axis_data_tready (s_axis_data_tready_imag), // output wire s_axis_data_tready
.s_axis_data_tdata (s_axis_data_ttdata_imag), // input wire [15 : 0] s_axis_data_tdata
.m_axis_data_tvalid (m_axis_data_tvalid_imag), // output wire m_axis_data_tvalid
.m_axis_data_tdata (m_axis_data_ttdata_imag) // output wire [23 : 0] m_axis_data_tdata
);
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// Chip Counter /////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
localparam PEAK_ABS_DELAY = 6; // 5 for multiplier, 1 for adder
reg [$clog2(PRBS_POS)-1 : 0] cnt_chip = 'b0;
reg [$clog2(PRBS_POS)-1 : 0] cnt_chip_delay [0 : PEAK_ABS_DELAY-1];
always @(posedge clk) begin
if (rst) begin
cnt_chip <= 'b0;
end
else if (dmf_busy) begin
cnt_chip <= (dmf_o_valid) ? cnt_chip + 1'b1 : cnt_chip;
end
else begin
cnt_chip <= 'b0;
end
end
always @(posedge clk) begin
for (i = 1; i < PEAK_ABS_DELAY; i = i + 1) begin
cnt_chip_delay[i] <= cnt_chip_delay[i-1];
end
cnt_chip_delay[0] <= cnt_chip;
end
////////////////////////////////////////////////////////////////////////////////
////////////////////////// Accumulation & Peak Search //////////////////////////
////////////////////////////////////////////////////////////////////////////////
// moduli
wire moduli_valid;
reg moduli_valid_delay [0 : PEAK_ABS_DELAY-1];
wire [ABS_WIDTH-1 : 0] moduli_real;
wire [ABS_WIDTH-1 : 0] moduli_imag;
reg [ABS_WIDTH-1 : 0] moduli_real_delay [0 : PEAK_ABS_DELAY-1];
reg [ABS_WIDTH-1 : 0] moduli_imag_delay [0 : PEAK_ABS_DELAY-1];
assign moduli_valid = dmf_o_valid;
if (ABS_WIDTH > DMF_O_WIDTH) begin
// append zeros
assign moduli_real = {dmf_o_real,{(ABS_WIDTH-DMF_O_WIDTH){1'b0}}};
assign moduli_imag = {dmf_o_imag,{(ABS_WIDTH-DMF_O_WIDTH){1'b0}}};
end
else begin
// truncate msb
assign moduli_real = dmf_o_real[DMF_O_WIDTH-1 -: ABS_WIDTH];
assign moduli_imag = dmf_o_imag[DMF_O_WIDTH-1 -: ABS_WIDTH];
end
always @(posedge clk) begin
for (i = 1; i < PEAK_ABS_DELAY; i = i + 1) begin
moduli_valid_delay[i] <= moduli_valid_delay[i-1];
moduli_real_delay[i] <= moduli_real_delay[i-1];
moduli_imag_delay[i] <= moduli_imag_delay[i-1];
end
moduli_valid_delay[0] <= moduli_valid;
moduli_real_delay[0] <= moduli_real;
moduli_imag_delay[0] <= moduli_imag;
end
wire [2*ABS_WIDTH-1 : 0] moduli_real_square;
wire [2*ABS_WIDTH-1 : 0] moduli_imag_square;
reg [ABS_WIDTH-1 : 0] moduli_abs_square = 'b0;
wire [DATA_O_WIDTH-1 : 0] moduli_abs;
wire moduli_abs_valid;
assign moduli_abs_valid = moduli_valid_delay[PEAK_ABS_DELAY-1];
if (DATA_O_WIDTH > ABS_WIDTH) begin
// append zeros
assign moduli_abs = {moduli_abs_square,{(DATA_O_WIDTH-ABS_WIDTH){1'b0}}};
end
else begin
// truncate msb
assign moduli_abs = moduli_abs_square[ABS_WIDTH-1 -: DATA_O_WIDTH];
end
always @(posedge clk) begin
if (rst) begin
moduli_abs_square <= 'b0;
end
else begin
moduli_abs_square <= moduli_real_square[(2*ABS_WIDTH-1) -: (ABS_WIDTH-1)] + moduli_imag_square[(2*ABS_WIDTH-1) -: (ABS_WIDTH-1)];
end
end
mult_18x18 u_mult_real
(
.CLK(clk ), // input wire CLK
.A (moduli_real ), // input wire [17 : 0] A
.B (moduli_real ), // input wire [17 : 0] B
.P (moduli_real_square ) // output wire [17 : 0] P
);
mult_18x18 u_mult_imag
(
.CLK(clk ), // input wire CLK
.A (moduli_imag ), // input wire [17 : 0] A
.B (moduli_imag ), // input wire [17 : 0] B
.P (moduli_imag_square ) // output wire [17 : 0] P
);
// wire accum_current_valid;
// assign accum_current_valid = dmf_o_valid;
// wire [APPROX_ABS_WIDTH-2 : 0] accum_moduli_real;
// wire [APPROX_ABS_WIDTH-2 : 0] accum_moduli_imag;
// wire [APPROX_ABS_WIDTH-1 : 0] accum_moduli_abs ;
// wire accum_current_abs_valid;
// wire [DATA_O_WIDTH-1 : 0] accum_current_abs;
// if (APPROX_ABS_WIDTH-1 > DMF_O_WIDTH) begin
// // append zeros
// assign accum_moduli_real = {dmf_o_real,{(APPROX_ABS_WIDTH-1-DMF_O_WIDTH){1'b0}}};
// assign accum_moduli_imag = {dmf_o_imag,{(APPROX_ABS_WIDTH-1-DMF_O_WIDTH){1'b0}}};
// end
// else begin
// // truncate msb
// assign accum_moduli_real = dmf_o_real[DMF_O_WIDTH-1 -: (APPROX_ABS_WIDTH-1)];
// assign accum_moduli_imag = dmf_o_imag[DMF_O_WIDTH-1 -: (APPROX_ABS_WIDTH-1)];
// end
// if (DATA_O_WIDTH > APPROX_ABS_WIDTH) begin
// // append zeros
// assign accum_current_abs = {accum_moduli_abs,{(DATA_O_WIDTH-APPROX_ABS_WIDTH){1'b0}}};
// end
// else begin
// // truncate msb
// assign accum_current_abs = accum_moduli_abs[APPROX_ABS_WIDTH-1 -: DATA_O_WIDTH];
// end
// ApproxAbs u_accum_abs
// (
// .clk (clk ),
// .Nd (accum_current_valid ),
// .Dini (accum_moduli_real ),
// .Dinq (accum_moduli_imag ),
// .Abs_Rdy (accum_current_abs_valid),
// .Abs_Dout (accum_moduli_abs )
// );
// peak record
reg [DATA_O_WIDTH-1 : 0] moduli_max_abs = 'b0;
reg [DATA_O_WIDTH-1 : 0] moduli_max_real = 'b0;
reg [DATA_O_WIDTH-1 : 0] moduli_max_imag = 'b0;
reg [$clog2(PRBS_POS)-1 : 0] moduli_max_index = 'b0;
always @(posedge clk) begin
if (rst) begin
moduli_max_valid <= 'b0;
moduli_max_abs <= 'b0;
moduli_max_real <= 'b0;
moduli_max_imag <= 'b0;
moduli_max_index <= 'b0;
end
else if (dmf_busy) begin
if (moduli_abs_valid) begin
if ((cnt_chip_delay[PEAK_ABS_DELAY-1] == 0) || (moduli_abs > moduli_max_abs)) begin
// reset when chip counter reaches zero or record peak
moduli_max_abs <= moduli_abs ;
moduli_max_real <= moduli_real_delay[PEAK_ABS_DELAY-1];
moduli_max_imag <= moduli_imag_delay[PEAK_ABS_DELAY-1];
moduli_max_index <= cnt_chip_delay[PEAK_ABS_DELAY-1] ;
end
else begin
moduli_max_abs <= moduli_max_abs;
moduli_max_real <= moduli_max_real;
moduli_max_imag <= moduli_max_imag;
moduli_max_index <= moduli_max_index;
end
if (cnt_chip_delay[PEAK_ABS_DELAY-1] == PRBS_POS-1) begin
// peak record valid when chip counter reaches maximum value
moduli_max_valid <= 1'b1;
end
else begin
moduli_max_valid <= 'b0;
end
end
else begin
moduli_max_valid <= 'b0;
moduli_max_abs <= moduli_max_abs;
moduli_max_real <= moduli_max_real;
moduli_max_imag <= moduli_max_imag;
moduli_max_index <= moduli_max_index;
end
end
else begin
moduli_max_valid <= 'b0;
moduli_max_abs <= 'b0;
moduli_max_real <= 'b0;
moduli_max_imag <= 'b0;
moduli_max_index <= 'b0;
end
end
// register output
reg peak_valid_buf = 1'b0;
reg last_peak_valid_buf = 1'b0;
reg [DATA_O_WIDTH-1 : 0] peak_value_abs_buf = 'b0;
reg [DATA_O_WIDTH-1 : 0] peak_value_i_buf = 'b0;
reg [DATA_O_WIDTH-1 : 0] peak_value_q_buf = 'b0;
reg [$clog2(PRBS_POS)-1 : 0] peak_index_buf = 'b0;
assign peak_valid = peak_valid_buf ;
assign last_peak_valid = last_peak_valid_buf;
assign peak_value_abs = peak_value_abs_buf ;
assign peak_value_i = peak_value_i_buf ;
assign peak_value_q = peak_value_q_buf ;
assign peak_index = peak_index_buf ;
always @(posedge clk) begin
if (rst) begin
peak_valid_buf <= 'b0;
last_peak_valid_buf <= 'b0;
peak_value_abs_buf <= 'b0;
peak_value_i_buf <= 'b0;
peak_value_q_buf <= 'b0;
peak_index_buf <= 'b0;
end
else if (moduli_max_valid && (cnt_dmf_num != 'b0)) begin
peak_valid_buf <= 1'b1;
peak_value_abs_buf <= moduli_max_abs ;
peak_value_i_buf <= moduli_max_real ;
peak_value_q_buf <= moduli_max_imag ;
peak_index_buf <= moduli_max_index;
last_peak_valid_buf<= (cnt_dmf_num == dmf_num) ? 1'b1 : 'b0;
end
else begin
peak_valid_buf <= 1'b0;
last_peak_valid_buf <= 1'b0;
peak_value_abs_buf <= peak_value_abs_buf;
peak_value_i_buf <= peak_value_i_buf ;
peak_value_q_buf <= peak_value_q_buf ;
peak_index_buf <= peak_index_buf ;
end
end
endmodule
@@ -0,0 +1,443 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
// _ _ ____
// | | ___ ___| |__ / ___| __ _ ___
// _ | |/ _ \/ __| '_ \ | | _ / _` |/ _ \
// | |_| | (_) \__ \ | | | | |_| | (_| | (_) |
// \___/ \___/|___/_| |_| \____|\__,_|\___/
//
// Create Date: 2022/09/14 16:45:10
// Last Modified Data: 2023/02/12 17:10
// Design Name:
// Module Name: ad9361_phase_cal_coarse
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// 2022/09/14 16:45:10 - File Created
// 2023/02/12 17:10 - 修改:校准未完成时,将输入信号寄存输出。
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module ad9361_phase_cal_coarse
#(
parameter COUNTER_MOD = 48,
parameter PEAK_POS = 12,
parameter ADC_DATA_WIDTH = 12
)
(
// clock & reset
input clk ,
input rst ,
// control interface
input ad9361_1_cal_start ,
output ad9361_1_cal_done ,
input ad9361_2_cal_start ,
output ad9361_2_cal_done ,
output ad9361_cal_result ,
output ad9361_cal_valid ,
input ad9361_recal ,
// input data interface
input [ADC_DATA_WIDTH-1:0] rx_ch1_i ,
input [ADC_DATA_WIDTH-1:0] rx_ch1_q ,
input [ADC_DATA_WIDTH-1:0] rx_ch2_i ,
input [ADC_DATA_WIDTH-1:0] rx_ch2_q ,
input [ADC_DATA_WIDTH-1:0] rx_ch3_i ,
input [ADC_DATA_WIDTH-1:0] rx_ch3_q ,
input [ADC_DATA_WIDTH-1:0] rx_ch4_i ,
input [ADC_DATA_WIDTH-1:0] rx_ch4_q ,
// output data interface
output [ADC_DATA_WIDTH-1:0] rx_cal_ch1_i,
output [ADC_DATA_WIDTH-1:0] rx_cal_ch1_q,
output [ADC_DATA_WIDTH-1:0] rx_cal_ch2_i,
output [ADC_DATA_WIDTH-1:0] rx_cal_ch2_q,
output [ADC_DATA_WIDTH-1:0] rx_cal_ch3_i,
output [ADC_DATA_WIDTH-1:0] rx_cal_ch3_q,
output [ADC_DATA_WIDTH-1:0] rx_cal_ch4_i,
output [ADC_DATA_WIDTH-1:0] rx_cal_ch4_q
);
localparam STATE_IDLE = 2'd0;
localparam STATE_CAL_1 = 2'd1;
localparam STATE_CAL_2 = 2'd2;
localparam STATE_DONE = 2'd3;
// buffer input control signals
reg ad9361_1_cal_start_d1 = 'b0;
reg ad9361_1_cal_start_d2 = 'b0;
reg ad9361_2_cal_start_d1 = 'b0;
reg ad9361_2_cal_start_d2 = 'b0;
reg ad9361_recal_d1 = 'b0;
reg ad9361_recal_d2 = 'b0;
always @(posedge clk) begin
ad9361_1_cal_start_d1 <= ad9361_1_cal_start;
ad9361_1_cal_start_d2 <= ad9361_1_cal_start_d1;
ad9361_2_cal_start_d1 <= ad9361_2_cal_start;
ad9361_2_cal_start_d2 <= ad9361_2_cal_start_d1;
ad9361_recal_d1 <= ad9361_recal;
ad9361_recal_d2 <= ad9361_recal_d1;
end
// center state machine
reg [ 1:0] curr_state = STATE_IDLE;
always @(posedge clk) begin
if (rst) begin
curr_state <= STATE_IDLE;
end
else begin
case (curr_state)
STATE_IDLE: begin
// move to next state when [ad9361_1_cal_start] asserts
curr_state <= ad9361_1_cal_start_d2 ? STATE_CAL_1 : STATE_IDLE;
end
STATE_CAL_1: begin
// move to next state when 1st cal finishes [ad9361_2_cal_start] asserts
curr_state <= (ad9361_1_cal_done && ad9361_2_cal_start_d2) ? STATE_CAL_2 : STATE_CAL_1;
end
STATE_CAL_2: begin
// move to next state when 2nd cal finishes
curr_state <= ad9361_2_cal_done ? STATE_DONE : STATE_CAL_2;
end
STATE_DONE: begin
// move to ILDA state when it needs to recal
curr_state <= (ad9361_recal_d2) ? STATE_IDLE : STATE_DONE;
end
default: begin
curr_state <= STATE_IDLE;
end
endcase
end
end
//
reg rx_ch2_i_msb_d1 = 'b0;
reg cnt_start = 'b0;
reg cnt_start_flag = 'b0;
reg [$clog2(COUNTER_MOD)-1:0] cnt = 'b0;
reg [ADC_DATA_WIDTH-1:0] rx_ch2_i_rec = 'b0;
reg rx_ch2_i_rec_flag = 'b0;
assign ad9361_1_cal_done = rx_ch2_i_rec_flag;
always @(posedge clk) begin
if (rst) begin
rx_ch2_i_msb_d1 <= 'b0;
end
else if (curr_state == STATE_IDLE) begin
// reset at IDLE state
rx_ch2_i_msb_d1 <= 'b0;
end
else if (curr_state == STATE_CAL_1) begin
rx_ch2_i_msb_d1 <= rx_ch2_i[ADC_DATA_WIDTH-1];
end
else begin
rx_ch2_i_msb_d1 <= rx_ch2_i_msb_d1;
end
end
always @(posedge clk) begin
if (rst) begin
cnt_start <= 'b0;
end
else if (curr_state == STATE_IDLE) begin
// reset at IDLE state
cnt_start <= 'b0;
end
else if (curr_state == STATE_CAL_1 && ~cnt_start) begin
// assert when the 1st falling edge of msb of rx_ch2_i is detected
cnt_start <= (rx_ch2_i_msb_d1 & ~rx_ch2_i[ADC_DATA_WIDTH-1]) ? 1'b1 : 1'b0;
end
else begin
cnt_start <= cnt_start;
end
end
always @(posedge clk) begin
if (rst) begin
cnt <= 'b0;
end
else if (curr_state == STATE_IDLE) begin
// reset at IDLE state
cnt <= 'b0;
end
else if (cnt_start) begin
cnt <= (cnt == COUNTER_MOD - 1) ? 'b0 : cnt + 1'b1;
end
else begin
cnt <= cnt;
end
end
always @(posedge clk) begin
if (rst) begin
rx_ch2_i_rec <= 'b0;
rx_ch2_i_rec_flag <= 'b0;
end
else if (curr_state == STATE_IDLE) begin
// reset at IDLE state
rx_ch2_i_rec <= 'b0;
rx_ch2_i_rec_flag <= 'b0;
end
else if (curr_state == STATE_CAL_1 && cnt == PEAK_POS && ~rx_ch2_i_rec_flag) begin
rx_ch2_i_rec <= rx_ch2_i;
rx_ch2_i_rec_flag <= 1'b1;
end
else begin
rx_ch2_i_rec <= rx_ch2_i_rec;
rx_ch2_i_rec_flag <= rx_ch2_i_rec_flag;
end
end
//
reg [ADC_DATA_WIDTH-1:0] rx_ch4_i_rec = 'b0;
reg rx_ch4_i_rec_flag = 'b0;
assign ad9361_2_cal_done = rx_ch4_i_rec_flag;
always @(posedge clk) begin
if (rst) begin
rx_ch4_i_rec <= 'b0;
rx_ch4_i_rec_flag <= 'b0;
end
else if (curr_state == STATE_IDLE) begin
// reset at IDLE state
rx_ch4_i_rec <= 'b0;
rx_ch4_i_rec_flag <= 'b0;
end
else if (curr_state == STATE_CAL_2 && cnt == COUNTER_MOD/4 && ~rx_ch4_i_rec_flag) begin
rx_ch4_i_rec <= rx_ch4_i;
rx_ch4_i_rec_flag <= 1'b1;
end
else begin
rx_ch4_i_rec <= rx_ch4_i_rec;
rx_ch4_i_rec_flag <= rx_ch4_i_rec_flag;
end
end
reg ad9361_cal_valid_buf = 'b0;
reg ad9361_cal_result_buf = 'b0;
reg [ADC_DATA_WIDTH-1:0] rx_cal_ch1_i_buf = 'b0;
reg [ADC_DATA_WIDTH-1:0] rx_cal_ch2_i_buf = 'b0;
reg [ADC_DATA_WIDTH-1:0] rx_cal_ch3_i_buf = 'b0;
reg [ADC_DATA_WIDTH-1:0] rx_cal_ch4_i_buf = 'b0;
reg [ADC_DATA_WIDTH-1:0] rx_cal_ch1_q_buf = 'b0;
reg [ADC_DATA_WIDTH-1:0] rx_cal_ch2_q_buf = 'b0;
reg [ADC_DATA_WIDTH-1:0] rx_cal_ch3_q_buf = 'b0;
reg [ADC_DATA_WIDTH-1:0] rx_cal_ch4_q_buf = 'b0;
assign ad9361_cal_valid = ad9361_cal_valid_buf;
assign ad9361_cal_result = ad9361_cal_result_buf;
assign rx_cal_ch1_i = rx_cal_ch1_i_buf;
assign rx_cal_ch2_i = rx_cal_ch2_i_buf;
assign rx_cal_ch3_i = rx_cal_ch3_i_buf;
assign rx_cal_ch4_i = rx_cal_ch4_i_buf;
assign rx_cal_ch1_q = rx_cal_ch1_q_buf;
assign rx_cal_ch2_q = rx_cal_ch2_q_buf;
assign rx_cal_ch3_q = rx_cal_ch3_q_buf;
assign rx_cal_ch4_q = rx_cal_ch4_q_buf;
always @(posedge clk) begin
if (rst) begin
ad9361_cal_valid_buf <= 'b0;
ad9361_cal_result_buf <= 'b0;
rx_cal_ch1_i_buf <= 'b0;
rx_cal_ch2_i_buf <= 'b0;
rx_cal_ch3_i_buf <= 'b0;
rx_cal_ch4_i_buf <= 'b0;
rx_cal_ch1_q_buf <= 'b0;
rx_cal_ch2_q_buf <= 'b0;
rx_cal_ch3_q_buf <= 'b0;
rx_cal_ch4_q_buf <= 'b0;
end
else if (curr_state == STATE_DONE) begin
ad9361_cal_valid_buf <= 1'b1;
if (rx_ch2_i_rec[ADC_DATA_WIDTH-1] == rx_ch4_i_rec[ADC_DATA_WIDTH-1]) begin
ad9361_cal_result_buf <= 'b0;
rx_cal_ch1_i_buf <= rx_ch1_i;
rx_cal_ch2_i_buf <= -rx_ch2_i;
rx_cal_ch3_i_buf <= rx_ch3_i;
rx_cal_ch4_i_buf <= -rx_ch4_i;
rx_cal_ch1_q_buf <= rx_ch1_q;
rx_cal_ch2_q_buf <= -rx_ch2_q;
rx_cal_ch3_q_buf <= rx_ch3_q;
rx_cal_ch4_q_buf <= -rx_ch4_q;
end
else begin
ad9361_cal_result_buf <= 'b1;
rx_cal_ch1_i_buf <= rx_ch1_i;
rx_cal_ch2_i_buf <= -rx_ch2_i;
rx_cal_ch3_i_buf <= -rx_ch3_i;
rx_cal_ch4_i_buf <= rx_ch4_i;
rx_cal_ch1_q_buf <= rx_ch1_q;
rx_cal_ch2_q_buf <= -rx_ch2_q;
rx_cal_ch3_q_buf <= -rx_ch3_q;
rx_cal_ch4_q_buf <= rx_ch4_q;
end
end
else begin
ad9361_cal_valid_buf <= 1'b0;
ad9361_cal_result_buf <= ad9361_cal_result_buf;
rx_cal_ch1_i_buf <= rx_ch1_i;
rx_cal_ch2_i_buf <= rx_ch2_i;
rx_cal_ch3_i_buf <= rx_ch3_i;
rx_cal_ch4_i_buf <= rx_ch4_i;
rx_cal_ch1_q_buf <= rx_ch1_q;
rx_cal_ch2_q_buf <= rx_ch2_q;
rx_cal_ch3_q_buf <= rx_ch3_q;
rx_cal_ch4_q_buf <= rx_ch4_q;
end
end
endmodule
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
// _ _ ____
// | | ___ ___| |__ / ___| __ _ ___
// _ | |/ _ \/ __| '_ \ | | _ / _` |/ _ \
// | |_| | (_) \__ \ | | | | |_| | (_| | (_) |
// \___/ \___/|___/_| |_| \____|\__,_|\___/
//
// Create Date: 2022/09/15 11:12:45
// Last Modified Data: 2022/11/02
// Design Name:
// Module Name: tb_ad9361_cal_coarse
// Project Name:
// Target Devices:
// Tool Versions:
// Description: testbench for [ad9361_phase_cal_coarse]
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
// module tb_ad9361_cal_coarse;
// reg clk = 'b0;
// reg rst = 1'b1;
// reg ad9361_1_cal_start = 'b0;
// wire ad9361_1_cal_done ;
// reg ad9361_2_cal_start = 'b0;
// wire ad9361_2_cal_done ;
// wire ad9361_cal_result ;
// wire ad9361_cal_valid;
// reg ad9361_recal = 'b0;
// // phase difference of 180 degree
// reg [11:0] rx_ch1_i = 12'd2047;
// reg [11:0] rx_ch1_q = 12'd2047;
// reg [11:0] rx_ch2_i = -12'd2047;
// reg [11:0] rx_ch2_q = -12'd2047;
// reg [11:0] rx_ch3_q = -12'd2047;
// reg [11:0] rx_ch3_i = -12'd2047;
// reg [11:0] rx_ch4_i = 12'd2047;
// reg [11:0] rx_ch4_q = 12'd2047;
// wire [11:0] rx_cal_ch1_i;
// wire [11:0] rx_cal_ch2_i;
// wire [11:0] rx_cal_ch3_i;
// wire [11:0] rx_cal_ch4_i;
// wire [11:0] rx_cal_ch1_q;
// wire [11:0] rx_cal_ch2_q;
// wire [11:0] rx_cal_ch3_q;
// wire [11:0] rx_cal_ch4_q;
// ad9361_phase_cal #(
// .COUNTER_MOD (48),
// .PEAK_POS (12)
// ) u_ad9361_phase_cal
// (
// // clock & reset
// .clk (clk ), // input clk
// .rst (rst ), // input rst
// // control interface
// .ad9361_1_cal_start (ad9361_1_cal_start ), // input ad9361_1_cal_start
// .ad9361_1_cal_done (ad9361_1_cal_done ), // output ad9361_1_cal_done
// .ad9361_2_cal_start (ad9361_2_cal_start ), // input ad9361_2_cal_start
// .ad9361_2_cal_done (ad9361_2_cal_done ), // output ad9361_2_cal_done
// .ad9361_cal_result (ad9361_cal_result ), // output ad9361_cal_result
// .ad9361_cal_valid (ad9361_cal_valid ), // output ad9361_cal_valid
// .ad9361_recal (ad9361_recal ), // input ad9361_recal
// // input data interface
// .rx_ch1_i (rx_ch1_i ), // input [11:0] rx_ch1_i
// .rx_ch2_i (rx_ch2_i ), // input [11:0] rx_ch2_i
// .rx_ch3_i (rx_ch3_i ), // input [11:0] rx_ch3_i
// .rx_ch4_i (rx_ch4_i ), // input [11:0] rx_ch4_i
// .rx_ch1_q (rx_ch1_q ), // input [11:0] rx_ch1_q
// .rx_ch2_q (rx_ch2_q ), // input [11:0] rx_ch2_q
// .rx_ch3_q (rx_ch3_q ), // input [11:0] rx_ch3_q
// .rx_ch4_q (rx_ch4_q ), // input [11:0] rx_ch4_q
// // output data interface
// .rx_cal_ch1_i (rx_cal_ch1_i ), // output [11:0] rx_cal_ch1_i
// .rx_cal_ch2_i (rx_cal_ch2_i ), // output [11:0] rx_cal_ch2_i
// .rx_cal_ch3_i (rx_cal_ch3_i ), // output [11:0] rx_cal_ch3_i
// .rx_cal_ch4_i (rx_cal_ch4_i ), // output [11:0] rx_cal_ch4_i
// .rx_cal_ch1_q (rx_cal_ch1_q ), // output [11:0] rx_cal_ch1_q
// .rx_cal_ch2_q (rx_cal_ch2_q ), // output [11:0] rx_cal_ch2_q
// .rx_cal_ch3_q (rx_cal_ch3_q ), // output [11:0] rx_cal_ch3_q
// .rx_cal_ch4_q (rx_cal_ch4_q ) // output [11:0] rx_cal_ch4_q
// );
// initial begin
// #102
// rst = 1'b0;
// #100
// ad9361_1_cal_start = 1'b1;
// end
// initial begin
// #10000
// ad9361_recal = 1'b1;
// #20
// ad9361_recal = 1'b0;
// end
// always begin
// #2 clk = ~clk;
// end
// always begin
// #72
// rx_ch1_i = ~rx_ch1_i;
// rx_ch2_i = ~rx_ch2_i;
// rx_ch3_i = ~rx_ch3_i;
// rx_ch4_i = ~rx_ch4_i;
// #24
// rx_ch1_q = ~rx_ch1_q;
// rx_ch2_q = ~rx_ch2_q;
// rx_ch3_q = ~rx_ch3_q;
// rx_ch4_q = ~rx_ch4_q;
// end
// always @(posedge clk) begin
// if (ad9361_1_cal_done) begin
// ad9361_2_cal_start <= 1'b1;
// end
// else begin
// ad9361_2_cal_start <= 1'b0;
// end
// end
// endmodule
@@ -0,0 +1,981 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
// _ _ ____
// | | ___ ___| |__ / ___| __ _ ___
// _ | |/ _ \/ __| '_ \ | | _ / _` |/ _ \
// | |_| | (_) \__ \ | | | | |_| | (_| | (_) |
// \___/ \___/|___/_| |_| \____|\__,_|\___/
//
// Create Date: 2021/12/14 15:54:11
// Design Name:
// Module Name: system_top
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module system_top
(
/***************************************************************************
* Contents
* 01. Clocks
* 02. HMC7044 Interface
* 03. AD9361-1 Interface
* 04. AD9361-2 Interface
* 05. Phased-Array Control
* 06. RF Synthesizer Control
* 07. Debug IO
* 08. DDR and Fixed-io (Do NOT Modify)
**************************************************************************/
// *************************************************************************
// ******************************** Clocks *********************************
// *************************************************************************
// fpga logic clock
input clk_250m_p , // generated by hmc7044, 250mhz
input clk_250m_n ,
// ad9361 buffered clock
input ad9361_1_buffer_clk , // derived from ad9361 input clock
input ad9361_2_buffer_clk , // derived from ad9361 input clock
// *************************************************************************
// *************************** HMC7044 Interface ***************************
// *************************************************************************
// spi interface
output hmc7044_spi_clk ,
output hmc7044_spi_csn ,
inout hmc7044_spi_sdio ,
// control signals
output hmc7044_reset , // hmc7044 active-high reset signal, set to 0 in normal operation
output hmc7044_sync , // hmc7044 multichip synchronization signal, set to 0 if not used
// gpio
inout [ 3:0] hmc7044_gpio ,
// *************************************************************************
// ************************** AD9361-1 Interface ***************************
// *************************************************************************
// rx data (rx channels are tied to ground physically)
input ad9361_1_rx_data_clk, // ad9361 rx data clock, 96mhz
input ad9361_1_rx_frame ,
input [11:0] ad9361_1_rx_data ,
// tx data
output ad9361_1_tx_fb_clk ,
output ad9361_1_tx_frame ,
output [11:0] ad9361_1_tx_data ,
// spi interface
output ad9361_1_spi_clk ,
output ad9361_1_spi_csn ,
output ad9361_1_spi_mosi ,
input ad9361_1_spi_miso ,
// control signals
output ad9361_1_reset_b , // ad9361 active-low reset control
output ad9361_1_en_agc , // ad9361 manual agc control
output ad9361_1_enable , // ad9361 enable state machine pin control (spi control is also allowed)
output ad9361_1_txnrx , // ad9361 enable state machine pin control (spi control is also allowed)
input [ 3:0] ad9361_1_ctrl_in ,
output [ 7:0] ad9361_1_ctrl_out ,
output ad9361_sync ,
// *************************************************************************
// ************************** AD9361-2 Interface ***************************
// *************************************************************************
// rx data (rx channels are tied to ground physically)
input ad9361_2_rx_data_clk,
input ad9361_2_rx_frame ,
input [11:0] ad9361_2_rx_data ,
// tx data
output ad9361_2_tx_fb_clk ,
output ad9361_2_tx_frame ,
output [11:0] ad9361_2_tx_data ,
// spi interface
output ad9361_2_spi_clk ,
output ad9361_2_spi_csn ,
output ad9361_2_spi_mosi ,
input ad9361_2_spi_miso ,
// control signals
output ad9361_2_reset_b , // ad9361 active-low reset control
output ad9361_2_en_agc , // ad9361 manual agc control
output ad9361_2_enable , // ad9361 enable state machine pin control (spi control is also allowed)
output ad9361_2_txnrx , // ad9361 enable state machine pin control (spi control is also allowed)
input [ 3:0] ad9361_2_ctrl_in ,
output [ 7:0] ad9361_2_ctrl_out ,
// *************************************************************************
// ************************* Phased-Array Control **************************
// *************************************************************************
output ant_clk ,
output ant_en ,
output ant_data ,
output ant_tr ,
output ant_dary ,
input ant_dout ,
// *************************************************************************
// ************************ RF Synthesizer Control *************************
// *************************************************************************
output rf_standby ,
output rf_sw_pll ,
output rf_t ,
output rf_r ,
output rf_sw_bpf ,
output rf_sclk1 ,
output rf_sdio1 ,
output rf_cs1 ,
input rf_ld1 ,
output rf_sclk2 ,
output rf_sdio2 ,
output rf_cs2 ,
input rf_ld2 ,
output rf_sclk3 ,
output rf_sdio3 ,
output rf_cs3 ,
input rf_ld3 ,
output rf_tmgc_16 ,
output rf_tmgc_8 ,
output rf_tmgc_4 ,
output rf_tmgc_2 ,
output rf_tmgc_1 ,
output rf_rmgc_16 ,
output rf_rmgc_8 ,
output rf_rmgc_4 ,
output rf_rmgc_2 ,
output rf_rmgc_1 ,
output rf_enable ,
output rf_sc ,
output rf_sd ,
output rf_endsyn ,
input rf_sdout ,
inout rf_dq_wd ,
output rf_sw_rx ,
// *************************************************************************
// ******************************* Debug IO ********************************
// *************************************************************************
// 3.3v ports
output uart1_txd ,
input uart1_rxd ,
output uart2_txd ,
input uart2_rxd ,
output uart3_txd ,
input uart3_rxd ,
// 1.8v ports
inout debug_io_1 ,
inout debug_io_2 ,
// 3.3v ports
inout debug_io_3 ,
inout debug_io_4 ,
inout debug_io_5 ,
inout debug_io_6 ,
inout debug_io_7 ,
// *************************************************************************
// ******************* DDR and Fixed-io (Do NOT Modify) ********************
// *************************************************************************
// ddr
inout [14:0] ddr_addr ,
inout [ 2:0] ddr_ba ,
inout ddr_cas_n ,
inout ddr_ck_n ,
inout ddr_ck_p ,
inout ddr_cke ,
inout ddr_cs_n ,
inout [ 3:0] ddr_dm ,
inout [31:0] ddr_dq ,
inout [ 3:0] ddr_dqs_n ,
inout [ 3:0] ddr_dqs_p ,
inout ddr_odt ,
inout ddr_ras_n ,
inout ddr_reset_n ,
inout ddr_we_n ,
// fixed-io
inout fixed_io_ddr_vrn ,
inout fixed_io_ddr_vrp ,
inout [53:0] fixed_io_mio ,
inout fixed_io_ps_clk ,
inout fixed_io_ps_porb ,
inout fixed_io_ps_srstb
);
////////////////////////////////////////////////////////////////////////////////
/////////////////////////// System Clock Generation ////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// global reset
wire sys_rst ; // global reset signal, active high
wire ant_rst ; // phased-array & rf control reset signal, active high
// pl signal processing clock
wire sys_clk ; // 48MHz 41.6667MHz
wire sys_clk_2x ; // 96MHz 83.3333MHz
wire sys_clk_3x ; // 144MHz 125MHz
wire sys_clk_4x ; // 192MHz 166.6667MHz
wire sys_clk_ld ; // system main clock locked indicator
// ad9361-1 clocks
wire ad9361_1_clk ; // 48MHz 41.6667MHz
wire ad9361_1_clk_2x ; // 96MHz 83.3333MHz
wire ad9361_1_clk_3x ; // 144MHz 125MHz
wire ad9361_1_clk_4x ; // 192MHz 166.6667MHz
wire ad9361_1_clk_ld ; // ad9361-1 clock group locked indicator
// ad9361-2 clocks
wire ad9361_2_clk ; // 48MHz 41.6667MHz
wire ad9361_2_clk_2x ; // 96MHz 83.3333MHz
wire ad9361_2_clk_3x ; // 144MHz 125MHz
wire ad9361_2_clk_4x ; // 192MHz 166.6667MHz
wire ad9361_2_clk_ld ; // ad9361-2 clock group locked indicator
// phased-array & rf control clocks
wire clk_96m ;
wire clk_48m ;
wire clk_32m ;
wire clk_19p2m ;
clk_dist u_clk_dist
(
// input clocks
.clk_250m_p (clk_250m_p ), // generated by ad9516, 250mhz
.clk_250m_n (clk_250m_n ),
.ad9361_1_rx_data_clk(ad9361_1_rx_data_clk), // ad9361 rx data clock, 83.3333mhz
.ad9361_2_rx_data_clk(ad9361_2_rx_data_clk), // ad9361 rx data clock, 83.3333mhz
// output clocks & reset
// global reset
.sys_rst (sys_rst ), // global reset signal, active high
.ant_rst (ant_rst ), // phased-array & rf control reset signal, active high
// pl signal processing clock
.sys_clk (sys_clk ), // 48MHz 41.6667MHz
.sys_clk_2x (sys_clk_2x ), // 96MHz 83.3333MHz
.sys_clk_3x (sys_clk_3x ), // 144MHz 125MHz
.sys_clk_4x (sys_clk_4x ), // 192MHz 166.6667MHz
.sys_clk_ld (sys_clk_ld ), // system main clock locked indicator
// ad9361-1 clocks
.ad9361_1_clk (ad9361_1_clk ), // 48MHz 41.6667MHz
.ad9361_1_clk_2x (ad9361_1_clk_2x ), // 96MHz 83.3333MHz
.ad9361_1_clk_3x (ad9361_1_clk_3x ), // 144MHz 125MHz
.ad9361_1_clk_4x (ad9361_1_clk_4x ), // 192MHz 166.6667MHz
.ad9361_1_clk_ld (ad9361_1_clk_ld ), // ad9361-1 clock group locked indicator
// ad9361-2 clocks
.ad9361_2_clk (ad9361_2_clk ), // 48MHz 41.6667MHz
.ad9361_2_clk_2x (ad9361_2_clk_2x ), // 96MHz 83.3333MHz
.ad9361_2_clk_3x (ad9361_2_clk_3x ), // 144MHz 125MHz
.ad9361_2_clk_4x (ad9361_2_clk_4x ), // 192MHz 166.6667MHz
.ad9361_2_clk_ld (ad9361_2_clk_ld ), // ad9361-2 clock group locked indicator
// phased-array & rf control clocks
.clk_96m (clk_96m ),
.clk_48m (clk_48m ),
.clk_32m (clk_32m ),
.clk_19p2m (clk_19p2m )
);
////////////////////////////////////////////////////////////////////////////////
//////////////////////////// Block Design Interface ////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// gpio
wire [47:0] gpio_i;
wire [47:0] gpio_o;
wire [47:0] gpio_t;
wire ad9361_rx_fifo_rst;
wire ad9361_1_cal_start;
wire ad9361_1_cal_done;
wire ad9361_2_cal_start;
wire ad9361_2_cal_done;
wire ad9361_cal_result;
wire ad9361_recal;
assign gpio_i[47:47] = gpio_o[47:47];
// hmc7044
assign hmc7044_reset = gpio_o[ 0]; // hmc7044 reset
assign hmc7044_sync = gpio_o[ 1]; // hmc7044 multichip synchronization
assign hmc7044_gpio[0] = gpio_t[ 2] ? gpio_i[ 2] : gpio_o[ 2];
assign hmc7044_gpio[1] = gpio_t[ 3] ? gpio_i[ 3] : gpio_o[ 3];
assign hmc7044_gpio[2] = gpio_t[ 4] ? gpio_i[ 4] : gpio_o[ 4];
assign hmc7044_gpio[3] = gpio_t[ 5] ? gpio_i[ 5] : gpio_o[ 5];
// ad9361-1
assign ad9361_1_txnrx = gpio_o[ 6]; // ad9361 enable state machine control
assign ad9361_1_enable = gpio_o[ 7]; // ad9361 enable state machine control
assign ad9361_1_en_agc = gpio_o[ 8]; // ad9361 agc control
assign ad9361_1_reset_b = gpio_o[ 9]; // ad9361 reset
assign ad9361_1_ctrl_out = gpio_o[17:10];
assign gpio_i[21:18] = ad9361_1_ctrl_in;
// ad9361-2
assign ad9361_2_txnrx = gpio_o[22]; // ad9361 enable state machine control
assign ad9361_2_enable = gpio_o[23]; // ad9361 enable state machine control
assign ad9361_2_en_agc = gpio_o[24]; // ad9361 agc control
assign ad9361_2_reset_b = gpio_o[25]; // ad9361 reset
assign ad9361_2_ctrl_out = gpio_o[33:26];
assign gpio_i[37:34] = ad9361_2_ctrl_in;
// ad9361 multichip sync
assign ad9361_sync = gpio_o[38];
assign ad9361_rx_fifo_rst = gpio_o[39];
assign ad9361_1_cal_start = gpio_o[40];
assign ad9361_2_cal_start = gpio_o[41];
assign ad9361_recal = gpio_o[42];
assign ad9361_tx_switch = gpio_o[43];
assign gpio_i[44] = ad9361_1_cal_done;
assign gpio_i[45] = ad9361_2_cal_done;
assign gpio_i[46] = ad9361_cal_result;
// spi interface
wire spi_sclk ;
wire [ 2:0] spi_cs ;
reg spi_sdi ;
wire spi_sdo ;
wire spi_sdo_t ;
wire spi_three_wire;
wire spi_active ;
// hmc7044 - three-wire spi
assign hmc7044_spi_clk = spi_sclk;
assign hmc7044_spi_csn = spi_cs[0];
assign hmc7044_spi_sdio = spi_sdo_t ? 1'bz : spi_sdo;
// ad9361-1 - three-wire spi or four-wire spi
assign ad9361_1_spi_clk = spi_sclk;
assign ad9361_1_spi_csn = spi_cs[1];
assign ad9361_1_spi_mosi = spi_sdo_t ? 1'bz : spi_sdo;
// ad9361-2 - three-wire spi or four-wire spi
assign ad9361_2_spi_clk = spi_sclk;
assign ad9361_2_spi_csn = spi_cs[2];
assign ad9361_2_spi_mosi = spi_sdo_t ? 1'bz : spi_sdo;
// select sdi signal
always @(*) begin
if (~hmc7044_spi_csn)
spi_sdi = hmc7044_spi_sdio;
else if (~ad9361_1_spi_csn)
spi_sdi = spi_three_wire ? ad9361_1_spi_mosi : ad9361_1_spi_miso;
else if (~ad9361_2_spi_csn)
spi_sdi = spi_three_wire ? ad9361_2_spi_mosi : ad9361_2_spi_miso;
else
spi_sdi = 1'bz;
end
// ps clock
wire ps_clk_50M;
wire ps_clk_200M;
system_bd_wrapper u_system_bd_wrapper
(
// ddr
.ddr_addr (ddr_addr ), // inout [14:0]ddr_addr
.ddr_ba (ddr_ba ), // inout [2:0]ddr_ba
.ddr_cas_n (ddr_cas_n ), // inout ddr_cas_n
.ddr_ck_n (ddr_ck_n ), // inout ddr_ck_n
.ddr_ck_p (ddr_ck_p ), // inout ddr_ck_p
.ddr_cke (ddr_cke ), // inout ddr_cke
.ddr_cs_n (ddr_cs_n ), // inout ddr_cs_n
.ddr_dm (ddr_dm ), // inout [3:0]ddr_dm
.ddr_dq (ddr_dq ), // inout [31:0]ddr_dq
.ddr_dqs_n (ddr_dqs_n ), // inout [3:0]ddr_dqs_n
.ddr_dqs_p (ddr_dqs_p ), // inout [3:0]ddr_dqs_p
.ddr_odt (ddr_odt ), // inout ddr_odt
.ddr_ras_n (ddr_ras_n ), // inout ddr_ras_n
.ddr_reset_n (ddr_reset_n ), // inout ddr_reset_n
.ddr_we_n (ddr_we_n ), // inout ddr_we_n
// fixed-io
.fixed_io_ddr_vrn (fixed_io_ddr_vrn ), // inout fixed_io_ddr_vrn
.fixed_io_ddr_vrp (fixed_io_ddr_vrp ), // inout fixed_io_ddr_vrp
.fixed_io_mio (fixed_io_mio ), // inout [53:0]fixed_io_mio
.fixed_io_ps_clk (fixed_io_ps_clk ), // inout fixed_io_ps_clk
.fixed_io_ps_porb (fixed_io_ps_porb ), // inout fixed_io_ps_porb
.fixed_io_ps_srstb (fixed_io_ps_srstb ), // inout fixed_io_ps_srstb
// gpio, for control signals
.gpio_i (gpio_i ), // input [47:0]gpio_i
.gpio_o (gpio_o ), // output [47:0]gpio_o
.gpio_t (gpio_t ), // output [47:0]gpio_t
// spi interface
.spi_sclk (spi_sclk ), // output spi_sclk
.spi_cs (spi_cs ), // output [2:0]spi_cs
.spi_sdi (spi_sdi ), // input [0:0]spi_sdi
.spi_sdo (spi_sdo ), // output spi_sdo
.spi_sdo_t (spi_sdo_t ), // output spi_sdo_t
.spi_three_wire (spi_three_wire ), // output spi_three_wire
.spi_active (spi_active ), // output spi_active
// ps clock
.ps_clk_50M (ps_clk_50M ), // output ps_clk_50M
.ps_clk_200M (ps_clk_200M ) // output ps_clk_200M
);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////// RF control //////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// rf auto switch frequency function
wire rf_auto_start_vio ;
wire rf_ctrl_mode_vio ;
wire switch_next_freq_vio;
wire switch_last_freq_vio;
wire [15:0] cnt_valid_to_switch_vio;
(*dont_touch = "true"*) wire vio_switch;
(*dont_touch = "true"*) wire vio_switch_auto;
(*dont_touch = "true"*) wire [15:0] vio_frequency;
(*dont_touch = "true"*) wire [15:0] vio_frequency_auto;
wire hop_words_valid_auto;
rf_auto_switch_freq u_rf_auto_switch_freq(
.clk (clk_48m ),
.rst (sys_rst ),
// vio control
.start (rf_auto_start_vio ), // rise-edge active, if start, change freq word to the first
.rf_ctrl_mode (rf_ctrl_mode_vio ), // 1 : auto switch, 0 : manual switch
.switch_next_freq (switch_next_freq_vio ), // rise-edge active
.switch_last_freq (switch_last_freq_vio ), // rise-edge active
.cnt_valid_to_switch (cnt_valid_to_switch_vio ),
// input
.freq_hop_words_vio (vio_frequency[15:0] ),
.hop_words_valid_vio (1'b0 ),
.freq_hop_switch_vio (vio_switch ),
// output
.freq_hop_words_auto (vio_frequency_auto[15:0] ),
.hop_words_valid_auto (hop_words_valid_auto ),
.freq_hop_switch_auto (vio_switch_auto )
);
ant_rf_ctrl u_ant_rf_ctrl
(
.clk_48m (clk_48m ), // input clk_48m
.clk_96m (clk_96m ), // input clk_96m
.clk_32m (clk_32m ), // input clk_32m
.clk_19p2m (clk_19p2m ), // input clk_19p2m
.sys_rst (ant_rst ), // input sys_rst
.ant_clk (ant_clk ), // output ant_clk
.ant_en (ant_en ), // output ant_en
.ant_data (ant_data ), // output ant_data
.ant_tr (ant_tr ), // output ant_tr
.ant_dary (ant_dary ), // output ant_dary
.ant_dout (ant_dout ), // input ant_dout
.rf_standby (rf_standby ), // output rf_standby
.rf_sw_pll (rf_sw_pll ), // output rf_sw_pll
.rf_t (rf_t ), // output rf_t
.rf_r (rf_r ), // output rf_r
.rf_sw_bpf (rf_sw_bpf ), // output rf_sw_bpf
.rf_sclk1 (rf_sclk1 ), // output rf_sclk1
.rf_sdio1 (rf_sdio1 ), // output rf_sdio1
.rf_cs1 (rf_cs1 ), // output rf_cs1
.rf_ld1 (rf_ld1 ), // input rf_ld1
.rf_sclk2 (rf_sclk2 ), // output rf_sclk2
.rf_sdio2 (rf_sdio2 ), // output rf_sdio2
.rf_cs2 (rf_cs2 ), // output rf_cs2
.rf_ld2 (rf_ld2 ), // input rf_ld2
.rf_sclk3 (rf_sclk3 ), // output rf_sclk3
.rf_sdio3 (rf_sdio3 ), // output rf_sdio3
.rf_cs3 (rf_cs3 ), // output rf_cs3
.rf_ld3 (rf_ld3 ), // input rf_ld3
.rf_tmgc_16 (rf_tmgc_16 ), // output rf_tmgc_16
.rf_tmgc_8 (rf_tmgc_8 ), // output rf_tmgc_8
.rf_tmgc_4 (rf_tmgc_4 ), // output rf_tmgc_4
.rf_tmgc_2 (rf_tmgc_2 ), // output rf_tmgc_2
.rf_tmgc_1 (rf_tmgc_1 ), // output rf_tmgc_1
.rf_rmgc_16 (rf_rmgc_16 ), // output rf_rmgc_16
.rf_rmgc_8 (rf_rmgc_8 ), // output rf_rmgc_8
.rf_rmgc_4 (rf_rmgc_4 ), // output rf_rmgc_4
.rf_rmgc_2 (rf_rmgc_2 ), // output rf_rmgc_2
.rf_rmgc_1 (rf_rmgc_1 ), // output rf_rmgc_1
.rf_enable (rf_enable ), // output rf_enable
.rf_sc (rf_sc ), // output rf_sc
.rf_sd (rf_sd ), // output rf_sd
.rf_endsyn (rf_endsyn ), // output rf_endsyn
.rf_sdout (rf_sdout ), // input rf_sdout
.rf_dq_wd (rf_dq_wd ), // inout rf_dq_wd
.rf_sw_rx (rf_sw_rx ) // output rf_sw_rx
);
assign u_ant_rf_ctrl.vio_switch = vio_switch_auto ;
assign u_ant_rf_ctrl.vio_frequency = vio_frequency_auto;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////// Tx Signal ///////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// baseband signal
wire [11:0] tx_data_i;
wire [11:0] tx_data_q;
wire [11:0] tx_ch1_i;
wire [11:0] tx_ch1_q;
wire [11:0] tx_ch2_i;
wire [11:0] tx_ch2_q;
ad9361_tx_map_cmos_dual u_ad9361_tx_map
(
.clk_2x_in (ad9361_1_clk_2x ), // input clk_2x_in
.clk_in_rst (~ad9361_1_clk_ld ), // input clk_in_rst
.tx_data_clk (sys_clk ), // input tx_data_clk
.tx_data_clk_rst(sys_rst ), // input tx_data_clk_rst
.tx_ch1_i (tx_ch1_i ), // input [11:0] tx_ch1_i
.tx_ch1_q (tx_ch1_q ), // input [11:0] tx_ch1_q
.tx_ch2_i (tx_ch2_i ), // input [11:0] tx_ch2_i
.tx_ch2_q (tx_ch2_q ), // input [11:0] tx_ch2_q
.clk_out (ad9361_1_tx_fb_clk ), // output clk_out
.tx_frame (ad9361_1_tx_frame ), // output tx_frame
.tx_data (ad9361_1_tx_data ) // output [11:0] tx_data
);
assign ad9361_2_tx_fb_clk = ad9361_1_tx_fb_clk;
// assign ad9361_2_tx_frame = ad9361_1_tx_frame ;
// assign ad9361_2_tx_data = ad9361_1_tx_data ;
tx_pre_process #(
.CAL_MOD_FINE (0)
) u_tx_pre_process
(
// clock & reset
.clk (sys_clk ),
.rst (sys_rst ),
// input data
.tx_data_ch1_i (tx_data_i ),
.tx_data_ch1_q (tx_data_q ),
.tx_data_ch2_i (tx_data_i ),
.tx_data_ch2_q (tx_data_q ),
// ad9361 calibration interface
.ad9361_tx_switch (ad9361_tx_switch ),
//
.bb_rshift (1'b0 ),
// output data
.tx_ch1_i (tx_ch1_i ),
.tx_ch1_q (tx_ch1_q ),
.tx_ch2_i (tx_ch2_i ),
.tx_ch2_q (tx_ch2_q )
);
// <--------------------------------------------------------------------------->
// <--------------------- insert transmitter logic below ---------------------->
// <--------------------------------------------------------------------------->
wire [ 1:0] waveform_sel;
wire sweep_on ;
wire [31:0] freq_set ;
wire [ 1:0] iq_sel ;
wire [ 3:0] bb_rshift ;
tx_qpsk u_tx_qpsk
(
.clk (sys_clk ), // input clk
.rst (sys_rst ), // input rst
.tx_data_i (tx_data_i ), // output [11:0] tx_data_i
.tx_data_q (tx_data_q ), // output [11:0] tx_data_q
// debug ports
.waveform_sel (waveform_sel[1:0] ), // input [ 1:0] waveform_sel
.sweep_on (sweep_on ), // input sweep_on
.freq_set (freq_set ), // input [31:0] freq_set
.iq_sel (iq_sel ), // input [ 1:0] iq_sel
.bb_rshift (bb_rshift ) // input [ 3:0] bb_rshift
);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////// Rx Signals //////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
wire [11:0] rx_ch1_i, rx_ch1_q;
wire [11:0] rx_ch2_i, rx_ch2_q;
wire [11:0] rx_ch3_i, rx_ch3_q;
wire [11:0] rx_ch4_i, rx_ch4_q;
wire [11:0] rx_cal_ch1_i, rx_cal_ch1_q;
wire [11:0] rx_cal_ch2_i, rx_cal_ch2_q;
wire [11:0] rx_cal_ch3_i, rx_cal_ch3_q;
wire [11:0] rx_cal_ch4_i, rx_cal_ch4_q;
ad9361_rx_map_cmos_dual u_ad9361_1_rx_map
(
.clk_2x_in (ad9361_1_clk_2x ), // input clk_2x_in
.clk_in_rst (~ad9361_1_clk_ld ), // input clk_in_rst
.rx_data_clk (sys_clk ), // input rx_data_clk
.rx_data_clk_rst(sys_rst ), // input rx_data_clk_rst
.rx_fifo_rst (ad9361_rx_fifo_rst ), // input rx_fifo_rst
.rx_frame (ad9361_1_rx_frame ), // input rx_frame
.rx_data (ad9361_1_rx_data ), // input [11:0] rx_data
.rx_ch1_i (rx_ch1_i ), // output [11:0] rx_ch1_i
.rx_ch1_q (rx_ch1_q ), // output [11:0] rx_ch1_q
.rx_ch2_i (rx_ch2_i ), // output [11:0] rx_ch2_i
.rx_ch2_q (rx_ch2_q ) // output [11:0] rx_ch2_q
);
ad9361_rx_map_cmos_dual u_ad9361_2_rx_map
(
.clk_2x_in (ad9361_2_clk_2x ), // input clk_2x_in
.clk_in_rst (~ad9361_2_clk_ld ), // input clk_in_rst
.rx_data_clk (sys_clk ), // input rx_data_clk
.rx_data_clk_rst(sys_rst ), // input rx_data_clk_rst
.rx_fifo_rst (ad9361_rx_fifo_rst ), // input rx_fifo_rst
.rx_frame (ad9361_2_rx_frame ), // input rx_frame
.rx_data (ad9361_2_rx_data ), // input [11:0] rx_data
.rx_ch1_i (rx_ch3_i ), // output [11:0] rx_ch1_i
.rx_ch1_q (rx_ch3_q ), // output [11:0] rx_ch1_q
.rx_ch2_i (rx_ch4_i ), // output [11:0] rx_ch2_i
.rx_ch2_q (rx_ch4_q ) // output [11:0] rx_ch2_q
);
ad9361_phase_cal_coarse u_ad9361_phase_cal
(
// clock & reset
.clk (sys_clk ), // input clk
.rst (sys_rst ), // input rst
// control interface
.ad9361_1_cal_start (ad9361_1_cal_start ), // input ad9361_1_cal_start
.ad9361_1_cal_done (ad9361_1_cal_done ), // output ad9361_1_cal_done
.ad9361_2_cal_start (ad9361_2_cal_start ), // input ad9361_2_cal_start
.ad9361_2_cal_done (ad9361_2_cal_done ), // output ad9361_2_cal_done
.ad9361_cal_result (ad9361_cal_result ), // output ad9361_cal_result
.ad9361_cal_valid (ad9361_cal_valid ), // output ad9361_cal_valid
.ad9361_recal (ad9361_recal ), // input ad9361_recal
// input data interface
.rx_ch1_i (rx_ch1_i ), // input [ADC_DATA_WIDTH-1:0] rx_ch1_i
.rx_ch1_q (rx_ch1_q ), // input [ADC_DATA_WIDTH-1:0] rx_ch1_q
.rx_ch2_i (rx_ch2_i ), // input [ADC_DATA_WIDTH-1:0] rx_ch2_i
.rx_ch2_q (rx_ch2_q ), // input [ADC_DATA_WIDTH-1:0] rx_ch2_q
.rx_ch3_i (rx_ch3_i ), // input [ADC_DATA_WIDTH-1:0] rx_ch3_i
.rx_ch3_q (rx_ch3_q ), // input [ADC_DATA_WIDTH-1:0] rx_ch3_q
.rx_ch4_i (rx_ch4_i ), // input [ADC_DATA_WIDTH-1:0] rx_ch4_i
.rx_ch4_q (rx_ch4_q ), // input [ADC_DATA_WIDTH-1:0] rx_ch4_q
// output data interface
.rx_cal_ch1_i (rx_cal_ch1_i ), // output [ADC_DATA_WIDTH-1:0] rx_cal_ch1_i
.rx_cal_ch1_q (rx_cal_ch1_q ), // output [ADC_DATA_WIDTH-1:0] rx_cal_ch1_q
.rx_cal_ch2_i (rx_cal_ch2_i ), // output [ADC_DATA_WIDTH-1:0] rx_cal_ch2_i
.rx_cal_ch2_q (rx_cal_ch2_q ), // output [ADC_DATA_WIDTH-1:0] rx_cal_ch2_q
.rx_cal_ch3_i (rx_cal_ch3_i ), // output [ADC_DATA_WIDTH-1:0] rx_cal_ch3_i
.rx_cal_ch3_q (rx_cal_ch3_q ), // output [ADC_DATA_WIDTH-1:0] rx_cal_ch3_q
.rx_cal_ch4_i (rx_cal_ch4_i ), // output [ADC_DATA_WIDTH-1:0] rx_cal_ch4_i
.rx_cal_ch4_q (rx_cal_ch4_q ) // output [ADC_DATA_WIDTH-1:0] rx_cal_ch4_q
);
// <--------------------------------------------------------------------------->
// <----------------------- insert receiver logic below ----------------------->
// <--------------------------------------------------------------------------->
wire freq_comp_start ;
wire freq_comp_busy ;
wire [7:0] dmf_num_per_ch ;
wire [31:0] freq_manual ;
wire freq_manual_en ;
wire [31:0] freq_target ;
wire freq_target_valid;
wire ch_peak_valid ;
wire [17:0] ch1_peak_value_abs ;
wire [17:0] ch1_peak_value_i ;
wire [17:0] ch1_peak_value_q ;
wire [ 9:0] ch1_peak_index ;
wire [17:0] ch2_peak_value_abs ;
wire [17:0] ch2_peak_value_i ;
wire [17:0] ch2_peak_value_q ;
wire [ 9:0] ch2_peak_index ;
wire [17:0] ch3_peak_value_abs ;
wire [17:0] ch3_peak_value_i ;
wire [17:0] ch3_peak_value_q ;
wire [ 9:0] ch3_peak_index ;
wire [17:0] ch4_peak_value_abs ;
wire [17:0] ch4_peak_value_i ;
wire [17:0] ch4_peak_value_q ;
wire [ 9:0] ch4_peak_index ;
freq_comp #(
.FREQ_WORD_LOWER (-4194304 ),
.FREQ_WORD_UPPER (4194303 ),
.FREQ_WORD_STEP (1024 )
) u_freq_comp
(
// clock & reset
.clk (sys_clk ), // input clk
.rst (sys_rst ), // input rst
// input data
.freq_comp_start (freq_comp_start ), // input freq_comp_start
.freq_comp_busy (freq_comp_busy ), // output freq_comp_busy
.rx_data_valid (ad9361_cal_valid ), // input rx_data_valid
.rx_ch1_i (rx_cal_ch1_i ), // input [DATA_I_WIDTH-1 : 0] rx_ch1_i
.rx_ch1_q (rx_cal_ch1_q ), // input [DATA_I_WIDTH-1 : 0] rx_ch1_q
.rx_ch2_i (rx_cal_ch2_i ), // input [DATA_I_WIDTH-1 : 0] rx_ch2_i
.rx_ch2_q (rx_cal_ch2_q ), // input [DATA_I_WIDTH-1 : 0] rx_ch2_q
.rx_ch3_i (rx_cal_ch3_i ), // input [DATA_I_WIDTH-1 : 0] rx_ch3_i
.rx_ch3_q (rx_cal_ch3_q ), // input [DATA_I_WIDTH-1 : 0] rx_ch3_q
.rx_ch4_i (rx_cal_ch4_i ), // input [DATA_I_WIDTH-1 : 0] rx_ch4_i
.rx_ch4_q (rx_cal_ch4_q ), // input [DATA_I_WIDTH-1 : 0] rx_ch4_q
// configuration
.dmf_num_per_ch (dmf_num_per_ch ), // input [$clog2(MAX_DMF_NUM)-1 : 0] dmf_num_per_ch
.freq_manual (freq_manual ), // input [FREQ_WORD_WIDTH-1 : 0] freq_manual
.freq_manual_en (freq_manual_en ), // input freq_manual_en
// output frequency result
.freq_target (freq_target ), // output [FREQ_WORD_WIDTH-1 : 0] freq_target
.freq_target_valid (freq_target_valid ), // output freq_target_valid
// output dmf result
.ch_peak_valid (ch_peak_valid ), // output ch_peak_valid
.ch1_peak_value_abs (ch1_peak_value_abs ), // output reg [DATA_O_WIDTH-1 : 0] ch1_peak_value_abs
.ch1_peak_value_i (ch1_peak_value_i ), // output reg [DATA_O_WIDTH-1 : 0] ch1_peak_value_i
.ch1_peak_value_q (ch1_peak_value_q ), // output reg [DATA_O_WIDTH-1 : 0] ch1_peak_value_q
.ch1_peak_index (ch1_peak_index ), // output reg [$clog2(PRBS_POS-1) : 0] ch1_peak_index
.ch2_peak_value_abs (ch2_peak_value_abs ), // output reg [DATA_O_WIDTH-1 : 0] ch2_peak_value_abs
.ch2_peak_value_i (ch2_peak_value_i ), // output reg [DATA_O_WIDTH-1 : 0] ch2_peak_value_i
.ch2_peak_value_q (ch2_peak_value_q ), // output reg [DATA_O_WIDTH-1 : 0] ch2_peak_value_q
.ch2_peak_index (ch2_peak_index ), // output reg [$clog2(PRBS_POS-1) : 0] ch2_peak_index
.ch3_peak_value_abs (ch3_peak_value_abs ), // output reg [DATA_O_WIDTH-1 : 0] ch3_peak_value_abs
.ch3_peak_value_i (ch3_peak_value_i ), // output reg [DATA_O_WIDTH-1 : 0] ch3_peak_value_i
.ch3_peak_value_q (ch3_peak_value_q ), // output reg [DATA_O_WIDTH-1 : 0] ch3_peak_value_q
.ch3_peak_index (ch3_peak_index ), // output reg [$clog2(PRBS_POS-1) : 0] ch3_peak_index
.ch4_peak_value_abs (ch4_peak_value_abs ), // output reg [DATA_O_WIDTH-1 : 0] ch4_peak_value_abs
.ch4_peak_value_i (ch4_peak_value_i ), // output reg [DATA_O_WIDTH-1 : 0] ch4_peak_value_i
.ch4_peak_value_q (ch4_peak_value_q ), // output reg [DATA_O_WIDTH-1 : 0] ch4_peak_value_q
.ch4_peak_index (ch4_peak_index ) // output reg [$clog2(PRBS_POS-1) : 0] ch4_peak_index
);
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////// ILAs and VIOs /////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
vio_clk_ld_rd u_vio_clk_ld_rd
(
.clk (sys_clk ),
.probe_in0 (ad9361_1_clk_ld),
.probe_in1 (ad9361_2_clk_ld)
);
vio_rfcontrl u_vio_rfcontrl
(
.clk (clk_48m ), // input wire clk
.probe_out0 (vio_switch ), // output wire [0 : 0] probe_out0
.probe_out1 (u_ant_rf_ctrl.vio_trdirection ), // output wire [0 : 0] probe_out1
.probe_out2 (vio_frequency[15:0] ), // output wire [15 : 0] probe_out2
.probe_out3 (u_ant_rf_ctrl.vio_emitMGC[7:0] ), // output wire [7 : 0] probe_out3
.probe_out4 (u_ant_rf_ctrl.vio_ch01MGC[3:0] ), // output wire [3 : 0] probe_out4
.probe_out5 (u_ant_rf_ctrl.vio_ch02MGC[3:0] ), // output wire [3 : 0] probe_out5
.probe_out6 (u_ant_rf_ctrl.vio_ch03MGC[3:0] ), // output wire [3 : 0] probe_out6
.probe_out7 (u_ant_rf_ctrl.vio_ch04MGC[3:0] ), // output wire [3 : 0] probe_out7
.probe_out8 (u_ant_rf_ctrl.vio_recvMGC[7:0] ), // output wire [7 : 0] probe_out8
.probe_out9 (u_ant_rf_ctrl.vio_AntMod[7:0] ), // output wire [7 : 0] probe_out9
.probe_out10(u_ant_rf_ctrl.vio_AntOffAxis[15:0] ), // output wire [15 : 0] probe_out10
.probe_out11(u_ant_rf_ctrl.vio_AntYaw[15:0] ), // output wire [15 : 0] probe_out11
.probe_out12(u_ant_rf_ctrl.vio_PrecessTime[15:0] ), // output wire [15 : 0] probe_out12
.probe_out13(rf_auto_start_vio ), // output wire [0 : 0] probe_out13
.probe_out14(rf_ctrl_mode_vio ), // output wire [0 : 0] probe_out14
.probe_out15(switch_next_freq_vio ), // output wire [0 : 0] probe_out15
.probe_out16(switch_last_freq_vio ), // output wire [0 : 0] probe_out16
.probe_out17(cnt_valid_to_switch_vio[15:0] ), // output wire [15: 0] probe_out17
.probe_in0 (vio_frequency_auto[15:0] ) // input wire [10: 0] probe_in0
);
vio_ant_test u_vio_ant_test
(
.clk (clk_48m ),
.probe_out0 (u_ant_rf_ctrl.vio_mode_ant ),
.probe_out1 (u_ant_rf_ctrl.vio_hop_start ),
.probe_out2 (u_ant_rf_ctrl.vio_standby ),
.probe_out3 (u_ant_rf_ctrl.vio_hoptime[15:0] )
);
ila_rfcontrl u_ila_rfcontrl
(
.clk (clk_48m ), // input wire clk
.probe0 (u_ant_rf_ctrl.SPI_MOSI_F ), // input wire [0:0]
.probe1 (u_ant_rf_ctrl.SPI_MISO_F ), // input wire [0:0]
.probe2 (u_ant_rf_ctrl.SPI_SYN_F ), // input wire [0:0]
.probe3 (u_ant_rf_ctrl.TP_EN_F ), // input wire [0:0]
.probe4 (u_ant_rf_ctrl.TR_MGC_F ), // input wire [0:0]
.probe5 (u_ant_rf_ctrl.CAL_F ), // input wire [0:0]
.probe6 (u_ant_rf_ctrl.PRF ), // input wire [0:0]
.probe7 (u_ant_rf_ctrl.rf_standby ), // input wire [0:0]
.probe8 (u_ant_rf_ctrl.rf_sw_pll ), // input wire [0:0]
.probe9 (u_ant_rf_ctrl.rf_t ), // input wire [0:0]
.probe10(u_ant_rf_ctrl.rf_r ), // input wire [0:0]
.probe11(u_ant_rf_ctrl.rf_sw_bpf ), // input wire [0:0]
.probe12(u_ant_rf_ctrl.rf_sclk1 ), // input wire [0:0]
.probe13(u_ant_rf_ctrl.rf_sdio1 ), // input wire [0:0]
.probe14(u_ant_rf_ctrl.rf_cs1 ), // input wire [0:0]
.probe15(u_ant_rf_ctrl.rf_ld1 ), // input wire [0:0]
.probe16(u_ant_rf_ctrl.rf_sclk2 ), // input wire [0:0]
.probe17(u_ant_rf_ctrl.rf_sdio2 ), // input wire [0:0]
.probe18(u_ant_rf_ctrl.rf_cs2 ), // input wire [0:0]
.probe19(u_ant_rf_ctrl.rf_ld2 ), // input wire [0:0]
.probe20(u_ant_rf_ctrl.rf_sclk3 ), // input wire [0:0]
.probe21(u_ant_rf_ctrl.rf_sdio3 ), // input wire [0:0]
.probe22(u_ant_rf_ctrl.rf_cs3 ), // input wire [0:0]
.probe23(u_ant_rf_ctrl.rf_ld3 ), // input wire [0:0]
.probe24(u_ant_rf_ctrl.rf_tmgc_16 ), // input wire [0:0]
.probe25(u_ant_rf_ctrl.rf_tmgc_8 ), // input wire [0:0]
.probe26(u_ant_rf_ctrl.rf_tmgc_4 ), // input wire [0:0]
.probe27(u_ant_rf_ctrl.rf_tmgc_2 ), // input wire [0:0]
.probe28(u_ant_rf_ctrl.rf_tmgc_1 ), // input wire [0:0]
.probe29(u_ant_rf_ctrl.rf_rmgc_16 ), // input wire [0:0]
.probe30(u_ant_rf_ctrl.rf_rmgc_8 ), // input wire [0:0]
.probe31(u_ant_rf_ctrl.rf_rmgc_4 ), // input wire [0:0]
.probe32(u_ant_rf_ctrl.rf_rmgc_2 ), // input wire [0:0]
.probe33(u_ant_rf_ctrl.rf_rmgc_1 ), // input wire [0:0]
.probe34(u_ant_rf_ctrl.rf_enable ), // input wire [0:0]
.probe35(u_ant_rf_ctrl.rf_sc ), // input wire [0:0]
.probe36(u_ant_rf_ctrl.rf_sd ), // input wire [0:0]
.probe37(u_ant_rf_ctrl.rf_endsyn ), // input wire [0:0]
.probe38(u_ant_rf_ctrl.rf_sdout ), // input wire [0:0]
.probe39(u_ant_rf_ctrl.state_rfdata[1:0] ), // input wire [0:0]
.probe40(u_ant_rf_ctrl.RF_temperature[7:0] ), // input wire [0:0]
.probe41(u_ant_rf_ctrl.RF_IFlocked[7:0] ), // input wire [0:0]
.probe42(u_ant_rf_ctrl.RF_RFAlocked[7:0] ), // input wire [0:0]
.probe43(u_ant_rf_ctrl.RF_RFBlocked[7:0] ), // input wire [0:0]
.probe44(u_ant_rf_ctrl.RF_ch1mgc[3:0] ), // input wire [0:0]
.probe45(u_ant_rf_ctrl.RF_ch2mgc[3:0] ), // input wire [0:0]
.probe46(u_ant_rf_ctrl.RF_ch3mgc[3:0] ), // input wire [0:0]
.probe47(u_ant_rf_ctrl.RF_ch4mgc[3:0] ), // input wire [0:0]
.probe48(u_ant_rf_ctrl.RF_Framecount[31:0] ), // input wire [0:0]
.probe49(u_ant_rf_ctrl.RF_RecvWord[95:0] ) // input wire [0:0]
);
ila_AntCtrl u_ila_AntCtrl
(
.clk (clk_96m ), // input wire clk
.probe0 (u_ant_rf_ctrl.ant_clk ), // input wire [0:0] probe0
.probe1 (u_ant_rf_ctrl.ant_en ), // input wire [0:0] probe1
.probe2 (u_ant_rf_ctrl.ant_data ), // input wire [0:0] probe2
.probe3 (u_ant_rf_ctrl.ant_tr ), // input wire [0:0] probe3
.probe4 (u_ant_rf_ctrl.ant_dary ), // input wire [0:0] probe4
.probe5 (u_ant_rf_ctrl.ant_dout ), // input wire [0:0] probe5
.probe6 (u_ant_rf_ctrl.state_antdata[1:0] ), // input wire [0:0] probe5
.probe7 (u_ant_rf_ctrl.Ant_Ant_Volt[7:0] ), // input wire [0:0] probe5
.probe8 (u_ant_rf_ctrl.Ant_RF_Volt[7:0] ), // input wire [0:0] probe5
.probe9 (u_ant_rf_ctrl.Ant_IF_Volt[7:0] ), // input wire [0:0] probe5
.probe10(u_ant_rf_ctrl.Ant_state[7:0] ), // input wire [0:0] probe5
.probe11(u_ant_rf_ctrl.Ant_Framecount[31:0] ), // input wire [0:0] probe5
.probe12(u_ant_rf_ctrl.Ant_RecvWord[95:0] ) // input wire [0:0] probe5
);
vio_rf_rd u_vio_rf_rd (
.clk (clk_96m ), // input wire clk
.probe_in0 (u_ant_rf_ctrl.RF_temperature[7:0] ), // input wire [7 : 0] probe_in0
.probe_in1 (u_ant_rf_ctrl.RF_IFlocked[7:0] ), // input wire [7 : 0] probe_in1
.probe_in2 (u_ant_rf_ctrl.RF_RFAlocked[7:0] ), // input wire [7 : 0] probe_in2
.probe_in3 (u_ant_rf_ctrl.RF_RFBlocked[7:0] ), // input wire [7 : 0] probe_in3
.probe_in4 (u_ant_rf_ctrl.RF_ch1mgc[3:0] ), // input wire [3 : 0] probe_in4
.probe_in5 (u_ant_rf_ctrl.RF_ch2mgc[3:0] ), // input wire [3 : 0] probe_in5
.probe_in6 (u_ant_rf_ctrl.RF_ch3mgc[3:0] ), // input wire [3 : 0] probe_in6
.probe_in7 (u_ant_rf_ctrl.RF_ch4mgc[3:0] ), // input wire [3 : 0] probe_in7
.probe_in8 (u_ant_rf_ctrl.RF_Framecount[31:0] ), // input wire [31 : 0] probe_in8
.probe_in9 (u_ant_rf_ctrl.RF_RecvWord_last ) // input wire [95 : 0] probe_in9
);
vio_ant_rd u_vio_ant_rd (
.clk (clk_96m ), // input wire clk
.probe_in0 (u_ant_rf_ctrl.Ant_Ant_Volt[7:0] ), // input wire [7 : 0] probe_in0
.probe_in1 (u_ant_rf_ctrl.Ant_RF_Volt[7:0] ), // input wire [7 : 0] probe_in1
.probe_in2 (u_ant_rf_ctrl.Ant_IF_Volt[7:0] ), // input wire [7 : 0] probe_in2
.probe_in3 (u_ant_rf_ctrl.Ant_state[7:0] ), // input wire [7 : 0] probe_in3
.probe_in4 (u_ant_rf_ctrl.Ant_Framecount[31:0] ), // input wire [31 : 0] probe_in4
.probe_in5 (u_ant_rf_ctrl.Ant_RecvWord_last ) // input wire [95 : 0] probe_in5
);
ila_2x12x1024 u_ila_tx
(
.clk (sys_clk ), // input wire clk
.probe0 (tx_ch1_i ), // input wire [11:0] probe0
.probe1 (tx_ch1_q ) // input wire [11:0] probe1
);
ila_8x12x8192 u_ila_rx
(
.clk (sys_clk ), // input wire clk
.probe0 (rx_cal_ch1_i ), // input wire [11:0] probe0
.probe1 (rx_cal_ch1_q ), // input wire [11:0] probe1
.probe2 (rx_cal_ch2_i ), // input wire [11:0] probe2
.probe3 (rx_cal_ch2_q ), // input wire [11:0] probe3
.probe4 (rx_cal_ch3_i ), // input wire [11:0] probe4
.probe5 (rx_cal_ch3_q ), // input wire [11:0] probe5
.probe6 (rx_cal_ch4_i ), // input wire [11:0] probe6
.probe7 (rx_cal_ch4_q ) // input wire [11:0] probe7
);
ila_cal u_ila_cal
(
.clk (sys_clk ), // input wire clk
.probe0 (u_ad9361_phase_cal.ad9361_1_cal_start_d2 ), // input wire [0:0] probe0
.probe1 (u_ad9361_phase_cal.ad9361_1_cal_done ), // input wire [0:0] probe1
.probe2 (u_ad9361_phase_cal.ad9361_2_cal_start_d2 ), // input wire [0:0] probe2
.probe3 (u_ad9361_phase_cal.ad9361_2_cal_done ), // input wire [0:0] probe3
.probe4 (u_ad9361_phase_cal.ad9361_cal_result ), // input wire [0:0] probe4
.probe5 (u_ad9361_phase_cal.ad9361_recal_d2 ), // input wire [0:0] probe5
.probe6 (u_ad9361_phase_cal.curr_state ), // input wire [1:0] probe6
.probe7 (rx_ch2_i ), // input wire [11:0] probe7
.probe8 (rx_ch2_q ), // input wire [11:0] probe8
.probe9 (rx_ch4_i ), // input wire [11:0] probe9
.probe10(rx_ch4_q ), // input wire [11:0] probe10
.probe11(rx_cal_ch2_i ), // input wire [11:0] probe11
.probe12(rx_cal_ch2_q ), // input wire [11:0] probe12
.probe13(rx_cal_ch4_i ), // input wire [11:0] probe13
.probe14(rx_cal_ch4_q ) // input wire [11:0] probe14
);
vio_manual_ctrl u_vio_manual_ctrl
(
.clk (sys_clk ), // input wire clk
.probe_out0 (waveform_sel[1:0] ), // output wire [1 : 0] probe_out0
.probe_out1 (sweep_on ), // output wire [0 : 0] probe_out1
.probe_out2 (freq_set[31:0] ), // output wire [31 : 0] probe_out2
.probe_out3 (iq_sel[1:0] ), // output wire [1 : 0] probe_out3
.probe_out4 (bb_rshift[3:0] ) // output wire [3 : 0] probe_out4
);
vio_freq_comp u_vio_freq_comp
(
.clk (sys_clk ), // input wire clk
.probe_in0 (freq_comp_busy ), // input wire [0 : 0] probe_in0
.probe_out0 (freq_comp_start ), // output wire [0 : 0] probe_out0
.probe_out1 (dmf_num_per_ch ), // output wire [7 : 0] probe_out1
.probe_out2 (freq_manual_en ), // output wire [0 : 0] probe_out2
.probe_out3 (freq_manual ) // output wire [31 : 0] probe_out3
);
ila_freq_comp u_ila_freq_comp
(
.clk (sys_clk ), // input wire clk
.probe0 (ch_peak_valid ), // input wire [0:0] probe0
.probe1 (ch1_peak_value_i ), // input wire [17:0] probe1
.probe2 (ch1_peak_value_q ), // input wire [17:0] probe2
.probe3 (ch2_peak_value_i ), // input wire [17:0] probe3
.probe4 (ch2_peak_value_q ), // input wire [17:0] probe4
.probe5 (ch3_peak_value_i ), // input wire [17:0] probe5
.probe6 (ch3_peak_value_q ), // input wire [17:0] probe6
.probe7 (ch4_peak_value_i ), // input wire [17:0] probe7
.probe8 (ch4_peak_value_q ), // input wire [17:0] probe8
.probe9 (ch1_peak_index ), // input wire [7:0] probe9
.probe10(ch2_peak_index ), // input wire [7:0] probe10
.probe11(ch3_peak_index ), // input wire [7:0] probe11
.probe12(ch4_peak_index ), // input wire [7:0] probe12
.probe13(freq_comp_start ), // input wire [0:0] probe13
.probe14(u_freq_comp.state_curr ), // input wire [2:0] probe14
.probe15(u_freq_comp.din_freq_cxr_real ), // input wire [11:0] probe15
.probe16(u_freq_comp.din_freq_cxr_imag ), // input wire [11:0] probe16
.probe17(u_freq_comp.dmf_freq_moduli_abs ), // input wire [17:0] probe17
.probe18(u_freq_comp.dmf_ch_moduli_abs[0] ), // input wire [17:0] probe18
.probe19(u_freq_comp.dmf_ch_moduli_abs[1] ), // input wire [17:0] probe19
.probe20(u_freq_comp.dmf_ch_moduli_abs[2] ), // input wire [17:0] probe20
.probe21(u_freq_comp.dmf_ch_moduli_abs[3] ), // input wire [17:0] probe21
.probe22(u_freq_comp.freq_word ), // input wire [31:0] probe22
.probe23(vio_frequency_auto[11:0] ) // input wire [11:0] probe23
);
endmodule
@@ -0,0 +1,138 @@
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
// _ _ ____
// | | ___ ___| |__ / ___| __ _ ___
// _ | |/ _ \/ __| '_ \ | | _ / _` |/ _ \
// | |_| | (_) \__ \ | | | | |_| | (_| | (_) |
// \___/ \___/|___/_| |_| \____|\__,_|\___/
//
// Create Date: 2023/02/25 15:20:22
// Design Name:
// Module Name: tx_pre_process
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module tx_pre_process
#(
parameter ADC_DATA_WIDTH = 12,
parameter PRBS = 128'b00000011000010100011110010001011001110101001111101000011100010010011011010110111101100011010010111011100110010101011111110000001, // inverse pseudorandom bit sequence, [0,flip(PRSB7)]
parameter PRBS_LEN = 128, // length of pseudorandom bit sequence
parameter INTERP_FACTOR = 8, // interpolation factor, max inter-channel delay ranges in [-INTERP_FACTOR+1,INTERP_FACTOR-1]
parameter CAL_MOD_FINE = 1
)
(
// clock & reset
input clk ,
input rst ,
// input data
input [ADC_DATA_WIDTH-1:0] tx_data_ch1_i ,
input [ADC_DATA_WIDTH-1:0] tx_data_ch1_q ,
input [ADC_DATA_WIDTH-1:0] tx_data_ch2_i ,
input [ADC_DATA_WIDTH-1:0] tx_data_ch2_q ,
// ad9361 calibration interface
input ad9361_tx_switch ,
//
input [$clog2(ADC_DATA_WIDTH)-1:0] bb_rshift,
// output data
output [ADC_DATA_WIDTH-1:0] tx_ch1_i ,
output [ADC_DATA_WIDTH-1:0] tx_ch1_q ,
output [ADC_DATA_WIDTH-1:0] tx_ch2_i ,
output [ADC_DATA_WIDTH-1:0] tx_ch2_q
);
integer i;
// square shaped bpsk signal
reg [$clog2(PRBS_LEN*INTERP_FACTOR)-1 : 0] chip_interp_cnt = 'b0;
reg signed [ADC_DATA_WIDTH-1:0] tx_pn_i = 'b0;
reg signed [ADC_DATA_WIDTH-1:0] tx_pn_q = 'b0;
if (CAL_MOD_FINE == 1) begin
always @(posedge clk) begin
if (rst) begin
chip_interp_cnt <= 'b0;
end
else begin
chip_interp_cnt <= chip_interp_cnt + 1'b1;
end
end
always @(posedge clk) begin
if (rst) begin
tx_pn_i <= 'b0;
tx_pn_q <= 'b0;
end
else begin
tx_pn_i <= PRBS[chip_interp_cnt[$clog2(PRBS_LEN*INTERP_FACTOR)-1 -: $clog2(PRBS_LEN)]] ? {1'b0,{(ADC_DATA_WIDTH-1){1'b1}}} : {1'b1,{(ADC_DATA_WIDTH-2){1'b0}},1'b1}; // (1 or 0) ? 4'b0111 : 4'b1001
tx_pn_q <= PRBS[chip_interp_cnt[$clog2(PRBS_LEN*INTERP_FACTOR)-1 -: $clog2(PRBS_LEN)]] ? {1'b1,{(ADC_DATA_WIDTH-2){1'b0}},1'b1} : {1'b0,{(ADC_DATA_WIDTH-1){1'b1}}}; // (1 or 0) ? 4'b1001 : 4'b0111
end
end
end // if (CAL_MOD_FINE == 1)
// buffer input control signals (clock domain crossing from ps to pl clock domain)
reg ad9361_tx_switch_d1 = 'b0;
reg ad9361_tx_switch_d2 = 'b0;
wire signed [ADC_DATA_WIDTH-1:0] tx_dc_i = {1'b0,{(ADC_DATA_WIDTH-2){1'b1}},1'b1};
wire signed [ADC_DATA_WIDTH-1:0] tx_dc_q = {1'b1,{(ADC_DATA_WIDTH-2){1'b0}},1'b1};
always @(posedge clk) begin
ad9361_tx_switch_d1 <= ad9361_tx_switch;
ad9361_tx_switch_d2 <= ad9361_tx_switch_d1;
end
reg [ADC_DATA_WIDTH-1 : 0] tx_ch1_i_buf = 'b0;
reg [ADC_DATA_WIDTH-1 : 0] tx_ch1_q_buf = 'b0;
reg [ADC_DATA_WIDTH-1 : 0] tx_ch2_i_buf = 'b0;
reg [ADC_DATA_WIDTH-1 : 0] tx_ch2_q_buf = 'b0;
assign tx_ch1_i = tx_ch1_i_buf;
assign tx_ch1_q = tx_ch1_q_buf;
assign tx_ch2_i = tx_ch2_i_buf;
assign tx_ch2_q = tx_ch2_q_buf;
always @(posedge clk) begin
if (rst) begin
tx_ch1_i_buf <= 'b0;
tx_ch1_q_buf <= 'b0;
tx_ch2_i_buf <= 'b0;
tx_ch2_q_buf <= 'b0;
end
else if (ad9361_tx_switch_d2) begin
if (CAL_MOD_FINE == 1) begin
tx_ch1_i_buf <= tx_pn_i >>> bb_rshift;
tx_ch1_q_buf <= tx_pn_q >>> bb_rshift;
tx_ch2_i_buf <= tx_pn_i >>> bb_rshift;
tx_ch2_q_buf <= tx_pn_q >>> bb_rshift;
end // CAL_MOD_FINE == 1
else begin
tx_ch1_i_buf <= tx_dc_i >>> bb_rshift;
tx_ch1_q_buf <= tx_dc_q >>> bb_rshift;
tx_ch2_i_buf <= tx_dc_i >>> bb_rshift;
tx_ch2_q_buf <= tx_dc_q >>> bb_rshift;
end // CAL_MOD_FINE != 1
end
else begin
tx_ch1_i_buf <= tx_data_ch1_i;
tx_ch1_q_buf <= tx_data_ch1_q;
tx_ch2_i_buf <= tx_data_ch2_i;
tx_ch2_q_buf <= tx_data_ch2_q;
end
end
endmodule