'================================================== ' 15-25 MHz Fractional-N Frequency Synthesizer ' JAM STAPL ' http://www.holmea.demon.co.uk/Frac2/Main.htm ' ' Usage: jam [switches] Data.jam ' Switches: ' -dm= Reference divider, default=100 ' -df= Frequency Hz, default=19900000 ' ' e.g. jam -dm=104 -df=17001000 Data.jam ' ''''''''''''''''''''''''''''''''''''''''''''''''''' ' Boundary scan register - pin offsets from BSDL file INTEGER pin_d[8] = 201, 207, 210, 213, 216, 222, 228, 234; INTEGER pin_a[8] = 195, 192, 189, 183, 177, 171, 165, 162; INTEGER pin_m[5] = 141, 132, 126, 120, 108; INTEGER pin_oeh = 240; INTEGER pin_oel = 231; INTEGER pin_we = 249; INTEGER pin_cs = 255; INTEGER pin_trig = 102; ''''''''''''''''''''''''''''''''''''''''''''''''''' ' JTAG Commands BOOLEAN sample[10] = BIN 1010101000; BOOLEAN extest[10] = BIN 0000000000; ''''''''''''''''''''''''''''''''''''''''''''''''''' ' Defaults (overridden by command line) INTEGER f = 19900000; ' VCO Frequency (Hz) INTEGER m = 100; ' Reference divider ratio INTEGER r = 10000000; ' XTAL Frequency (Hz) ''''''''''''''''''''''''''''''''''''''''''''''''''' BOOLEAN bs[288]; INTEGER data; INTEGER addr; INTEGER mask; INTEGER i; INTEGER j; INTEGER fm; INTEGER n; INTEGER c[4]; ''''''''''''''''''''''''''''''''''''''''''''''''''' ' Calculate N.F programming command ' Scaling factors (2 and 128) avoid 32-bit integer overflow LET fm = f*(m/2); LET n = fm/(r/2); LET fm = (256/128) * 2 * (fm % (r/2)); LET c[3] = fm/(r/128); LET fm = 256 * (fm % (r/128)); LET c[2] = fm/(r/128); LET fm = 256 * (fm % (r/128)); LET c[1] = fm/(r/128); LET fm = 256 * (fm % (r/128)); LET c[0] = fm/(r/128); PRINT n; PRINT c[3]; PRINT c[2]; PRINT c[1]; PRINT c[0]; ''''''''''''''''''''''''''''''''''''''''''''''''''' ' Initialise state machine; load BSR STATE RESET; IRSCAN 10, sample[0..9]; DRSCAN 288, bs[0..287], CAPTURE bs[0..287]; STATE RESET; IRSCAN 10, extest[0..9]; ''''''''''''''''''''''''''''''''''''''''''''''''''' ' Set output enables LET bs[pin_we+1] = 1; LET bs[pin_cs+1] = 1; LET bs[pin_oeh+1] = 1; LET bs[pin_oel+1] = 1; FOR i=0 TO 7; LET bs[pin_a[i]+1] = 1; LET bs[pin_d[i]+1] = 1; NEXT i; LET bs[pin_trig+1] = 1; LET bs[pin_m[0]+1] = 1; LET bs[pin_m[1]+1] = 1; LET bs[pin_m[2]+1] = 1; LET bs[pin_m[3]+1] = 1; LET bs[pin_m[4]+1] = 1; ''''''''''''''''''''''''''''''''''''''''''''''''''' ' Assert CS, WE and TRIG; release OE LET bs[pin_cs+2] = 0; LET bs[pin_oeh+2] = 1; LET bs[pin_oel+2] = 1; LET bs[pin_we+2] = 0; LET bs[pin_trig+2] = 0; ''''''''''''''''''''''''''''''''''''''''''''''''''' ' Data for reference divider latch M LET bs[pin_m[0]+2] = ((m-66) & 2) == 2; LET bs[pin_m[1]+2] = ((m-66) & 4) == 4; LET bs[pin_m[2]+2] = ((m-66) & 8) == 8; LET bs[pin_m[3]+2] = ((m-66) & 16) == 16; LET bs[pin_m[4]+2] = ((m-66) & 32) == 32; ''''''''''''''''''''''''''''''''''''''''''''''''''' ' Load MASH LET addr = 0; LET data = c[0]; CALL Poke; ' 00 LET data = 1; CALL Poke; ' 01 LET data = 0; CALL Poke; ' 02 LET data = 0; CALL Poke; ' 03 LET data = 0; CALL Poke; ' 04 LET data = c[1]; CALL Poke; ' 05 LET data = 0; CALL Poke; ' 06 LET data = 0; CALL Poke; ' 07 LET data = 0; CALL Poke; ' 08 LET data = 0; CALL Poke; ' 09 LET data = c[2]; CALL Poke; ' 10 LET data = 0; CALL Poke; ' 11 LET data = 0; CALL Poke; ' 12 LET data = 0; CALL Poke; ' 13 LET data = 0; CALL Poke; ' 14 LET data = c[3]; CALL Poke; ' 15 LET data = 0; CALL Poke; ' 16 LET data = 0; CALL Poke; ' 17 LET data = 0; CALL Poke; ' 18 LET data = 0; CALL Poke; ' 19 LET data = n-2; CALL Poke; ' 20 ''''''''''''''''''''''''''''''''''''''''''''''''''' ' Load stored program LET addr = 128; LET data = 0; CALL Poke; ' LDA 0 LET data = 97; CALL Poke; ' ADD 1 LET data = 33; CALL Poke; ' STA 1 LET data = 98; CALL Poke; ' ADD 2 LET data = 34; CALL Poke; ' STA 2 LET data = 99; CALL Poke; ' ADD 3 LET data = 35; CALL Poke; ' STA 3 LET data = 100; CALL Poke; ' ADD 4 LET data = 36; CALL Poke; ' STA 4 LET data = 5; CALL Poke; ' LDA 5 LET data = 70; CALL Poke; ' ADC 6 LET data = 38; CALL Poke; ' STA 6 LET data = 71; CALL Poke; ' ADC 7 LET data = 39; CALL Poke; ' STA 7 LET data = 72; CALL Poke; ' ADC 8 LET data = 40; CALL Poke; ' STA 8 LET data = 73; CALL Poke; ' ADC 9 LET data = 41; CALL Poke; ' STA 9 LET data = 10; CALL Poke; ' LDA 10 LET data = 75; CALL Poke; ' ADC 11 LET data = 43; CALL Poke; ' STA 11 LET data = 76; CALL Poke; ' ADC 12 LET data = 44; CALL Poke; ' STA 12 LET data = 77; CALL Poke; ' ADC 13 LET data = 45; CALL Poke; ' STA 13 LET data = 78; CALL Poke; ' ADC 14 LET data = 46; CALL Poke; ' STA 14 LET data = 15; CALL Poke; ' LDA 15 LET data = 80; CALL Poke; ' ADC 16 LET data = 48; CALL Poke; ' STA 16 LET data = 81; CALL Poke; ' ADC 17 LET data = 49; CALL Poke; ' STA 17 LET data = 82; CALL Poke; ' ADC 18 LET data = 50; CALL Poke; ' STA 18 LET data = 83; CALL Poke; ' ADC 19 LET data = 51; CALL Poke; ' STA 19 LET data = 22; CALL Poke; ' LDA 22 LET data = 57; CALL Poke; ' STA 25 LET data = 26; CALL Poke; ' LDA 26 LET data = 60; CALL Poke; ' STA 28 LET data = 23; CALL Poke; ' LDA 23 LET data = 58; CALL Poke; ' STA 26 LET data = 29; CALL Poke; ' LDA 29 LET data = 62; CALL Poke; ' STA 30 LET data = 27; CALL Poke; ' LDA 27 LET data = 61; CALL Poke; ' STA 29 LET data = 24; CALL Poke; ' LDA 24 LET data = 59; CALL Poke; ' STA 27 LET data = 160; CALL Poke; ' ROT LET data = 53; CALL Poke; ' STA 21 LET data = 160; CALL Poke; ' ROT LET data = 54; CALL Poke; ' STA 22 LET data = 160; CALL Poke; ' ROT LET data = 55; CALL Poke; ' STA 23 LET data = 160; CALL Poke; ' ROT LET data = 56; CALL Poke; ' STA 24 LET data = 20; CALL Poke; ' LDA 20 LET data = 117; CALL Poke; ' ADD 21 LET data = 118; CALL Poke; ' ADD 22 LET data = 119; CALL Poke; ' ADD 23 LET data = 120; CALL Poke; ' ADD 24 LET data = 153; CALL Poke; ' SUB 25 LET data = 154; CALL Poke; ' SUB 26 LET data = 154; CALL Poke; ' SUB 26 LET data = 155; CALL Poke; ' SUB 27 LET data = 155; CALL Poke; ' SUB 27 LET data = 155; CALL Poke; ' SUB 27 LET data = 124; CALL Poke; ' ADD 28 LET data = 125; CALL Poke; ' ADD 29 LET data = 125; CALL Poke; ' ADD 29 LET data = 125; CALL Poke; ' ADD 29 LET data = 158; CALL Poke; ' SUB 30 LET data = 192; CALL Poke; ' END EXIT (0); ''''''''''''''''''''''''''''''''''''''''''''''''''' Poke: LET mask = 1; FOR i=0 TO 7; LET bs[pin_a[i]+2] = (addr & mask) == mask; LET bs[pin_d[i]+2] = (data & mask) == mask; LET mask = mask << 1; NEXT i; DRSCAN 288, bs[0..287]; LET addr = addr + 1; RETURN;