Forum: FPGA, VHDL & Co. VHDL Newbie -->Kontrolle VHDL COde


von Ralph H. (guru)


Angehängte Dateien:

Lesenswert?

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 
!!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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... ;-)

von Ralph H. (guru)


Lesenswert?

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????

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Ralph H. (guru)


Lesenswert?

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 :-)

von Anguel S. (anguel)


Lesenswert?

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... :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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... :-(

von Ralph H. (guru)


Lesenswert?

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 !

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von D. I. (Gast)


Lesenswert?

Schreib du doch ein Buch Lothar :D

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

D. I. schrieb:
> Schreib du doch ein Buch Lothar :D
Na, ich habe da so meine Problemchen mit der Sprache... ;-)
Lothar Miller schrieb:
> Deustsprachiges

von Ralph H. (guru)


Angehängte Dateien:

Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Ralph H. (guru)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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)?

von Ralph H. (guru)


Lesenswert?

Jo so richtig im DIP... war ne teure Angelegenheit :-) ebay 330365392990

von Ralph H. (guru)


Lesenswert?

So.. ich habs grad mal probiert den Reset weiter rauszumachen.. das 
bringt überhaupt keine Einsparung an Pterms und Funktion Blocks... also 
bleibt es drinne :)

von Klaus F. (kfalser)


Lesenswert?

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.

von Ralph H. (guru)


Lesenswert?

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 
?

von Anguel S. (anguel)


Lesenswert?

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...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von bko (Gast)


Lesenswert?

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 ?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von Ralph H. (guru)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.