Hallöchen, nachdem ich mit Eurer Hilfe gestern erstmals (juchhe) nen CPLD programmiert habe, ist es nun an der Zeit sich mit VHDL zu beschäftigen. Hab schon paar Bücher bestellt, aber probier schonmal bissl. Ich hab mal nen Adressdecoder gebastelt und fehlerfrei übersetzt. Hier der Code.. könnt ihr mal fix drübergucken ob das so ok ist ? Danke !!
Ralph H. schrieb: > Hallöchen, nachdem ich mit Eurer Hilfe gestern erstmals (juchhe) nen > CPLD programmiert habe Na bitte geht doch. Beitrag "Re: GAL Entwicklungsborad gesucht" Und nein, die Fallstricke waren nicht absichtlich... ;-) Aber du hast sie offenbar umschifft. Das mit der Addresse <-> Adresse war ein Fipptehler... Ralph H. schrieb: > Hab schon paar Bücher bestellt Eins hätte vorab gereicht. Falls es noch nicht dabei ist, dann schreibs auf die Wunschliste: VHDL-Synthese Reichhardt&Schwarz Das handelt zwar eher von FPGAs, aber wer sich schon mal an CPLDs traut, der wird bald sehen, dass mit den paar FFs, die dort drauf sind, kein Blumentopf zu gewinnen ist. Ralph H. schrieb: > Hier der Code.. könnt ihr mal fix drübergucken ob das so ok ist ? Vergiss am besten gleich bit und bit_vector. Nimm stattdessen den std_logic und dessen Vektor. Denn damit lassen sich z.B. Tristate-Ausgänge 'Z' beschreiben.
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | |
4 | entity Programmcode2 is |
5 | Port (Adresse : in std_logic_vector(15 downto 12); |
6 | :
|
Dann passt das schon... ;-)
Hallo Lothar, Danke für Deine Antwort ! Ich hab es jetzt sogar geschafft, den Decoder mittels Testbench im Simulator zu simulieren :) Es geht also aufwärts.. Nun steht als nächstes mal ein Latch an. Da hab ich aber gelesen, dass man sowas NICHT nehmen soll? Ich brauch aber nur ein Latch, wo ich nen Bitmuster (ROM-Bank Nr.) mittels IO-Befehl speichere. Da denk ich mal, das sollte kein Problem sein, in diesem Fall ein Latch zu nehmen oder? Das Buch "VHDL-Synthese" ist übigens da und dort beschriebene Bespiele erzeugen unter dem Webpack 12.3 welches ich benutze, Fehler!! z.B. ist der Syntax für das Erzeugen der Testbench ziemlich anders.. Mach ich was falsch????
Ralph H. schrieb: > Nun steht als nächstes mal ein Latch an. Da hab ich aber gelesen, > dass man sowas NICHT nehmen soll? Nach sorgfältiger Abschätzung... > Ich brauch aber nur ein Latch, wo ich nen Bitmuster (ROM-Bank Nr.) > mittels IO-Befehl speichere. Da denk ich mal, das sollte kein Problem > sein, in diesem Fall ein Latch zu nehmen oder? ...spricht dem nichts entgegen. ;-) Wie schon durch die Blume gesagt: bei der Arbeit mit CPLDs ist (wegen der wenigen FFs) eher eine 74er-TTL-Denkweise angesagt. > Das Buch "VHDL-Synthese" ist übigens da und dort beschriebene > Bespiele erzeugen unter dem Webpack 12.3 welches ich benutze, Fehler!! > z.B. ist der Syntax für das Erzeugen der Testbench ziemlich anders.. > Mach ich was falsch???? Ja: du zeigst kein Beispiel, und sagst nicht, welche Fehler in welchem Zusammenhang da kommen... :-/ > z.B. ist der Syntax für das Erzeugen der Testbench ziemlich anders.. Das glaube ich nicht. Eine Testbench ist nur eine "normale" VHDL-Beschreibung, die keine Ports nach aussen hat. Und in diese Test-Entity wird das zu testende Modul als Komponente eingefügt und entsprechend verdrahtet. > z.B. ist der Syntax für das Erzeugen der Testbench ziemlich anders.. Bestenfalls der Weg zur Erzeugung einer Testbench ist ziemlich anders. Das kommt u.U. daher, dass seit ISE12 der ModelSim nicht mehr aktiv supported wird, und alles auf den ISIM zugeschnitten ist...
Lothar Miller schrieb: >> z.B. ist der Syntax für das Erzeugen der Testbench ziemlich anders.. > Bestenfalls der Weg zur Erzeugung einer Testbench ist ziemlich anders. > Das kommt u.U. daher, dass seit ISE12 der ModelSim nicht mehr aktiv > supported wird, und alles auf den ISIM zugeschnitten ist... Jo genau das wird es sein, es geht ja auch prima, wenn ich den vom WebPack automatisch erstellen Code für die Testbench erstmal verwende.. :-) Heut will ich mal ein Latch bauen und dann den Adressdecoder mit verknüpfen :) Beste Grüße PS: Deine HP finde ich echt sehr int. hab gestern mal geschnüffelt :-)
Lothar Miller schrieb: > Falls es noch nicht dabei ist, dann schreibs > auf die Wunschliste: VHDL-Synthese Reichhardt&Schwarz ... > Vergiss am besten gleich bit und bit_vector. Nimm stattdessen den > std_logic und dessen Vektor. Hm, irgendwie wird aber gerade im Reichhardt&Schwarz der bit_vector empfohlen, wenn ich mich richtig erinnere. Das war eines der Dinge, die mich dort gestört haben. Müsste nochmal schauen, ob die nicht auch noch asynchrone Resets verwenden... :)
Anguel S. schrieb: > wird aber gerade im Reichhardt&Schwarz der bit_vector empfohlen Richtig, in der ersten Hälfte , es werden auch gern noch die alten Synopsis-Libs verwendet. Das habe ich offenbar verdrängt... > Das war eines der Dinge, die mich dort gestört haben. Das Buch ist ein lokales Hoch. Dort wird nicht einfach der VHDL-Syntax durchgekaut, sondern das gemacht, was jeder könnte: einfache Schaltungen analysiert und dem Synthesizer ein wenig auf die Finger geschaut. Es gibt blöderweise m.E. (noch) nichts besseres Deustsprachiges... Aber wenn jemand eines weiß: ich kauf mir das gern mal... ;-) > Müsste nochmal schauen, ob die nicht auch noch > asynchrone Resets verwenden... :) Die werden leider in mindestens 99% der VHDL-Bücher, die ich (gesehen) habe, verwendet. Und das ohne wenigstens die Problematik mit asynchronen Resets einmal anzusprechen... :-(
und wieder ein Stückchen weiter...(war ja nicht schwer).. das Latch funktioniert :) auch als ausschließlich internes Latch :). Hier der Code.. begin -- Variante Latch mit Adressierung Latchout <= DB when (ADR7 = "00010100" AND IORQ = '0' AND WR = '0') Else Latchout ; end VERHALTEN; Einzig ein dominanter Reset fehlt noch. Leider ist mir das nicht gelungen, das ein '0' zwingend die Ausgänge auf '0' setzt. Könnt ihr mir helfen dabei ? Dankeschön !
Ralph H. schrieb: > Könnt ihr mir helfen dabei ? Zeig doch mal, was du schon hast... Ich würde es mal so ansetzen:
1 | Latchout <= (others => '0') when (Reset = '1') else |
2 | DB when (ADR7 = "00010100" AND IORQ = '0' AND WR = '0') else |
3 | Latchout ; |
BTW: hier im Forum kannst du mit den Tags [ vhdl ] und [ /vhdl ] (ohne Leerzeichen) den Quelltext schön formatieren lassen
D. I. schrieb: > Schreib du doch ein Buch Lothar :D Na, ich habe da so meine Problemchen mit der Sprache... ;-) Lothar Miller schrieb: > Deustsprachiges
Oh Du wolltest sehen ?? hihi dann schau mal.. Das ist mein aktueller Stand... Sinn und Zweck ist es, je nach Latchbelegung das CS des EPROMs zu aktivieren. D.h. Bei Bit0=1 Adresse E000..FFFF aber bei zusätzlichen Bit3=1 bereits 8000..FFFF sowie bei Bit1=1 den Bereich von 4000..5FFF. Was mir auffällt ist, das ich bereits 55% der Termressourcen des XC9536 belege. Geht das besser?, denn ich muss noch einiges unterbringen.. Beste Grüße vom Ralph
Ralph H. schrieb: > bereits 55% der Termressourcen des XC9536 belege. Ja, nimm ein 9572... ;-) Das 9536 ist das kleinste CPLD von Xilinx, da passt nicht viel rein. > Geht das besser? Überleg dir, ob du den Reset wirklich brauchst...
Na ich hab den Ergeiz es mit dem XC9536 zu schaffen, weil den hab ich im DIP hier und kann ihn prima programmieren. Ja Reset muss für das Latch unbedingt sein ! Evl. reicht es ja auch es nur beim Latch zu benutzen.. und nicht in jeder Verknüpfung.
Ralph H. schrieb: > Na ich hab den Ergeiz es mit dem XC9536 zu schaffen, weil den hab ich im > DIP hier und kann ihn prima programmieren. So richtig im DIP (also nicht PLCC)?
Jo so richtig im DIP... war ne teure Angelegenheit :-) ebay 330365392990
So.. ich habs grad mal probiert den Reset weiter rauszumachen.. das bringt überhaupt keine Einsparung an Pterms und Funktion Blocks... also bleibt es drinne :)
Ralph H. schrieb: > Was mir auffällt ist, das ich bereits 55% der Termressourcen des XC9536 > belege. Geht das besser?, denn ich muss noch einiges unterbringen.. Bei einem CPLD ist das nicht so wie bei einem FPGA. Die Produktterme "gehören" zum Funktion Block, und jedes Input- oder Output Signal benötigt mindesten einen Funktion Block. Nachteilig ist es eventuell nur dann, wenn ein FB von einem benachbarten FB Produkt-Terme ausleihen muss. Zähle dein Pins zusammen und deine internen FF oder Latches, und Du solltest auf die Anzahl der FBs kommen, die Du mindestens braucht. Sorgen machen musst Du Dir, wenn Dir die FBs ausgehen. Schau Dir den Fitter Report an, dort sind die Gleichungen aufgeführt und dort siehts Du auch die Signale, die so viele Product-Terme benötigen, dass sie vom Nachbarn gestohlen werden müssen oder die so komplexe Gleichungen haben, dass der Fitter einen Zwischenknoten einfügen muss.
Ok Klaus, dankeschön !! Ich hab mal noch ne Frage zum Umgang mit ner Testbench.. die stelle ich mal als extra Thread.. guckt Ihr mal auch da ?
Lothar Miller schrieb: > Es gibt blöderweise m.E. (noch) nichts besseres Deustsprachiges... > Aber wenn jemand eines weiß: ich kauf mir das gern mal... ;-) Ich weiß nicht mal was gutes englischsprachiges, was tatsächlich up-to-date ist und sich mit neueren FPGAs wie Spartan3 beschäftigt. Das bekannte "FPGA Prototyping by VHDL Examples: Xilinx Spartan-3 Version - Hardcover (Feb. 4, 2008) by Pong P. Chu" ist teilweise auch sehr eigenartig und praxisfern...
Anguel S. schrieb: > "FPGA Prototyping by VHDL Examples: Xilinx Spartan-3 Version - > Hardcover (Feb. 4, 2008) by Pong P. Chu" ist teilweise auch sehr > eigenartig und praxisfern... Teilweise sagst du? http://academic.csuohio.edu/chu_p/rtl/fpga_vhdl_book/fpga_vhdl_sample_chapter.pdf Dieser Stil wurde konsequent von Anfang bis zum Schluss durchgehalten. Iincl. der asynchronen Resets, obwohl es in dem Buch vorrangig um Xilinx FPGAs geht, und von Xilinx ein WP272 existiert.... :-( Allerdings ist die Picoblaze-Abteilung recht gut aufgemacht. BTW: Hier zum kontern mal mein UART http://www.lothar-miller.de/s9y/categories/42-RS232
Ralph H. schrieb: > Was mir auffällt ist, das ich bereits 55% der Termressourcen des XC9536 > belege. Geht das besser?, denn ich muss noch einiges unterbringen.. Die XC95xx CPLD haben keine Latches sondern nur Flipflops, somit wird eine Latch-Beschreibung auf viele PTs umgesetzt. Warum nimmst du keine Flipflops? Wenn ich aus deinem Code z.B. sowas mache benötigt er weniger Resourcen:
1 | process (CLK,Reset) |
2 | begin
|
3 | if Reset = '0' then |
4 | Latchout <= (others => '0'); |
5 | elsif (CLK'event and CLK = '1') then |
6 | if ((ADR7 = "00010100" AND IORQ = '0' AND WR = '0')) then |
7 | Latchout <= DB; |
8 | end if; |
9 | end if; |
10 | end process; |
11 | |
12 | -- Latchout <= (others => '0') when (Reset = '0') else
|
13 | -- DB when (ADR7 = "00010100" AND IORQ = '0' AND WR = '0')
|
14 | -- else Latchout ;
|
15 | CSROM <= MEMRD when ((ADR15="1110" OR ADR15="1111") |
16 | AND Latchout(0)='1') -- X-ROM |
17 | OR ( ADR15(15)='1' AND Latchout(3)='1') -- ROMDISK |
18 | OR ((ADR15="0100" OR ADR15="0101") AND Latchout(1)='1') |
19 | ELSE '1' ; |
Ergibt: 11% der PTs @lkmiller hier ist nun mit Absicht ein asyncroner Reset drin, denn sonst wäre CSROM evtl. bis zur ersten Taktflanke undefiniert oder ?
bko schrieb: > bis zur ersten Taktflanke undefiniert Das wäre mir erst mal egal, denn danach kommen noch viele zigtausende Taktflanken, wo man das korrigieren kann... ;-) Aber es kommt in der Tat darauf an, wie das konkret umgesetzt wird. M.W. sind in den Makrozellen tatsächlich FFs mit asynchonem Reset eingebaut, da würde sich de4r dann sehr wohl anbieten.
Hm.. Danke Euch beiden.. aber verstehe ich das richtig, dass ich da nun noch extra einen Takt für meine Schaltung benötige ? Das wäre nicht so gut. Übrigens.. der hohe Verbrauch an Terms war wohl darin zu suchen, das die Latchout's als Buffer auch als Ausgangssignal verwendet wurden, was ich nicht brauche.. zumindest nicht alle Ausgänge Hier mein aktueller Codestand.. Der CPLD soll also die Steuerung der RAM und ROM CS in abhängigkeit versch. gesetzten Bits im Latch übernehmen, sowie diverse IO-Adressselektionen vornehmen. Dabei hab ich aus PINspargründen das Signal CSIO extern mit nem 74LS138 decodiert!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.