GAL-Programmering med WinCUPL 2015


Programmering af Gal-kredse
Version
23/11-2015
Programmering af GAL-kredse.
Bemærk: Kredsene kan kun klare 5 Volt !!! også på indgangene !!
Derfor skal de kredse, der styrer GAL-kredsen også arbejde på 5 Volt !!!
GAL-kredse er en type IC-kredse, der indeholder et stort antal GATEs og Flip-Flops, men de enkelte dele i kredsen er ikke forbundne med hinanden. Forbindelserne opstår først efter en programmering, ud fra boolske ligninger.
Til at skrive og definere de boolske ligninger, og oversætte dem til anvendelig kode, dvs. kompilere
dem, kan programmet WinCUPL bruges.
Vha. programmet kan man navngive indgange og udgange i IC’en, og fx angive boolske ligninger
for udgangene.
WinCUPL er et ret gammelt program, - gad vide, om det kører på de nye Windows – OS ??
Jeg skrev i september 2015 til Lattice for evt. nyt program: 2 Svar følger:
Hi Valle
The GAL16V8’s are discontinued although you can still find them for sale in the market.
The starting point these days tends to be a small CPLD such as the ispMach4000 family.
There is a free downloadable package on our web site that you can install on PCs which still supports the
GAL16V8. It’s called the ispLEVER Classic license.
http://www.latticesemi.com/en/Support/Licensing.aspx#classic
Hope your students will benefit.
Best Regards
Michael
Hello Thoro
Lattice tries to support future designers by giving free access to many of our software.
Af: Valle Thorø
Side 1 af 20

Programmering af Gal-kredse
Version
23/11-2015
I would recommend you and your students download the free Lattice IspLever Clasisc software
http://www.latticesemi.com/en/Products/DesignSoftwareAndIP/FPGAandLDS/ispLEVERClassic.aspx#_D6D0016A58E549558DD2219C2649E1D8
IspLeverClassic supports the old GAL16V8s but also more complex cplds that allow students to understand PLL’s and memory components as
used in programmable logic.
It still supports Abel entry( similar to CupL) but also the more common Vhdl and Verilog lannguage( and Schematic). It incorporate SynplicityPro
synthesis tool as part of the free package.
You will need to create a Latticesemi.com account (free to anyone) to be able to download the software. We only need the PCs NIC or MAC
address to generate a free license.
Adam Clarkson
Strategic Account Manager Europe
Lattice Semiconductor UK Ltd
3000 Cathedral Hill
Guildford
Surrey GU2 7YB
Vha. programmet WinCUPL kan man navngive indgange og udgange i IC’en, og angive boolske
ligninger for udgangene.
Når de boolske ligninger er defineret, kan WinCUPL oversætte kildeteksten, og generere en fil, der
derefter skal flyttes over i – eller brændes ind i GAL-kredsen,
Filen kaldes også en ” Fuse-map-fil ”. Det er en standardiseret fil efter JEDEC-organisationen, og
filen får efternavnet ***.JED.
WinCUPL-programmet kan hentes på min hjemmeside.
/Elektronik / GAL. http://vthoroe.dk/elektronik.htm#Gal
Eller fra Atmels hjemmeside: http://www.atmel.com/products/microcontrollers/default.aspx
Søg efter ”WinCupl”
Under installeringen spørges efter et serienummer. Her kan bruges 60008009, eller 66999998.
/ Valle
Af: Valle Thorø
Side 2 af 20

Programmering af Gal-kredse
Version
23/11-2015
Programmerbare kredse som fx GAL har ikke fra starten nogle indbyggede funktioner – som fx.
NAND-gates, OR-gates osv. Men de har et hav af indbyggede muligheder og ledninger, der bare
endnu ikke er forbundne. Det er disse forbindelser, der skabes ved programmering.
Via programmering kan man definere output til fx at være et boolsk udtryk med forskellige indgange som variable.
Et eksempel er vis her til højre!
Output X og Y følger ligningerne:
X=AB+C
Y  AB  C
De lilla punkter skal forstås som vist her til
højre: And-gatene har 3 input.
Her er vist en skitse af, hvordan de forskellige forbindelser i
kredsen i princippet laves.
I tidligere udgaver var alle forbindelser intakte, men ved
programmering ødelagde man de forbindelser, der ikke
skulle bruges. Det skete ved at tilføre en ”stor” strøm, så
forbindelserne smeltede, ligesom en ”sikring smeltes”, ved
for stor strøm!!
Men udviklingen har betydet, at det i dag reelt set er en form
for switch, der sørger for forbindelserne, hvor det ønskes.
Derfor kan GAL-kredse i dag både slettes og re-programme- En ”Fuse” smeltes !!
res mange gange.
Programmerede kredse kan fungere mere end 20 år.
Programmeringen sker via specielt brænderudstyr.
Af: Valle Thorø
Side 3 af 20

