Guten Tag! Ich habe hier in diesem Forum schon einige Threads über die Generierung eines Takts mittels FPGAs gelesen. Doch dies waren zumeist nur einfache Taktteiler. Wenn ich nun aber einen Takt brauche, welcher z.B. 17,5Hz beträgt, was kann ich dann machen? Ok, zugegeben, ich werde wohl nie einen solchen Takt brauchen. Aber nun auf was ich hinaus will: Bei allen Taktteilern, die ich bisher gesehen habe wurde mit Zählern gearbeitet, welche hoch- bzw. heruntergezählt werden, sodass dadurch ein neuer Takt entsteht. Dabei ist mir aufgefallen, dass solche Zähler sehr viele Ressourcen im FPGA verbrauchen und eigentlich nicht effektiv sind. Deshalb habe ich einmal versucht, eine Taktgenerierung mittels Zeitkonstanten zu verwirklichen. Hier erst einmal der Code: <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity test is port(clk: in Std_Logic; takt: inout Std_Logic); end test; architecture Behavioral of test is constant zeit: time := 1000 ms; begin takt <= not takt after zeit/2; -- 1 Hz ......... ......... end Behavioral; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Dieser Code lässt sich zwar synthetisieren, aber in ModelSim sowie auf meinem Xilinx Spartan3 Starter Board(takt hängt an einer LED) tut sich gar nichts. Nun habe ich gehört, dass diese Methode nur in einer TestBench funktioniert. Doch andererseits habe ich folgenden synthetisierbaren Code gefunden: Der Code stellt ein einfaches NOR-Glied dar, welches nur auf Impulse die größer als 5 ns sind reagiert: <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< .. Architecture Norglied of norgl is C <= a NOR b AFTER 5 ns; End Norglied; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Der Code mit dem NOR-Glied sollte ja wohl kaum etwas in einer TestBench verloren haben, deshalb schließe ich darauf, dass der Code so auch funktioniert. Da ich Anfänger bin und mit ModelSim noch nicht wirklich umgehen kann weiß ich aber nicht zu 100%, ob der Code funktioniert. Laut Autor funktioniert er auf jeden Fall. d.h. wenn dieser Code funktioniert, müsste mein Code doch auch funktionieren, oder? Könnt ihr mir nun sagen, warum meine Methode, einen Takt zu generieren, nicht funktioniert? Ist das überhaupt möglich, oder muss man solche Sachen wirklich immer mit Zählern erledigen? Wenn es nicht möglich ist, warum gibt es dann überhaupt die AFTER- Anweisung? Ich freue mich schon auf eure Antworten. Vielen Dank schon einmal im Voraus! Mit freundlichen Grüßen Daniel!
Sorry, aber Deine Idee finde ich niedlich. "time" und "after" sind generell nicht synthesefähig. Sie werden bestenfalls bei der Synthese ignoriert, schlimmstenfalls gibts eine Fehlermeldung. Stell Dir mal vor, Du bist ein Synthesetool ;-) Welche Logikelemente verwendest Du, um Dein Bespiel mit "after ..." zu implementieren ? Du hast Flip-Flops, Gatter, RAMs, vieleicht eine PLL, Leitungen usw... Das dürfte ein Problem werden ! Also die gute alte Methode, einen Taktteiler zu verwenden, ist immer noch das einfachste, um z.B. aus 1 Mhz einen Takt von 1 Hz zu machen. Wieviele Ressourcen kostet das ? Mit 20 Bits gehts max. durch 1.048.576. Also nimm einen 20bit Counter (= 20 Flip-Flops) + etwas Logik ringsrum für das Zählen und den Vergleich und schon ist der Teiler fertig. Wenn Du krumme Teilerfaktoren brauchst, dann sind verschiedene Ansätze möglich. Z.B. Verwendung eines Dig. ClockManagers (DCM) falls vorhanden oder eine PLL. Früher gabs auch mal ICs, wo man den Teilerfaktor umschalten konnte, z.B. /64 und /65. Sowas kann man im FPGA natürlich auch machen, hab ich mal für einen UART gemacht, um den Bit-Clock entsprechend UART-Spec generieren zu können. Der Zähler teilt z.B. 10 mal durch 64 und dann 1 mal durch 65. Bei DCM /PLL multiplizierst Du Deinen Takt mit M/N, wobei sich M und N einstellen lassen. Konstruktionen mit time und after xxx ns funktionieren nur in der Testbench, dort ist es ja nicht nötig, die Beschreibung in Hardware umzusetzen. Das NOR-Gatter Beispiel lässt sich sicher synthetisieren, aber das "AFTER 5 ns" wird dabei ignoriert !
"after"-Anweisungen sind nicht synthetisierbar und werden von VHDL-Synthesizern schlicht und einfach ignoriert. Der von Dir beschriebene NOR-Code ist selbstverständlich synthetisierbar, aber der Synthesizer schaut sich die "after"-Anweisung nicht an. Schreib einfach mal anstatt "5 ns" "5000 ms" hin. Es wird bei der Synthese dasselbe rauskommen. "after"-Anweisungen sind nur in der Simulation interessant. Willst Du hardwaremäßig den Takt runterteilen, brauchst Du einen Zähler. Manche FPGAs, z.b. Spartan-3, haben ausserdem noch spezielle integrierte Module um den Takt zu teilen oder sogar zu vervielfachen, siehe auch: www.xilinx.com/bvdocs/appnotes/xapp462.pdf
Hallo, danke für eure Antworten. Sie haben auf jeden Fall Klarheit geschaffen. Gruß Daniel!
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.