Forum: FPGA, VHDL & Co. GAL: Decoder 8Bit/3xBCD


von Camel (Gast)


Lesenswert?

Hi,

ich muss aus einem 8-Bit Signal (0-255) 3x BCD Code gewinnen. Ich muss 
jede Stelle auf eine 7-Segment Anzeige ausgeben.
Ich hatte in meiner Schaltung einen GAL 26CV12 vorgesehen und habe für 
diesen das Programm geschrieben. Beim Überprüfen habe ich festgestellt 
dass die Matrix zu klein ist und ich das Ergebnis der Wahrheitstabelle 
nicht nach außen bekomme!
Die Leiterplatte ist bis auf den GAL schon fertig und bestückt.

Könnt ihr mir irgendwie helfen dass nicht alles umsonst war?

Datenblatt:
http://chdist35.distrelec.com/distrelec/datasheets.nsf/WebAttachments/AF794273C798EFF6C12571B60053C4FB/$File/Serie%20GAL26xx-xx_e.pdf

Gruß Camel

PS: Im Anhang mein geschriebenes Programm!

von Andreas P. (andreas_p)


Lesenswert?

Camel du  hast das Programm vergessen.

welche Versorgung hat den dein GAL 5V oder 3,3V.
Und das Gehäuse ist so auch nicht klar und wieviele Pins du davon 
benutzt.

Hilft vielleicht auch eine Adapterplatine.

Gruß Andreas

PS Kopf hoch das passiert leider immer wieder das das CPLD FPGA 
hinterher
zu voll ist.

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Da hilft nur, alles zu Fuß zu optimieren. Die Pinbelegung am GAL hast Du 
auch schon fesatgelegt? Das dürfte das größte Problem sein. Die Eingänge 
sind nicht gleihwertig. Ich kenne den 26CV12 nicht, aber den 22V10 und 
die ähnlichen mit doppelter Flipflopzahl, 20 statt 10, bei gleicher 
Gatterzahl ( Atmel 7xx weiß nicht mehr genau oder auch GAL6001) habe ich 
schon benutzt.
8 Bit rein und 12 Bit raus, da ist ja kein Pin mehr übrig, das war schon 
gewagt.

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Zu Fuß heißt, 12 Karnaugh-Diagramme mit je 256 Feldern malen und 
zusehen, dass max. 8 Produktterme mit 8 Eingängen, 2 mit 10 und 2 mit 12 
herauskommen. Das ist reine Fleißarbeit. Welches Programm benutzt Du zur 
Optimierung? Kennt es genau den GAL-Typ?

von Falk (Gast)


Lesenswert?

@Camel

Warum nimmst du so ein Heizkraftwerk? Heute gints schicke CPLDs, die 
nahezu keinen Strom brauchen, in deinem Fall <1mA.

@Andreas Pi

Irrtum, es passiert im wesentlichen nur bei mangelnder Erfahrung, 
mangelnde Kenntnissen und schlechter Planung. So einen kleinen Decoder 
hätte man vorher schreiben und testen können. So what. Erfahrungswerte.

MfG
Falk

von Falk (Gast)


Lesenswert?

@ Christoph

Denkst du der GAL Compiler ist soo doof dass er nicht die KV-Diagramme 
optimieren kann?
Ausserdem braucht er für ein 8Bit auf 3xBCD nur 10 Ausgänge, denn die 
obere Stelle kann nur 0,1 oder zwei sein -> zwei Bit. Weiterhin bruacht 
er für das LSB der niederwertigsten Stelle keine Logik, die kann er 1:1 
verbinden (Siehe Datenblatt 74185).

MfG
Falk

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Genau diese Optimierungsmöglichkeiten wird der Compiler nicht kennen. 
Auch wenn er merkt, dass er 1:1 verbinden kann, wird er das LSB nicht 
komplett rauswerfen, sondern 2 Pins belegen, ebenso die oberen Bits. 
Vielleicht sind das genau die Resourcen, die fehlen um alles fitten zu 
können.
Ich würde jedenfalls mal die logischen Gleichungen anschauen, die der 
Compiler erzeugt hat. Bei dieser Komplexität ist das ja noch 
überschaubar.
Zu Fuß bringt eher noch was bei Statemachines, wenn man merkt, welches 
Ergebnisbit mit einem der State-Zählflipflops identisch sein kann, sowas 
kann der Compiler nicht entscheiden.

von Falk (Gast)