Programmering af Gal-kredse
Version
23/11-2015
Endnu et eksempel på etablering af boolske ligninger i kredsen:
De fleste brændere skal bruge en “fuse” informationsfil, en såkaldt Fusemap, en JEDEC-fil, med
extension ”.JED”
GALs er forbogstaverne for Generic Array Logic devices. ( Vist nok ”Generel” Array Logic ? )
Her er vist hvordan GAL-kredse nummereres.
GAL-kredse er meget fleksible kredse. De kan programmeres til på samme chip at udgøre både
kombinatorisk logik, fx AND, OR, NAND osv., og registeret logik-funktioner, som bruges i tællere,
skifteregistere, osv. Det vil sige, der kan laves enten simple boolske udtryk, eller der kan designes
tællere vha. de indbyggede D-FF.
GAL-kredse er hurtige, med propagation delays ned til så kort som 7 ns. De kan måle sig med standard 7400 og 74LS serierne. De kan programmeres gentagne gange, op til 100 gange. Sletning og
programmering tager kun få sekunder.
Der findes flere typer af GAL-kredse. Denne tekst dækker typerne GAL16V8 ( og GAL20V8 ).
GAL16V8 har stel på pin 10, og +5 volt (VCC) på pin 20. Pin 12 til 19 er hver især forbundet til en
Output Logic Macro Cells (OLMC).
OLMC’en tillader output-pins at blive brugt som inputs, kombinatorial outputs, registered outputs
og input/output pins.
Af: Valle Thorø
Side 4 af 20

Programmering af Gal-kredse
Version
23/11-2015
Pin 2 til 9 er altid ”general purpose” input pins. Hvis en af OLMC’ cellerne er konfigureret som registered output, er pin 1 Clock input og pin 11 er Output Enable for register-outputs.
Hvis ingen af OLMC’erne bruges, er pin 1 og 11 general purpose inputs.
GAL16V8 Pin-outline:
20V8 har et lignende design. Hovedforskellen
fra 16V8 er at der er flere inputs / outputs.
GAL16V8
Her er vist et blokdiagram over kredsen, taget
fra databladet for GAL16V8D.
I venstre side ses det programmerbare AND-array. I højre side er ”OUTPUT LOGIC MACRO
CELLERNE” kaldet OLMC vist.
Herunder er der zoomet lidt mere ind, så ANDarrayet til venstre for én af OLMC-cellerne kan
ses.
Af: Valle Thorø
Side 5 af 20
Programmering af Gal-kredse

Version
23/11-2015
Skal en udgang “blot” være beskrevet vha. en boolsk ligning, bruges OLMC’erne ikke !!
Konfigurationsmuligheder for OLMC’erne
Macrocellerne kan ( ved programmering ) konfigureres til forskellige “udseender”.
Her ses et blokdiagram for en Output Logic Macrocell fra kredsene GAL16V8,
GAL18V10 eller GAL22V10
I midten ses en D-FlipFlop. Og til højre for den en Multiplexer. Heraf indses, at outputtet kan vælges direkte fra And / OR-arrayet, evt. inverteret, eller fra Q eller inverteret Q fra D-FFén.
Endvidere ses, at outputtet kan tages tilbage til And / OR-arrayet.
Det er endvidere muligt at tilgå Asynkron Reset og Synkron Preset på D-FFérne.
Skal D-FF’en bruges, skal man skrive ligning til ”Output_name.d”
Tilsvarende til D-FF’ens øvrige indgange.
Brugbare ekstensions for g22v10 og g16v8 er:
.AR
/* Asynkron Reset af flip-flop */
.SP
/* Synkron Preset af flip-flop */
.OE
/* Output Enable */
.D
/* D input for D-type flip-flop */
Se evt:
http://www.rexfisher.com/Downloads/CUPL%20Tutorial.htm
Af: Valle Thorø
Side 6 af 20

