source: PlatformSupport/Deprecated/pcores/clock_board_config_v1_02_a/hdl/verilog/clock_board_config.v

Last change on this file was 621, checked in by murphpo, 17 years ago

Added GUI parameters for clock board config options, cleaned up XBD

File size: 25.5 KB
Line 
1// The two clocks fed to the FPGA over the clock board
2// header orginate in the AD9510 that supplied A/D and
3// D/A (logic) clocks.  OUT5 supplies the two series
4// terminated CMOS outputs, while OUT4 supplies the LVDS
5// outputs that are (should be) parallel terminated at
6// the inputs of the FPGA.
7//
8// To support various operating modes, a variable is
9// defined to specify the operating modes for OUT4 and
10// OUT5.
11//
12// OUT 5 supplies + and - CMOS outputs (test mode) : 16'h1EFF
13// OUT 5 supplies + CMOS output only (normal mode) : 16'h0EFF
14// OUT 5 powered down                              : 16'h0FFF
15
16`define fpga_clk_out5_reg 16'h0EFF
17
18// OUT 4 supplies + and - CMOS outputs (test mode) : 16'h1EFF
19// OUT 4 powered down (normal mode)                : 16'h07FF
20// OUT 4 supplies LVDS outputs                     : 16'h06FF
21
22`define fpga_clk_out4_reg 16'h07FF
23
24// Select the input source for the radio clocks.
25//
26// CLK source for radio distribution = oscillator    : 16'h1AFF
27// CLK source for radio distribution = external coax : 16'h1DFF
28
29//`define fpga_radio_clk_source 16'h1AFF
30
31// Select the input source for the logic (A/D and D/A)
32// clocks.
33//
34// CLK source for logic distribution = oscillator    : 16'h1AFF
35// CLK source for logic distribution = external coax : 16'h1DFF
36
37//`define fpga_logic_clk_source 16'h1AFF
38
39
40
41module clock_board_config (
42    sys_clk,
43    sys_rst,
44
45    cfg_radio_dat_out,
46    cfg_radio_csb_out,
47    cfg_radio_en_out,
48    cfg_radio_clk_out,
49
50    cfg_logic_dat_out,
51    cfg_logic_csb_out,
52    cfg_logic_en_out,
53    cfg_logic_clk_out,
54   
55    config_invalid
56);
57
58parameter sys_clk_freq_hz = 120000000;
59parameter fpga_radio_clk_source = 16'h1Aff;
60parameter fpga_logic_clk_source = 16'h1Aff;
61
62input  sys_clk;
63input  sys_rst;
64
65output cfg_radio_dat_out; reg cfg_radio_dat_out = 1'b1;
66output cfg_radio_csb_out; reg cfg_radio_csb_out = 1'b1;
67output cfg_radio_en_out;  reg cfg_radio_en_out  = 1'b1;
68output cfg_radio_clk_out; reg cfg_radio_clk_out = 1'b1;
69
70output cfg_logic_dat_out; reg cfg_logic_dat_out = 1'b1;
71output cfg_logic_csb_out; reg cfg_logic_csb_out = 1'b1;
72output cfg_logic_en_out;  reg cfg_logic_en_out  = 1'b1;
73output cfg_logic_clk_out; reg cfg_logic_clk_out = 1'b1;
74
75output config_invalid;
76
77// SCP_CNT [7:0] increments throughout each clock period
78// of the AD9510 serial control port (SCP).  The absolute
79// maximum clock frequency for the SCP is 25 MHz, but I'm
80// limiting it to 12.5 MHz to be conservative.  If the
81// system clock operates at exactly 87.5 MHz, then the
82// minimum SCP clock period would equal exactly seven
83// SYS_CLK periods.  In this case, SCP_CNT cycles through
84// seven values -- 0, 1, 2, ..., 6 -- durin each SCP clock
85// period.  The result is an SCP clock period of 80 nsec
86// (12.5 MHz)..
87//
88// SCP_CYC_START and SCP_CYC_MID detect the start and middle
89// of each SCP cycle, respectively.  The assertion of
90// SCP_CYC_START, when appropriate, causes the SCP clock
91// to go low.  In this state, the assertion of SCP_CYC_MID
92// causes the SCP clock to return to its high state.
93
94parameter scp_min_freq_hz = 2500000;
95
96// a : How many SYS_CLK cycles per SCP cycle -- CEIL(X/Y)?
97// b : Impose a minimum of 2 SYS_CLK cycles per SCP cycle.
98
99parameter scp_cyc_leng_a = ((sys_clk_freq_hz + scp_min_freq_hz - 1) / scp_min_freq_hz);
100parameter scp_cyc_leng_b = (scp_cyc_leng_a < 2) ? 2 : scp_cyc_leng_a;
101parameter scp_cyc_leng   = scp_cyc_leng_b;
102
103reg [3:0] scp_cnt_en     = 4'b0000;     // enable used for graceful power-up
104reg [7:0] scp_cnt        = 8'b00000000; // SCP cycle counter
105reg       scp_cnt_tc     = 1'b0;        // pulses HIGH during last SCP cycle to reset counter
106reg       scp_cyc_start  = 1'b0;        // pulses high to denote start  of each SCP clock period
107reg       scp_cyc_mid    = 1'b0;        // pulses high to denote middle of each SCP clock period
108
109always @ (posedge sys_clk)
110begin
111    scp_cnt_en [3:0] <= {1'b1,scp_cnt_en [3:1]};
112
113    if (~scp_cnt_en [0])
114    begin
115        scp_cnt       [7:0] <= 8'b00000000;
116        scp_cnt_tc          <= 1'b0;
117        scp_cyc_start       <= 1'b0;
118        scp_cyc_mid         <= 1'b0;
119    end
120
121    else
122    begin
123        if   (~scp_cnt_tc) scp_cnt [7:0] <= scp_cnt [7:0] + 1;
124        else               scp_cnt [7:0] <= 8'b00000000;
125
126        scp_cnt_tc     <= (scp_cnt [7:0] == ((scp_cyc_leng + 0) - 2));
127        scp_cyc_start  <= (scp_cnt [7:0] ==                       0 );
128        scp_cyc_mid    <= (scp_cnt [7:0] == ((scp_cyc_leng + 1) / 2));
129    end
130
131end
132
133
134
135reg [3:0] sys_rst_lock = 4'b1111;
136reg [2:0] sys_rst_sync = 3'b111;
137
138always @ (posedge sys_clk or posedge sys_rst)
139begin
140    if   (sys_rst) sys_rst_lock [3] <= 1'b1;
141    else           sys_rst_lock [3] <= 1'b0;
142end
143
144always @ (posedge sys_clk or posedge sys_rst_lock [3])
145begin
146    if   (sys_rst_lock [3]) sys_rst_lock [2:0] <= 3'b111;
147    else                    sys_rst_lock [2:0] <= {1'b0,sys_rst_lock [2:1]};
148end
149
150always @ (posedge sys_clk)
151begin
152    sys_rst_sync [2:0] <= {sys_rst_lock [0],sys_rst_sync [2:1]};
153end
154
155
156
157// CFG_CYC [9:0] increments by 1 following each assertion
158// of SCP_CYC_MID, until it finally "rolls over" to 0.
159// Coincident with this roll-over is the assertion of
160// CFG_CYC_DONE, thereby preventing any further increments
161// to CFG_CYC.  The net result?...  SCP_CYC_START and
162// SCP_CYC_MID each pulse high 1024 times while
163// CFG_CYC_DONE is deasserted (low).  After this,
164// CFG_CYC_START and CFG_CYC_MID continue to pulse, but
165// CFG_CYC_DONE is asserted to mask of any "events" that
166// depend upon the START and MID pulses.
167//
168// EXAMPLE : SCP_CYC_LENG = 6...
169//
170// SYS_CLK         : \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/       \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
171// SCP_CYC_START   : 0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|1|  ... |0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|1|
172// SCP_CYC_MID     : 0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|  ... |1|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|
173// CFG_CYC         :                 0        |     1     |     2  ...   |    1023   |        0
174// CFG_DONE        : 0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|  ... |0|0|0|0|0|0|0|1|1|1|1|1|1|1|1|1|
175//
176// EXAMPLE : SCP_CYC_LENG = 2...
177//
178// Same as in the previous example, except that
179// SCP_CYC_START and SCP_CYC_MID are alternately pulsing
180// high and low 180 degrees out of phase with respect to
181// one another.
182
183reg [9:0] cfg_cyc      = 10'b0000000000;
184reg       cfg_cyc_done =  1'b1;
185reg       cfg_restart  =  1'b0;
186reg       cfg_clk_low  =  1'b0;
187reg       cfg_clk_high =  1'b0;
188
189reg       cfg_cyc_done_d1 = 1'b1;
190
191always @ (posedge sys_clk)
192begin
193    cfg_cyc_done_d1 <= cfg_cyc_done;
194end
195
196
197
198always @ (posedge sys_clk)
199begin
200
201    if (~scp_cyc_mid)
202    begin
203        cfg_cyc      [9:0] <= cfg_cyc [9:0];
204        cfg_cyc_done       <= cfg_cyc_done;
205    end
206
207    else
208    begin
209        if (cfg_cyc_done)
210        begin
211            cfg_cyc      [9:0] <= 10'b0000000000;
212            cfg_cyc_done       <= ~cfg_restart;
213        end
214
215        else
216        begin
217            cfg_cyc      [9:0] <= cfg_cyc [9:0] + 1;
218            cfg_cyc_done       <= (cfg_cyc [9:0] == 10'b1111111111);
219        end
220    end
221
222   cfg_restart  <= ~cfg_restart & cfg_cyc_done & (sys_rst_sync [1:0] == 2'b01)
223                 |  cfg_restart & cfg_cyc_done & ~scp_cyc_mid;
224
225   cfg_clk_low  <= ~cfg_cyc_done & scp_cyc_start;
226   cfg_clk_high <= ~cfg_cyc_done & scp_cyc_mid;
227end
228
229
230
231// For a given sequence generation register (chain of
232// SRLs), the SRL having index 0 delivers its data
233// first, followed by the SRL having index 1.  The SRL
234// having index 63 delivers its data last.  Hence the
235// input of SRL N is fed by the output of SRL N + 1.
236// The last SRL in each chain is fed with the output
237// of the first SRL in he chain so that the configuration
238// may be repeated on demand.
239//
240// Two sequence generators are defined, one for the
241// AD9510 that clocks the radio ICs for up- and down-
242// conversion, and another that clocks the FPGA and
243// the radio boards' converters.
244
245wire        srl_shift;
246
247wire [63:0] srl_radio_d;
248wire [63:0] srl_radio_q;
249
250wire [63:0] srl_logic_d;
251wire [63:0] srl_logic_q;
252
253assign srl_shift          = cfg_clk_low;
254assign srl_radio_d [63:0] = {srl_radio_q [0],srl_radio_q [63:1]};
255assign srl_logic_d [63:0] = {srl_logic_q [0],srl_logic_q [63:1]};
256
257reg    config_invalid = 1'b1;
258
259always @(posedge sys_clk)
260begin
261    if(cfg_cyc_done & ~cfg_cyc_done_d1)
262        config_invalid <= 1'b0;
263    else if(cfg_restart)
264        config_invalid <= 1'b1;
265end
266
267// ALL SRLs in this module are configured for a static
268// shift length of 16.  For a given 16-bit SRL INIT
269// value, the high order bit will be shifted out first,
270// while the low order bit will be shifted out last.
271// It is, therefore, VERY convenient to operate the
272// AD9510s in MSB first mode.  Pros : This is the
273// default operating mode for the AD9510, and requires
274// no additional hocus pocus.  Cons : Addresses are
275// decremented as data is written into each device.
276// This requires an extra control access to address
277// 5A in order to force the update -- not rocket science,
278// but very important to remember.  See the AD9510 data
279// sheet, revision A, pages 42 and 43 for details.
280
281genvar ii;
282generate
283    for (ii = 0 ; ii < 64 ; ii = ii + 1)
284    begin : gen_srls
285
286        SRL16E srl_radio (
287            .Q   (srl_radio_q [ii]),
288            .A0  (1'b1            ),
289            .A1  (1'b1            ),
290            .A2  (1'b1            ),
291            .A3  (1'b1            ),
292            .CE  (srl_shift       ),
293            .CLK (sys_clk         ),
294            .D   (srl_radio_d [ii])
295        );
296
297        SRL16E srl_logic (
298            .Q   (srl_logic_q [ii]),
299            .A0  (1'b1            ),
300            .A1  (1'b1            ),
301            .A2  (1'b1            ),
302            .A3  (1'b1            ),
303            .CE  (srl_shift       ),
304            .CLK (sys_clk         ),
305            .D   (srl_logic_d [ii])
306        );
307
308    end
309endgenerate
310
311
312// Here's where we define the register contents
313// Each "defparam gen_srls" corresponds to one 16 bit SPI transaction
314
315// Register contents for the radio reference generator
316
317// Leave some emtpy clock cycles at boot to let things settle
318defparam gen_srls[ 0].srl_radio.INIT = 16'hFFFF; // CYCLES    0 -   15
319defparam gen_srls[ 1].srl_radio.INIT = 16'hFFFF; // CYCLES   16 -   31
320defparam gen_srls[ 2].srl_radio.INIT = 16'hFFFF; // CYCLES   32 -   47
321defparam gen_srls[ 3].srl_radio.INIT = 16'hFFFF; // CYCLES   48 -   63
322defparam gen_srls[ 4].srl_radio.INIT = 16'hFFFF; // CYCLES   64 -   79
323defparam gen_srls[ 5].srl_radio.INIT = 16'hFFFF; // CYCLES   80 -   95
324
325// Issue soft-reset; does *not* require write to 5A to take effect
326// reg[0] <= 30, then 10 (assert, then de-assert reset bit)
327defparam gen_srls[ 6].srl_radio.INIT = 16'h0000; // CYCLES   96 -  111
328defparam gen_srls[ 7].srl_radio.INIT = 16'h30FF; // CYCLES  112 -  127
329
330defparam gen_srls[ 8].srl_radio.INIT = 16'h0000; // CYCLES  128 -  143
331defparam gen_srls[ 9].srl_radio.INIT = 16'h10FF; // CYCLES  144 -  159
332
333// Switch clock input to CLK2; power-down CLK1 and PLL input
334// reg[45] <= 1A
335defparam gen_srls[10].srl_radio.INIT = 16'h0045;               // CYCLES  160 -  175
336//defparam gen_srls[11].srl_radio.INIT = `fpga_radio_clk_source; // CYCLES  176 -  191
337defparam gen_srls[11].srl_radio.INIT = fpga_radio_clk_source; // CYCLES  176 -  191
338
339// Bypass dividers on all clocks
340// reg[49,4B,4D,4F,51,53,55,57] <= 80
341
342defparam gen_srls[12].srl_radio.INIT = 16'h0049; // CYCLES  192 -  207
343defparam gen_srls[13].srl_radio.INIT = 16'h80FF; // CYCLES  208 -  223
344
345defparam gen_srls[14].srl_radio.INIT = 16'h004B; // CYCLES  224 -  239
346defparam gen_srls[15].srl_radio.INIT = 16'h80FF; // CYCLES  240 -  255
347
348defparam gen_srls[16].srl_radio.INIT = 16'h004D; // CYCLES  256 -  271
349defparam gen_srls[17].srl_radio.INIT = 16'h80FF; // CYCLES  272 -  287
350
351defparam gen_srls[18].srl_radio.INIT = 16'h004F; // CYCLES  288 -  303
352defparam gen_srls[19].srl_radio.INIT = 16'h80FF; // CYCLES  304 -  319
353
354defparam gen_srls[20].srl_radio.INIT = 16'h0051; // CYCLES  320 -  335
355defparam gen_srls[21].srl_radio.INIT = 16'h80FF; // CYCLES  336 -  351
356
357defparam gen_srls[22].srl_radio.INIT = 16'h0053; // CYCLES  352 -  367
358defparam gen_srls[23].srl_radio.INIT = 16'h80FF; // CYCLES  368 -  383
359
360defparam gen_srls[24].srl_radio.INIT = 16'h0055; // CYCLES  384 -  399
361defparam gen_srls[25].srl_radio.INIT = 16'h80FF; // CYCLES  400 -  415
362
363defparam gen_srls[26].srl_radio.INIT = 16'h0057; // CYCLES  416 -  431
364defparam gen_srls[27].srl_radio.INIT = 16'h80FF; // CYCLES  432 -  447
365
366// Configure the output properties on the CMOS clock outputs.
367// CMOS (not LVDS), invertered output enabled
368// reg[40,41,42,43] <= 1E
369defparam gen_srls[28].srl_radio.INIT = 16'h0040; // CYCLES  448 -  463
370defparam gen_srls[29].srl_radio.INIT = 16'h1EFF; // CYCLES  464 -  479
371
372defparam gen_srls[30].srl_radio.INIT = 16'h0041; // CYCLES  480 -  495
373defparam gen_srls[31].srl_radio.INIT = 16'h1EFF; // CYCLES  496 -  511
374
375defparam gen_srls[32].srl_radio.INIT = 16'h0042; // CYCLES  512 -  527
376defparam gen_srls[33].srl_radio.INIT = 16'h1EFF; // CYCLES  528 -  543
377
378defparam gen_srls[34].srl_radio.INIT = 16'h0043; // CYCLES  544 -  559
379defparam gen_srls[35].srl_radio.INIT = 16'h1EFF; // CYCLES  560 -  575
380
381// Configure the output properties on the PECL clock outputs
382// OUT0 enabled, 810mV drive; OUT1/2/3 disabled
383// reg[3C] <= 08; reg[3D,3E,3F] <= 0B
384defparam gen_srls[36].srl_radio.INIT = 16'h003C; // CYCLES  576 -  591
385defparam gen_srls[37].srl_radio.INIT = 16'h08FF; // CYCLES  592 -  607
386
387defparam gen_srls[38].srl_radio.INIT = 16'h003D; // CYCLES  608 -  623
388defparam gen_srls[39].srl_radio.INIT = 16'h0BFF; // CYCLES  624 -  639
389
390defparam gen_srls[40].srl_radio.INIT = 16'h003E; // CYCLES  640 -  655
391defparam gen_srls[41].srl_radio.INIT = 16'h0BFF; // CYCLES  656 -  671
392
393defparam gen_srls[42].srl_radio.INIT = 16'h003F; // CYCLES  672 -  687
394defparam gen_srls[43].srl_radio.INIT = 16'h0BFF; // CYCLES  688 -  703
395
396
397// Latch the loaded values into the actual config registers
398// reg[5A] <= FF
399defparam gen_srls[44].srl_radio.INIT = 16'h005A; // CYCLES  704 -  719
400defparam gen_srls[45].srl_radio.INIT = 16'hFFFF; // CYCLES  720 -  735
401
402// unused cycles
403defparam gen_srls[46].srl_radio.INIT = 16'hFFFF; // CYCLES  736 -  751
404defparam gen_srls[47].srl_radio.INIT = 16'hFFFF; // CYCLES  752 -  767
405defparam gen_srls[48].srl_radio.INIT = 16'hFFFF; // CYCLES  768 -  783
406defparam gen_srls[49].srl_radio.INIT = 16'hFFFF; // CYCLES  784 -  799
407defparam gen_srls[50].srl_radio.INIT = 16'hFFFF; // CYCLES  800 -  815
408defparam gen_srls[51].srl_radio.INIT = 16'hFFFF; // CYCLES  816 -  831
409defparam gen_srls[52].srl_radio.INIT = 16'hFFFF; // CYCLES  832 -  847
410defparam gen_srls[53].srl_radio.INIT = 16'hFFFF; // CYCLES  848 -  863
411defparam gen_srls[54].srl_radio.INIT = 16'hFFFF; // CYCLES  864 -  879
412defparam gen_srls[55].srl_radio.INIT = 16'hFFFF; // CYCLES  880 -  895
413defparam gen_srls[56].srl_radio.INIT = 16'hFFFF; // CYCLES  896 -  911
414defparam gen_srls[57].srl_radio.INIT = 16'hFFFF; // CYCLES  912 -  927
415defparam gen_srls[58].srl_radio.INIT = 16'hFFFF; // CYCLES  928 -  943
416defparam gen_srls[59].srl_radio.INIT = 16'hFFFF; // CYCLES  944 -  959
417defparam gen_srls[60].srl_radio.INIT = 16'hFFFF; // CYCLES  960 -  975
418defparam gen_srls[61].srl_radio.INIT = 16'hFFFF; // CYCLES  976 -  991
419defparam gen_srls[62].srl_radio.INIT = 16'hFFFF; // CYCLES  992 - 1007
420defparam gen_srls[63].srl_radio.INIT = 16'hFFFF; // CYCLES 1008 - 1023
421
422// Here's some m-code that will help generate these vectors:
423// csb_low =  96   + 32*[0:15];sprintf('cfg_cyc == %d | ',csb_low)
424// csb_high = 96-8 + 32*[1:16];sprintf('cfg_cyc == %d | ',csb_high)
425
426`define RADIO_CSB_LOW_DECODE  ((cfg_cyc ==  96) | (cfg_cyc == 128) | (cfg_cyc == 160) | (cfg_cyc == 192) | (cfg_cyc == 224) | (cfg_cyc == 256) | (cfg_cyc == 288) | (cfg_cyc == 320) | (cfg_cyc == 352) | (cfg_cyc == 384) | (cfg_cyc == 416) | (cfg_cyc == 448) | (cfg_cyc == 480) | (cfg_cyc == 512) | (cfg_cyc == 544) | (cfg_cyc == 576) | (cfg_cyc == 608) | (cfg_cyc == 640) | (cfg_cyc == 672) | (cfg_cyc == 704))
427`define RADIO_CSB_HIGH_DECODE ((cfg_cyc == 120) | (cfg_cyc == 152) | (cfg_cyc == 184) | (cfg_cyc == 216) | (cfg_cyc == 248) | (cfg_cyc == 280) | (cfg_cyc == 312) | (cfg_cyc == 344) | (cfg_cyc == 376) | (cfg_cyc == 408) | (cfg_cyc == 440) | (cfg_cyc == 472) | (cfg_cyc == 504) | (cfg_cyc == 536) | (cfg_cyc == 568) | (cfg_cyc == 600) | (cfg_cyc == 632) | (cfg_cyc == 664) | (cfg_cyc == 696) | (cfg_cyc == 728))
428`define RADIO_EN_LOW_DECODE   ( cfg_cyc ==   0)
429`define RADIO_EN_HIGH_DECODE    ( cfg_cyc ==   4)
430
431//Register contents for the converter clock generator
432
433// Leave some emtpy clock cycles at boot to let things settle
434defparam gen_srls[ 0].srl_logic.INIT = 16'hFFFF; // CYCLES    0 -   15
435defparam gen_srls[ 1].srl_logic.INIT = 16'hFFFF; // CYCLES   16 -   31
436defparam gen_srls[ 2].srl_logic.INIT = 16'hFFFF; // CYCLES   32 -   47
437defparam gen_srls[ 3].srl_logic.INIT = 16'hFFFF; // CYCLES   48 -   63
438defparam gen_srls[ 4].srl_logic.INIT = 16'hFFFF; // CYCLES   64 -   79
439defparam gen_srls[ 5].srl_logic.INIT = 16'hFFFF; // CYCLES   80 -   95
440
441// Issue soft-reset; does *not* require write to 5A to take effect
442// reg[0] <= 30, then 10 (assert, then de-assert reset bit)
443defparam gen_srls[ 6].srl_logic.INIT = 16'h0000; // CYCLES   96 -  111
444defparam gen_srls[ 7].srl_logic.INIT = 16'h30FF; // CYCLES  112 -  127
445
446defparam gen_srls[ 8].srl_logic.INIT = 16'h0000; // CYCLES  128 -  143
447defparam gen_srls[ 9].srl_logic.INIT = 16'h10FF; // CYCLES  144 -  159
448
449// Switch clock input to CLK2; power-down CLK1 and PLL input
450// reg[45] <= 1A
451// defparam gen_srls[10].srl_logic.INIT = 16'h0045; // CYCLES  160 -  175
452// defparam gen_srls[11].srl_logic.INIT = 16'h1AFF; // CYCLES  176 -  191
453
454// For now, switch clock input to CLK1; power-down CLK2 and PLL input
455// reg[45] <= 1D
456defparam gen_srls[10].srl_logic.INIT = 16'h0045;               // CYCLES  160 -  175
457//defparam gen_srls[11].srl_logic.INIT = `fpga_logic_clk_source; // CYCLES  176 -  191
458defparam gen_srls[11].srl_logic.INIT = fpga_logic_clk_source; // CYCLES  176 -  191
459
460// Bypass dividers on all clocks
461// reg[49,4B,4D,4F,51,53,55,57] <= 80
462
463defparam gen_srls[12].srl_logic.INIT = 16'h0049; // CYCLES  192 -  207
464defparam gen_srls[13].srl_logic.INIT = 16'h80FF; // CYCLES  208 -  223
465
466defparam gen_srls[14].srl_logic.INIT = 16'h004B; // CYCLES  224 -  239
467defparam gen_srls[15].srl_logic.INIT = 16'h80FF; // CYCLES  240 -  255
468
469defparam gen_srls[16].srl_logic.INIT = 16'h004D; // CYCLES  256 -  271
470defparam gen_srls[17].srl_logic.INIT = 16'h80FF; // CYCLES  272 -  287
471
472defparam gen_srls[18].srl_logic.INIT = 16'h004F; // CYCLES  288 -  303
473defparam gen_srls[19].srl_logic.INIT = 16'h80FF; // CYCLES  304 -  319
474
475defparam gen_srls[20].srl_logic.INIT = 16'h0051; // CYCLES  320 -  335
476defparam gen_srls[21].srl_logic.INIT = 16'h80FF; // CYCLES  336 -  351
477
478defparam gen_srls[22].srl_logic.INIT = 16'h0053; // CYCLES  352 -  367
479defparam gen_srls[23].srl_logic.INIT = 16'h80FF; // CYCLES  368 -  383
480
481defparam gen_srls[24].srl_logic.INIT = 16'h0055; // CYCLES  384 -  399
482defparam gen_srls[25].srl_logic.INIT = 16'h80FF; // CYCLES  400 -  415
483
484defparam gen_srls[26].srl_logic.INIT = 16'h0057; // CYCLES  416 -  431
485defparam gen_srls[27].srl_logic.INIT = 16'h80FF; // CYCLES  432 -  447
486
487// Configure the output properties on the PECL clock outputs
488// OUT0-OUT3 enabled, 810mV drive;
489// reg[3C,3D,3,3F] <= 08;
490
491defparam gen_srls[28].srl_logic.INIT = 16'h003C; // CYCLES  448 -  463
492defparam gen_srls[29].srl_logic.INIT = 16'h08FF; // CYCLES  464 -  479
493
494defparam gen_srls[30].srl_logic.INIT = 16'h003D; // CYCLES  480 -  495
495defparam gen_srls[31].srl_logic.INIT = 16'h08FF; // CYCLES  496 -  511
496
497defparam gen_srls[32].srl_logic.INIT = 16'h003E; // CYCLES  512 -  527
498defparam gen_srls[33].srl_logic.INIT = 16'h08FF; // CYCLES  528 -  543
499
500defparam gen_srls[34].srl_logic.INIT = 16'h003F; // CYCLES  544 -  559
501defparam gen_srls[35].srl_logic.INIT = 16'h08FF; // CYCLES  560 -  575
502
503// Configure the output properties for the forwarded clock (OUT7)
504// CMOS (not LVDS), inverted output enabled, maximum drive current
505// reg[43] <= 1E;
506
507defparam gen_srls[36].srl_logic.INIT = 16'h0043; // CYCLES  576 -  591
508defparam gen_srls[37].srl_logic.INIT = 16'h1EFF; // CYCLES  592 -  607
509
510// Power down CMOS OUT6
511// reg[42] <= 1F;
512
513defparam gen_srls[38].srl_logic.INIT = 16'h0042; // CYCLES  608 -  623
514defparam gen_srls[39].srl_logic.INIT = 16'h1FFF; // CYCLES  624 -  639
515
516// OUT5 : See comments at the top of this file
517
518defparam gen_srls[40].srl_logic.INIT = 16'h0041;           // CYCLES  640 -  655
519defparam gen_srls[41].srl_logic.INIT = `fpga_clk_out5_reg; // CYCLES  656 -  671
520
521// OUT4 : See comments at the top of this file
522
523defparam gen_srls[42].srl_logic.INIT = 16'h0040;           // CYCLES  672 -  687
524defparam gen_srls[43].srl_logic.INIT = `fpga_clk_out4_reg; // CYCLES  688 -  703
525
526// Latch the loaded values into the actual config registers
527// reg[5A] <= FF
528
529defparam gen_srls[44].srl_logic.INIT = 16'h005A; // CYCLES  704 -  719
530defparam gen_srls[45].srl_logic.INIT = 16'hFFFF; // CYCLES  720 -  735
531
532// unused cycles
533defparam gen_srls[46].srl_logic.INIT = 16'h0000; // CYCLES  736 -  751
534defparam gen_srls[47].srl_logic.INIT = 16'h0000; // CYCLES  752 -  767
535defparam gen_srls[48].srl_logic.INIT = 16'h0000; // CYCLES  768 -  783
536defparam gen_srls[49].srl_logic.INIT = 16'h0000; // CYCLES  784 -  799
537defparam gen_srls[50].srl_logic.INIT = 16'h0000; // CYCLES  800 -  815
538defparam gen_srls[51].srl_logic.INIT = 16'h0000; // CYCLES  816 -  831
539defparam gen_srls[52].srl_logic.INIT = 16'h0000; // CYCLES  832 -  847
540defparam gen_srls[53].srl_logic.INIT = 16'h0000; // CYCLES  848 -  863
541defparam gen_srls[54].srl_logic.INIT = 16'h0000; // CYCLES  864 -  879
542defparam gen_srls[55].srl_logic.INIT = 16'h0000; // CYCLES  880 -  895
543defparam gen_srls[56].srl_logic.INIT = 16'h0000; // CYCLES  896 -  911
544defparam gen_srls[57].srl_logic.INIT = 16'h0000; // CYCLES  912 -  927
545defparam gen_srls[58].srl_logic.INIT = 16'h0000; // CYCLES  928 -  943
546defparam gen_srls[59].srl_logic.INIT = 16'h0000; // CYCLES  944 -  959
547defparam gen_srls[60].srl_logic.INIT = 16'h0000; // CYCLES  960 -  975
548defparam gen_srls[61].srl_logic.INIT = 16'h0000; // CYCLES  976 -  991
549defparam gen_srls[62].srl_logic.INIT = 16'h0000; // CYCLES  992 - 1007
550defparam gen_srls[63].srl_logic.INIT = 16'h0000; // CYCLES 1008 - 1023
551
552`define LOGIC_CSB_LOW_DECODE  ((cfg_cyc ==  96) | (cfg_cyc == 128) | (cfg_cyc == 160) | (cfg_cyc == 192) | (cfg_cyc == 224) | (cfg_cyc == 256) | (cfg_cyc == 288) | (cfg_cyc == 320) | (cfg_cyc == 352) | (cfg_cyc == 384) | (cfg_cyc == 416) | (cfg_cyc == 448) | (cfg_cyc == 480) | (cfg_cyc == 512) | (cfg_cyc == 544) | (cfg_cyc == 576) | (cfg_cyc == 608) | (cfg_cyc == 640) | (cfg_cyc == 672) | (cfg_cyc == 704))
553`define LOGIC_CSB_HIGH_DECODE ((cfg_cyc == 120) | (cfg_cyc == 152) | (cfg_cyc == 184) | (cfg_cyc == 216) | (cfg_cyc == 248) | (cfg_cyc == 280) | (cfg_cyc == 312) | (cfg_cyc == 344) | (cfg_cyc == 376) | (cfg_cyc == 408) | (cfg_cyc == 440) | (cfg_cyc == 472) | (cfg_cyc == 504) | (cfg_cyc == 536) | (cfg_cyc == 568) | (cfg_cyc == 600) | (cfg_cyc == 632) | (cfg_cyc == 664) | (cfg_cyc == 696) | (cfg_cyc == 728))
554`define LOGIC_EN_LOW_DECODE   (cfg_cyc ==  0)
555`define LOGIC_EN_HIGH_DECODE  (cfg_cyc ==  4)
556
557// Decode various values of CFG_CYC to assert and deassert
558// control signals at various bit positions within the
559// configuration sequences.  CFG_RADIO_CSB_LOW, for example,
560// should decode the value of CFG_CYC corresponding to the
561// first bit of an SCP command.  CFG_RADIO_CSB_HIGH should
562// likewise decode the value corresponding to the first
563// bit FOLLOWING a streaming register access.
564
565reg       cfg_radio_csb_low  = 1'b0;
566reg       cfg_radio_csb_high = 1'b0;
567reg       cfg_radio_en_low   = 1'b0;
568reg       cfg_radio_en_high  = 1'b0;
569
570reg       cfg_logic_csb_low  = 1'b0;
571reg       cfg_logic_csb_high = 1'b0;
572reg       cfg_logic_en_low   = 1'b0;
573reg       cfg_logic_en_high  = 1'b0;
574
575always @ (posedge sys_clk)
576begin
577    if (~scp_cyc_start)
578    begin
579        cfg_radio_csb_low   <=  1'b0;
580        cfg_radio_csb_high  <=  1'b0;
581        cfg_radio_en_low    <=  1'b0;
582        cfg_radio_en_high   <=  1'b0;
583
584        cfg_logic_csb_low   <=  1'b0;
585        cfg_logic_csb_high  <=  1'b0;
586        cfg_logic_en_low    <=  1'b0;
587        cfg_logic_en_high   <=  1'b0;
588    end
589
590    else
591    begin
592        if (cfg_cyc_done)
593        begin
594            cfg_radio_csb_low   <=  1'b0;
595            cfg_radio_csb_high  <=  1'b1;
596            cfg_radio_en_low    <=  1'b0;
597            cfg_radio_en_high   <=  1'b1;
598
599            cfg_logic_csb_low   <=  1'b0;
600            cfg_logic_csb_high  <=  1'b1;
601            cfg_logic_en_low    <=  1'b0;
602            cfg_logic_en_high   <=  1'b1;
603        end
604        else
605        begin
606            cfg_radio_csb_low   <= `RADIO_CSB_LOW_DECODE;
607            cfg_radio_csb_high  <= `RADIO_CSB_HIGH_DECODE;
608            cfg_radio_en_low    <= `RADIO_EN_LOW_DECODE;
609            cfg_radio_en_high   <= `RADIO_EN_HIGH_DECODE;
610
611            cfg_logic_csb_low   <= `LOGIC_CSB_LOW_DECODE;
612            cfg_logic_csb_high  <= `LOGIC_CSB_HIGH_DECODE;
613            cfg_logic_en_low    <= `LOGIC_EN_LOW_DECODE;
614            cfg_logic_en_high   <= `LOGIC_EN_HIGH_DECODE;
615        end
616
617    end
618
619end
620
621
622
623always @ (posedge sys_clk)
624begin
625    if   (srl_shift) cfg_radio_dat_out <=  srl_radio_q [0];
626    else             cfg_radio_dat_out <=  cfg_radio_dat_out; 
627
628    cfg_radio_csb_out <=  cfg_radio_csb_out & ~cfg_radio_csb_low
629                      | ~cfg_radio_csb_out &  cfg_radio_csb_high;
630    cfg_radio_en_out  <=  cfg_radio_en_out  & ~cfg_radio_en_low
631                      | ~cfg_radio_en_out  &  cfg_radio_en_high;
632    cfg_radio_clk_out <=  cfg_radio_clk_out & ~cfg_clk_low
633                      | ~cfg_radio_clk_out &  cfg_clk_high;
634
635    if   (srl_shift) cfg_logic_dat_out <=  srl_logic_q [0];
636    else             cfg_logic_dat_out <=  cfg_logic_dat_out;
637
638    cfg_logic_csb_out <=  cfg_logic_csb_out & ~cfg_logic_csb_low
639                      | ~cfg_logic_csb_out &  cfg_logic_csb_high;
640    cfg_logic_en_out  <=  cfg_logic_en_out  & ~cfg_logic_en_low
641                      | ~cfg_logic_en_out  &  cfg_logic_en_high;
642    cfg_logic_clk_out <=  cfg_logic_clk_out & ~cfg_clk_low
643                      | ~cfg_logic_clk_out &  cfg_clk_high;
644end
645
646endmodule
Note: See TracBrowser for help on using the repository browser.