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!
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.
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.
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?
@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
@ 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
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.
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
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
@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
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.
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.
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!
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
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).
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.
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.
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.
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
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
@ 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
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.