Programmering af Gal-kredse
Version
23/11-2015
WinCUPL Sproget
Windows Universal Compiler for Programmable Logic (CUPL),
Programmet WINCUPL bruges til at designe GAL-kredse, og generere en JEDEC-fil ( *.JED ) der
så skal brændes over i kredsen.
OBS. Vigtigt. Undlad altid at bruge æ, ø og å i amerikanske programmer. Dette gælder i stinavne, i
tekst, der skrives ind i programmet, ja selv i kommentarer !!
Start WinCUPL.
WinCUPL Main window.
Start et nyt projekt.
File / New Project
Herefter hjælper programmet med at kreere en
del af kildeteksten, dvs. program-hoved og dele
af teksten i Body.
Men man kan også selv skrive “hovedet” i
kilde-filen.
Indtast fx det viste i felterne.
Husk at angive Device-typen !!!!
Indtast antal inputs, og Tryk OK
Skal der bruges 4 inputs på den færdige
GAL, skrives 4.
Af: Valle Thorø
Side 7 af 20

Programmering af Gal-kredse
Version
23/11-2015
Og antal outputs.
Indtast antal ønskede outputs.
Pinnodes kan opfattes som outputs, der
ikke er ført ud til en pin. Dette kan ikke
bruges i 16V8.
Vælg derfor 0.
”In Gal16V8, there are no buried nodes.”
Nu genererer WINCUPL en ”dum” tekstside med fx følgende tekst allerede skrevet. Dvs. de ovenstående 3 indtastninger blot fører til lidt hjælp til at generere noget af kildeteksten til designet.
Der skal nu angives sammenhørende pin-numre og navne, dvs. Labels.
Og der skal skrives ligninger for outputs.
Her ses et design-start, hvor der er valgt 3 inputs og 2 outputs.
Af: Valle Thorø
Side 8 af 20

Programmering af Gal-kredse
Version
23/11-2015
/* og */ omkranser kommentarer. Kommentarerne kan strække sig over flere linjer.
Ovenfor ses, at teksten er opdelt i 3 dele. De kan kaldes følgende:
En Header-del
Her defineres forskellige data, fx firma, programmør, og IC-navn.
En Declaration-del
Her defineres inputs og outputs med navne, fx A, B osv.
En Body-del
Her defineres de boolske ligninger for output.
( ikke vist herover )
Delene er blot adskilt i teksten af en kommentarlinje.
Definering af Input pin navne:
For at der kan skrives boolske ligninger for outputs, skal IC’ens pinnumre altid have tildelt et navn,
fx et bogstav.
Her følger et par eksempler på tildeling af navne til pins:
/*** INPUT PINS ***/
PIN 1 = A ;
Af: Valle Thorø
/* Pin 1 får navnet A */
Side 9 af 20

