CON ' Clock modes ' %0000_000e_dddddd_mmmmmmmmmm_pppp_cc_ss ' enable oscillator XOSC = %10 ' OSC ' %00=OFF, %01=OSC, %10=15pF, %11=30pF XSEL = %11 ' XI+PLL ' %00=rcfast(20+MHz), %01=rcslow(~20KHz), %10=XI(5ms), %11=XI+PLL(10ms) XPPPP = ((XDIVP>>1) + 15) & $F ' 1->15, 2->0, 4->1, 6->2...30->14 ' CLOCKFREQ = round(float(XTALFREQ) / float(XDIV) * float(XMUL) / float(XDIVP)) XTALFREQ = 20_000_000 'PLL stage 0: crystal frequency XDIV = 2 'PLL stage 1: crystal divider (1..64) XMUL = 18 'PLL stage 2: crystal / div * mul (1..1024) XDIVP = 1 'PLL stage 3: crystal / div * mul / divp (1,2,4,6..30) COGS_TO_BURN = 8 BURN_TYPE = 3 dat org 0 hubset clk_mode 'setup PLL mode for new frequency (still operating at RCFAST) waitx ##25_000_000/100 '~10ms (at RCFAST) for PLL to stabilise or clk_mode, #XSEL 'add PLL as the clock source select hubset clk_mode 'engage! Switch to newly set PLL ' hubset #0 'RCFAST (~20 MHz) ' hubset #1 'RCSLOW (~20 KHz) mov pa, #7 .launch1 cogstop pa djnz pa, #.launch1 dirl #56 wrpin #%01_00110_0, #56 'smartpin NCO frequency mode wxpin #500, #56 'sysclock/1000 to monitor PLL frequency as die heats wypin ##$8000_0000, #56 mov pa, #(COGS_TO_BURN - 1) .launch2 coginit pa, #@cog_burn djnf pa, #.launch2 cogstop #0 clk_mode long 1<<24 | (XDIV-1)<<18 | (XMUL-1)<<8 | XPPPP<<4 | XOSC<<2 org 0 cog_burn mov ptra, #BURN_TYPE djz ptra, #program1 djz ptra, #program2 djz ptra, #program3 sub ptra, #1 wz if_z jmp #program4 sub ptra, #1 wz if_z jmp #program5 program0 .loop jmp #.loop program1 .loop waitx #500 jmp #.loop program3 'Fill 64 kB block with random data waitx #500 wrfast #0, #0 rep @.rend, ##(64*1024/4) '64 kB random hubRAM data getrnd pa wflong pa .rend 'Silicon Rev A/B detect ' mov pa, ptra ' rdlut inb, ptra++ ' cmp ptra, pa wz 'Rev A PTRA remains unchanged (Z = 1) mov pa, #1 xoro32 pa 'revA (D = $42a01290 S = $50ad0021), revB (D = $84908405 S = $62690201) mov pa, 0-0 cmp pa, ##$50ad0021 wz 'Continuously burst, every clock cycle, reading of the random data rdfast ##(64*1024/64), #0 '64 kB block rollover if_z xinit ##(%0011_0000_1000_0001<<16) | $ffff, #0 'revA silicon, full sysclock/1 continuous FIFO reading if_nz xinit ##(%1011_0000_1000_0001<<16) | $ffff, #0 'revB silicon, full sysclock/1 continuous FIFO reading program2 'Continuously loop, filling every cordic pipeline slot with random data dirh #56 rep #4, #0 'loop forever burning the cordic getrnd pa qmul pb, pa add pb, pa mul pb, pa orgh $400 program4 .loop nop nop nop nop nop jmp #.loop program5 .loop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop jmp #.loop