Forum: FPGA, VHDL & Co. Taktgenerierung mittels Zeitkonstanten


von Daniel R. (Gast)


Lesenswert?

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!

von FPGA-User (Gast)


Lesenswert?

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 !

von Jochen Pernsteiner (Gast)


Lesenswert?

"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

von Daniel R. (Gast)


Lesenswert?

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