Programmering af Gal-kredse
Version
23/11-2015
PIN 2 = B ;
/* her evt. kommentarer */
PIN [2..5] = [B3..0];
PIN [2..6] = [A0..2,A4,A5];
Pin [2..5] = [b, c, d, e]; /* pin 2=b, pin 3=c, pin 4=d, pin5=e*/
Pin [6,10] = [f,g];
/* pin 6 = f og pin 10 = g.*/
Bemærk: Hver linje afsluttes med semikolon.
Definering af Output pin navne
Også Outputs skal defineres med navne:
Eksempler på tildeling af output pinnavne:
/*** OUTPUT PINS ***/
PIN 12 = F1;
PIN [12,19] = [F1..2] ;
( pin 12 skal hedde F1, pin 19 F2 )
PIN [13,14,15,16,17,18] = [Y0,Y1,Y2,Y3,Y4,Y5];
PIN [13..18] = [Y5..0];
Hver statement-linje skal slutte med et semi-colon (;).
OUTPUT-Ligninger:
/** Equations **/
Når inputs og outputs er defineret, kan der i sektionen « Equations » indskrives boolske ligninger
for outputs = f(inputs) :
Bemærk de specielle tegn, der bruges i WinCUPL for and, or, og inverter, osv.
Eksempler :
Y0 = A0 & B0;
Y1 = A1 # B1;
Y2 = A2 $ B2;
Y3 = !B3;
Y4 = !(A4 & B4);
Y5 = !(A5 # B5);
Af: Valle Thorø
Side 10 af 20
Programmering af Gal-kredse

Version
23/11-2015
A = !x&y # x&!y&z;
B = !x&!y&!z # x&!y # y&z;
I WINCUPL bruges følgende symboler for at beskrive ligninger osv. Herudover kan bruges parenteser.
Operator
Example
Description
!
&
#
$
!A
A&B
A#B
A$B
NOT
AND
OR
XOR
“Værdien” eller ” Størst kompetence” af operatorerne er angivet i flg. skema:
Operator
!
&
#
$
Example
!A
A&B
A#B
A$B
Description
NOT
AND
OR
XOR
Precedence
1
2
3
4
Her er et færdigt eksempel, taget fra et af de medfølgende eksempler i WinCUPL-programmet:
Name
Partno
Revision
Date
Designer
Company
Location
Assembly
Device
Gates;
CA0001;
04;
9/12/89;
G. Woolhiser;
Logical Devices, Inc.;
None;
None;
g16v8a;
/****************************************************************/
/*
*/
/*
This is a example to demonstrate how CUPL
*/
/*
compiles simple gates.
*/
/*
*/
/****************************************************************/
/*
* Inputs:
*/
Pin 2 =
Pin 3 =
define inputs to build simple gates from
a;
b;
/*
* Outputs:
*
*/
define outputs as active HI levels
Pin 12 = inva;
Pin 13 = invb;
Af: Valle Thorø
Side 11 af 20
Programmering af Gal-kredse

Pin
Pin
Pin
Pin
Pin
Pin
14
15
16
17
18
19
=
=
=
=
=
=
and;
nand;
or;
nor;
xor;
xnor;
/*
* Logic:
*/
inva
invb
and
nand
or
nor
xor
xnor
=
=
=
=
=
=
=
=
Version
23/11-2015
!a;
!b;
a &
!(a
a #
!(a
a $
!(a
Af: Valle Thorø
examples of simple gates expressed in CUPL
/* inverters */
b;
& b);
b;
# b);
b;
$ b);
/*
/*
/*
/*
/*
/*
and gate */
nand gate */
or gate */
nor gate */
exclusive or gate */
exclusive nor gate */
Side 12 af 20

Programmering af Gal-kredse
Version
23/11-2015
Compilerings-procedure af et design:
For at få kompileringen af kildefilen til en .JED-fil til at virke, er der et par switche, der skal sættes:
Først skal sikres, at der er angivet hvilken kreds, der arbejdes med. Den kreds, vi har er en
GAL16V8.
Der er 2 måder, dette kan angives. Enten i kildeteksten i header'en, under device.
Device
g16v8a;
Eller det kan alternativt angives ved at vælge
Option \ Devices
Vælg en ATF16V8B, som svarer til en
GAL16V8
Bruges denne metode, skal fluebenet
for neden i ”Device In File” fjernes!
Det er tillige nødvendigt at gå ind i menuen
Option / Compiler.
Af: Valle Thorø
Side 13 af 20

Programmering af Gal-kredse
Version
23/11-2015
Her vises Default fanebladet ”Output Files”
Vælg fanebladet General og sæt flueben i
JEDEC name = PLD name.
Ellers bliver der ikke genereret en .JED-fil.
Nu kan der Compileres.
Vælg Run \ Device Dependent Compile.
Herefter skulle der gerne være skabt en .Jed fil, som så skal brændes over i GAL-kredsen.
Af: Valle Thorø
Side 14 af 20

Programmering af Gal-kredse
Version
23/11-2015
Er der fejl, vil de være listet i LST-filen.
( og evt. i en .DOC-fil )
Eller se i / Windows / Message-vinduet
.JED-filen kan nu flyttes til brænderudstyret, - og brændes over i GAL-kredsen.
JEDEC filen kaldes også for en 'fuse map'-fil.
Simulering af det design, man har lavet.
I WinCUPL er det muligt, at simulere sine ligninger. Men det er ret besværlig. Det springer vi over!
Brænding af GAL16V8
Til at brænde Jedec-filen over i GAL-kredsen, bruger vi et specielt brænderudstyr. Det er samme
brænder, Leaper 48, der bruges til at programmere Microcontrollere.
Skærmbilledet for brænderen ser
således ud:
Til brænderen hører en mængde
drivere, en til hver type programmerbar kreds, den kan håndtere.
Den rigtige driver vælges ved at
klikke på ”Type”.
Af: Valle Thorø
Side 15 af 20

Programmering af Gal-kredse
Version
23/11-2015
Der vælges
Lattic / GAL16V8D(DIP).
Når den rigtige driver er læst ind, kan Jedec-filen læses ind. Vælg ”Load”, og find filen. Den hedder
xxx.JED.
I brænderprogrammet er der
mulighed for at editere i fusemappen.
Men det skal man nok lade
være med !!
Her er vist lidt af fuse-mappen.
Den GAL-kreds, der ønskes programmeret, isættes brænderudstyret, som vist på skitsen på udstyret.
Herefter kan der brændes, med den grønne pil.
Efter brænding kan kredsen afprøves. Husk, det kun er en 5-volts kreds.
/****************************************************************/
Opgave til test programmeringen af en GAL-kreds.
Kald 3 indgange A, B og C.
Kald 3 udgange for Q1, Q2 og Q3.
Konfigurer kredsen så:
𝑄1 = 𝐴 ∙ 𝐵 ∙ 𝐶,
𝑄2 = 𝐴 + 𝐵 + 𝐶
𝑄3 = ̅̅̅̅̅̅̅̅̅̅
𝐴∙𝐵∙𝐶
Binær til 7-segment-decoder
Af: Valle Thorø
Side 16 af 20

Programmering af Gal-kredse
Version
23/11-2015
Design en GAL-kreds, så den fungerer som en binær-til-7-segment-dekoder, der kan vise Hex,
dvs. fra 0 til 9 og A til F.
Stepmotor – styring
Design en GAL-kreds, som enten kan føre 4 udgange fra en 4017 direkte til en forstærkerblok
( dvs. de 4 transistorer ) eller hvis en indgang kalder DIR bliver høj vha. en switch, få motoren til
at køre modsat vej rundt.
Ekstraopgave:
Design en GAL-kreds med indbygget sekvensgenerator til at styre en stepmotor. Herved kan man
spare tælleren 4017!
Der skal både være indgang til Reset, og til Direction.
Diagrammet kunne se således ud:
Af: Valle Thorø
Side 17 af 20
Programmering af Gal-kredse

Version
23/11-2015
Reset
Macrocelle
B
2
2
3
4
1
2
1
3
1
A.d
A
Udgang_A
2
D
1
3
Dir
2
1
Reset
C
2
2
1
2
1
2
3
1
1
B.d
B
1
C.d
C
1
D.d
D
3
Udgang_B
3
2
A
1
3
Dir
2
1
2
1
Reset
D
2
2
1
2
3
1
3
Udgang_C
3
2
B
1
3
Dir
2
1
2
1
Reset
A
2
2
1
2
3
1
3
Udgang_D
3
C
Dir
2
1
3
Tegning 130412 P3
Husk at ben 11 /OE skal stelles!
Overvej Clocksignalet!
Af: Valle Thorø
Side 18 af 20
Programmering af Gal-kredse

Version
23/11-2015
Kode til at styre en stepmotorer, hvor GAL-kredsen selv genererer sekvensen. Med reset, og direction-input!
Bemærk, at pin 1 er permanent clock, & Pin 11 er /(OE)
Device
g16v8 ;
/* *************** INPUT PINS *********************/
Pin 1 = clk ;
PIN 2
= Dir ;
PIN 3
= Res ;
/* *************** OUTPUT PINS *********************/
PIN
PIN
PIN
PIN
18
13
14
15
=
=
=
=
A ;
B ;
C;
D;
/* *************** Equations *********************/
A.d
B.d
C.d
D.d
=
=
=
=
D&Dir # B&!Dir # Res;
(A&Dir # C&!Dir) & !Res ;
(B&Dir # D&!Dir) & !Res ;
(C&Dir # A &!Dir) & !Res ; /*
/*
Husk, at ben 11 skal stelles */
For at resette */
Et andet eksempel, ikke testet !!!
/* *************** INPUT PINS *********************/
Pin 1 = clk ;
PIN 2
=
Dir
;
PIN 4 = R ; /* Reset */
/* *************** OUTPUT PINS *********************/
PIN 12
= A
;
PIN 13
= B
;
PIN 14
= C
;
PIN 15
= D
;
A.d
B.d
C.d
D.d
=
=
=
=
D&Dir
A&Dir
B&Dir
C&Dir
AR = R ;
/*
Af: Valle Thorø
#
#
#
#
B&!Dir
C&!Dir;
D&!Dir;
A&!Dir;
Asyncron Reset */
Side 19 af 20

SP = !R ; /*
/*
Programmering af Gal-kredse
Version
23/11-2015
Syncron Preset */
Husk, at ben 11 skal stelles */
Af: Valle Thorø
Side 20 af 20