Lesenswert?

Na du bist mir vielleicht einer. ;-)

Der Compiler arbeitet LOGISCH, aber sicher nicht KREATIV. Wenn der 
Bastler/Entwickler für sowas IOs vorsieht, wird der Compiler sie kaum 
rauswerfen können. Er kann nur die recht einfache Schaltgleichung Y0 = 
X0 hinschreiben. Das sollte dann auffallen.

Ausserdem widersprichst du deinem vorhergehend Posting "zu Fuss bringt 
eher noch was bei Statemachines". Sagte ich doch.

MFG
Falk

von Camel (Gast)


Angehängte Dateien:

Lesenswert?

Hi@all,

ich melde mich auch mal wieder!
Also in der Tat, ich stehe noch am Anfang meiner GAL-Karriere.
- GAL26CV12 "fully compatible with 22V10" (siehe Datenblatt)
- Die Pinbelegung ist nicht so entscheidend, ich muss dann eben die 
Leitungen zur Anzeigenplatine vertauschen.
- Ich habe mir auch Überlegt alles mit KV-Diagrammen zu optimieren 
(gibts da n Tool?) aber das ändert ja nichts daran wie viele 
Produktterme herauskommen (vl. legdiglich an welchem Ausgang)
- Ich benutze ISPLever von Lattice da ich genau den GAL (wie aus dem 
Datenblatt oben) bestellt habe.
- keine Erfahrungen mit GALs (nur aus Berufsschule)
- Das mit den 10 Ausgängen hab ich mir auch schon überlegt, aber nicht 
zu Ende gedacht (mangelnde Kenntnis)
- Ich habe keine logischen Gleichungen, da ich das Programm mit 
Wahrheitstabelle und nicht mit Gleichungen geschrieben habe.

Meine Lösung:
Wenn man ausrechnen könnte wieviele Produktterme ich für den jeweiligen 
Ausgang brauche, könnte ichs ja so verteilen dass es passt. (wenns nicht 
reicht den 26CV12C der hat mehr Terme)

Hoffe auf alle Fragen eingegangen zu sein, dass die Fehlenden Infos da 
sind.
Danke für eure Hilfe bis hierher!

Gruß Camel

von Falk (Gast)


Lesenswert?

@Camel

Alles klar, eben halt typische Anfängerfehler. Haben wir alle mal 
gemacht.
Kein Beinbruch.

> - GAL26CV12 "fully compatible with 22V10" (siehe Datenblatt)

isser auch.

> - Die Pinbelegung ist nicht so entscheidend, ich muss dann eben die
> Leitungen zur Anzeigenplatine vertauschen.

genau

> - Ich habe mir auch Überlegt alles mit KV-Diagrammen zu optimieren

Als Übungsstunde für KV brauchbar, real aber eher sinnlos. Denn im 
Normalfall optimiert man nur Gleichungen mit 2 (zwei) Eingangsvariablen 
per Hand, bei mehr werden die Tabellen und das Verfahren arg 
kompliziert.
Der Compiler kann das wesentlich besser und einfacher. Man muss ihm nur 
gelegentlich auf die Sprünge helfen.

> (gibts da n Tool?) aber das ändert ja nichts daran wie viele

Ja, nennt sich Complier, entweder für Abel, Verilog, VHDL und 
wasweissich.
ISP ist dein Freund.

> - Ich habe keine logischen Gleichungen, da ich das Programm mit
> Wahrheitstabelle und nicht mit Gleichungen geschrieben habe.

Genau DAS ist ja der richtige Weg. Du gibts die Wahrheitstabelle ein, 
der Compiler macht boolsch minimierte Gleichungen draus. Das ist die 
richtige Anwendung einer HDL (Hardware Description Language).

Gib alles ein, lege ein Pinbelgeung fest, compilieren. Dann wird der 
Compiler irgenwann meckern, zu wenig Produkterme etc. Dann musst du 
wahrscheinlich ein paar Pins tauschen sowie an den Einstellungen für 
max. Anzahl Produktterme sowie anderer Parameter drehen. Man kann dem 
Compiler nämlich sagen, ob die Logik möglichst schnell sein soll (kostet 
viele Produkterme) oder möglichst ressourcensparend (ist halt 
langsamer). Dadurch kann man so manches Design noch reinquetschen. Been 
there, done that.

MFG
Falk


von Christoph Kessler (db1uq) (Gast)


Lesenswert?

So ein Compiler gibt als Zwischenergebnis die beiden minimierten 
Gleichungen aus, einmal normal und einmal mit invertiertem Ausgang. Das 
entspricht ungefähr den beiden KV-Diagramm-Verfahren für AND oder OR, 
das eine Mal alle Einsen zusammenfassen, das andere Mal alle Nullen.
Ein "Fitter " passt erst anschließend das Ergebnis an die spezielle 
Hardware an. Er nimmt den Term von beiden, der besser passt.
Die minimierten Gleichungen sind als Klartext in einer Textdatei lesbar, 
das war zumindest bei EasyAbel und Lattice-Synario der Fall, die ich vor 
etwa 10 Jahren benutzt habe.
Beim KV-Diagramm gibt es oft mehrere minimale Möglickeiten, ob der 
Compiler das auch berücksichtigt, hängt von seinen 
"Strategie"-Einstellungen ab.

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Man kann oft die Pinbelegung von Fitter festlegen lassen, dann findet er 
eher eine Lösung. Falls das Programm es zuläßt würde ich erst mal keine 
Vorgaben machen, das kann man hinerher immer noch ausprobieren.

von Camel (Gast)


Lesenswert?

Hallo,

habe mich jetzt nochmals damit beschäftigt!

Fehlermeldung:
Warning 4034: Unable to preserve preassignments - performing second pass 
without preassignments.
Note 4083: Signal 'D2_A' did not fit because
it had too many product terms.
Note 4083: Signal 'D1_D' did not fit because
it had too many product terms.
Note 4083: Signal 'D1_C' did not fit because
it had too many product terms.
Note 4083: Signal 'D1_B' did not fit because
it had too many product terms.
$DEVICE         p26cv12  nofit
$PINS   16  D1_A:27   D2_B:22   D2_C:26   D2_D:25   D3_A:24   D3_B:18 
D3_C:17
D3_D:16   DIO_08:9   DIO_07:8   DIO_06:6   DIO_05:5   DIO_04:4 
DIO_03:3
DIO_02:2   DIO_01:1
$UNASSIGNED    4  D1_B   D1_C   D1_D   D2_A
--------------------------------------------------------------

"Pre Fit Equations":
 P-Terms   Fan-in  Fan-out  Type  Name (attributes)
---------  ------  -------  ----  -----------------
   1/1        1        1    Pin   D1_A
  31/29       7        1    Pin   D2_A
   5/6        6        1    Pin   D3_A
  34/38       7        1    Pin   D1_B
  11/13       6        1    Pin   D2_B
   3/3        5        1    Pin   D3_B
  34/36       7        1    Pin   D1_C
   8/9        6        1    Pin   D2_C
   0/1        0        1    Pin   D3_C
  25/28       7        1    Pin   D1_D
   5/8        6        1    Pin   D2_D
   0/1        0        1    Pin   D3_D
=========
 157/173        Best P-Term Total: 155
                       Total Pins: 20
                      Total Nodes: 0
            Average P-Term/Output: 12

Was heisst die Zahl vor /, und was die Zahl danach?

MfG Camel

PS: Thx, for help again!

von Falk (Gast)


Lesenswert?

Das ist die

Anzahl benötigeter Produkterme / Anzahl verfügbarer Produkterme

Praktisch sollte die linke Zahl immer kleiner als die Rechte sein, sonst 
gehts nicht (logo).

Und der Compiler ist auch recht schlau und kreativ, er merkt dass für 
einige Signale wenig Produktterme gebaucht werden und ändert 
dementsprechend die Pin/Macrozellenbelegung. Und schwupps, schon passt 
es.

Allerdings musst du wohl die Pinbelegung ändern.

MfG
Falk

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Ich denke, das links sind die beiden Minterme nach 0 und 1 
zusammengefasst, wie geschrieben. Best total ist 155, also nimmt für 
31/29 den rechten und sonst den linken, und kommt so auf 155, zwei 
weniger als nur mit der linken Spalte (157).

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

und die vier mit der hohen Zahl kann er nicht fitten, daher UNASSIGNED, 
der Rest klappt.

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Wie Falk schon schrieb, sind D1_A, D3_C und D3_D unnötig, das erste kann 
man durchreichgen, und die anderen fest auf Null setzen. Damit werden 
drei wertvolle Ausgänge frei für interne zusätzliche Terme, auf Kosten 
der doppelten Laufzeit. Falls in der Logik ein Unterausdruck mehrfach 
gebraucht wird, kann der Fitter diesen Teil als eigenen Produktterm 
abspalten.

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Ich hab auch mal in meinem "Steinbuch/Rupprecht Nachrichtentechnik" 
nachgesehen, die "0" und "1"-Minimierungen heißen konjunktive und 
disjunktive Normalform.
Na Wikipedia weiß auch das:
http://de.wikipedia.org/wiki/Karnaugh-Veitch-Diagramm
Maxterm und Minterm steht da noch
was ich noch im "Steinbuch" bestätigt fand: die eine Form läßt sich nur 
mit NANDs, die andere nur mit NORs aufbauen.

von Camel (Gast)


Lesenswert?

Hallo,

bin wieder einen Schritt weiter.

 P-Terms   Fan-in  Fan-out  Type  Name (attributes)
---------  ------  -------  ----  -----------------
   1/1        1        1    Pin   DIO_01
  31/29       7        1    Pin   D2_A
   5/6        6        1    Pin   D3_A
   1/1        1        1    Pin   D1_B
  11/13       6        1    Pin   D2_B
   3/3        5        1    Pin   D3_B
  34/38       7        1    Pin   D1_C
   8/9        6        1    Pin   D2_C
   0/1        0        1    Pin   D3_C
  34/36       7        1    Pin   D1_D
   5/8        6        1    Pin   D2_D
   0/1        0        1    Pin   D3_D
=========
 133/146        Best P-Term Total: 131
                       Total Pins: 20
                      Total Nodes: 0
            Average P-Term/Output: 10

Die Zahl der Terme hat sich durch
  DIO_01 = D1_A  ;
  D3_C   = 0  ;
  D3_D   = 0  ;
verringert, was könnte ich jetzt noch optimieren?

Gruß Camel

von Falk (Gast)


Lesenswert?

Was willst du denn noch optimieren? Passt das Design immer noch nicht in 
den GAL?

MfG
Falk

von Camel (Gast)


Lesenswert?

nein

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Da sind immer noch 3 Ausgänge, die um die 30 Produktterme haben. Das 
Maximum beträgt 12 ( für 2 Ausgänge, sonst 10 oder 8). Laß die drei 
unnötigen Ausgänge einfach weg, sonst passst das nie. Der Fitter muß 
diese drei als interne Zwischenergebnisse benutzen können, dann passt es 
mit viel Glück rein.

von Falk (Gast)


Lesenswert?

Hast du alle Pins freigegeben, sodass die Software sich die beste 
Verteilung aussuchen kann?
OK, hab nochmal das Datenblatt gelesen. Pro Macrozelle sind maximal 12! 
Produktterme verfügbar, und das auch nur bei zwei Macrozellen, die 
anderen haben nur 8 oder 10! D.H. D2_A, D1_C und D1_D haben VERDAMMT 
schlechte Karten. Mein Vorschlag.

1.) Die Signale für  DIO_01 = D1_A  ;  D3_C   = 0  ;  D3_D   = 0 
KOMPLETT aus dem Design rausschmeissen. Das kann man schlieslich extern 
problemlos realisieren.

2.) In den Einstellungen des Compilers suchen und irgendwo Eistellungen 
für Area oder Speed Optimization auf Area setzen.

Was für Menus gibt es für Compilereinstellungen?

MFG
Falk


von Falk (Gast)


Lesenswert?

Wenn alle Stricke reissen, musst du wohl ne kleine Emulatorplatine 
bauen, z.B. mit XC9536, gibts für 4,10 bei Reichelt. Dort passt es auf 
jeden Fall rein, hab ich probiert.

MfG
Falk

von Falk (Gast)


Lesenswert?

@ Christoph

"Der Fitter muß diese drei als interne Zwischenergebnisse benutzen 
können,"

Hmm, das war auch mein Gedanke. Aber ein nochmaliger genauer Blick ins 
Datenlatt lässt mich da ein wenig zweifeln. Denn der Feedback von der 
Macrozelle in die AND Matrix kann nur das FlipFlop oder das Pin als 
Quelle haben, aber NICHT die Produktterme! Hmmm?

MFG
Falk

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Dann muß eben der Pin zurückgeführt sein, und das Zwischenergebnis 
erscheint am Ausgang. Damit wird die Verzögerung etwas größer, vor allem 
wenn man den Ausgang kapazitiv belasten würde.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.