Forum: FPGA, VHDL & Co. Taktfrequenz dritteln


von Tom (Gast)


Lesenswert?

Hallo zusammen,

ich muss eine Taktfrequenz dritteln. Diese Taktfrequenz beträgt 1,5
MHz, also fällt eine Xilinx-DLL, die sowiese erst ab 20 MHz Frequenzen
arbeitet und auch nur die Inputfrequenz halbiert, raus...

Verwende ich dazu am Besten einen Zähler oder eine Statemachine?

Gruß
Tom

von Christoph Kessler (Gast)


Lesenswert?

Wo ist der Unterschied? Ein Zähler ist eine spezielle Statemachine, die
nur einen Ablauf kennt,(außer sie wird mit Reset rückgesetzt.)
Zwei Flipflops reichen, der vierte unzulässige Zustand darf sich nicht
aufhängen können ("deadlock"). Wie man das formuliert ist
Geschmacksache

von Klaus F. (kfalser)


Lesenswert?

Wenn man am Ende wieder einen symmetrischen Takt haben will, ist es
nicht ganz so einfach eine Taktfrequenz zu dritteln.

Wenn Du nur innerhalb Deines FPGA's etwas in jedem 3. Takt zu
verarbeiten hast, dann ist es am besten mit dem vollen Takt zu fahren
und ein Enable Signal zu verwenden, das nur jeden 3. Takt aktiv ist.

Wenn Du den geteilen Takt aus dem FPGA herausführen mußt zu einem
anderen Baustein dann hängt es davon ab ob der Takt symmetrisch sein
muß  oder nicht.
Ist ein symmetrischer Takt nötig könnte man ihn mit Hilfe eines
DDR-Output Registers erzeugen, weil ja der Ausgang einmal bei der
aufsteigenden und einmal bei der abfallenden Flanke des Originaltakts
umschalten muß.
Noch einfacher ist es, wenn Du von der doppelten Taktfrequenz ausgehst
und durch 6 teilst.

Grüße
Klaus

von Tom (Gast)


Lesenswert?

Hi Klaus,

DDR-Output Register?!?
Ich muss mit dem gedrittelten Takt eine externe Baugruppe nasteuern,
d.h. der vom FPGA generierte Takt dient als BCLK...

Gruß
Tom

von Tom (Gast)


Lesenswert?

....ergo sollte die BCL symterisch sein...uns synchron...

Könnte ich nicht die beiden Flanken der Clock einsynchronisieren (auf
Systemtakt), und dann die gedrittelte Clock in einem weiteren Process
mit einem Process, die beide Clockflanken hat, generieren?!?

Gruß
Tom

von Klaus F. (kfalser)


Lesenswert?

Ein Prozess, der beide Flanken hat, ist leider nicht synthetisierbar,
das heißt, der Compiler kann keine Hardware daraus machen.

Im Prinzip ist es aber das, was ein DDR (Double Data Rate) Register
macht, nämlich den Ausgang bei der aufsteigenden und bei der
abfallenden Flanke umzuschalten. Du kannst es nur nicht in als Prozess
beschreiben, sondern Du mußt (Xilinx) eine OFDDR Komponente
instantiieren.

Wenn Du aber eh einen Systemtakt hast, der viel höher ist, könntest Du
ja den 500 KHz Takt davon ableiten.

Grüße
Klaus

von FPGA-User (Gast)


Lesenswert?

würde erstmal nachschauen, ob das externe Gerät wirklich
einen 50/50 Clock braucht. Das muss nicht immer sein.

"Ein Prozess, der beide Flanken hat, ist leider nicht
synthetisierbar,
das heißt, der Compiler kann keine Hardware daraus machen."

Möchte nicht spitzfindig sein, aber der Compiler kann das.
if clk'event then
 ...

synthetisiert bei CoolRunnerII CPLDs einwandfrei Register, die
mit beiden Flanken schalten.

von Micha (Gast)


Lesenswert?

"Möchte nicht spitzfindig sein, aber der Compiler kann das.
if clk'event then
 ...

synthetisiert bei CoolRunnerII CPLDs einwandfrei Register, die
mit beiden Flanken schalten."

Ist ja seltsam, mit dem CoolRunnerII gehts, mit Spartan3E gehts nicht.
Da kommt "unsupported Clock statement"

von FPGA-User (Gast)


Lesenswert?

CoolRunnerII ist meines Wissens die einzige
Familie, die solche Flip-Flops hat.

von FPGAküchle (Gast)


Lesenswert?

Also ihr könnt nur das synthetisieren was im Chip steckt. Im spartan3
gibts zwar auch FF die auf beide Flanken schalten, aber nur in den
IO-Pads. Ist halt zum direkten Anschluss eines DDR-Rams an die
FPGA-Pins gedacht. Diese DDR-FF
können in eine Richtung (als Input)? auch in VHDL mit zwei Flanken in
einem Process beschrieben werden.  und diese FF sind an einer Seite (Q
oder D) immer
mit den FPGA-Pins verbunden.

von Klaus Falser (Gast)


Lesenswert?

Da gibt es mehrere Unterschiede.
Die CoolRunner-II CPLD's haben zwar die Fähigkeit an beiden Flanken
des Takts zu schalten, verfügen aber nur über einen einzigen
Daten-Eingang.
Dadurch kann man die Schaltung mit dem halben Takt takten, man kann
aber schwer zwischen bei der aufsteigenden Flanke und bei der
abfallenden Flanke unterschiedliche Zuweisungen machen.
Im CoolRunner CPLD haben alle Makrozellen diese Fähigkeit, da macht es
natürlich Sinn, wenn der Compiler dies unterstützt, indem man im
Prozess nicht auf eine bestimmte Flanke, sondern auf eine beliebige
Flanke triggert.

Die Virtex und Spartan FPGA's haben die DDR Fähigkeit nur in den I/O
Blöcken und verfügen über 2 getrennte Dateneingänge und eigentlich auch
über 2 getrennte Clock-Eingänge.
Damit kann man an der aufsteigenden Flanke ein Signal eintakten und an
der abfallenden Flanke ein anderes.
Damit könnte man schreiben  :

if rising_edge(Clk) then
   D <= ...
elsif falling_egde(Clk) then
   D <= ..
endif

oder

if rising_edge(Clk1) then
   D <= ...
elsif rising_egde(Clk2) then
   D <= ..
endif

Wahrscheinlich unterstützt der Compiler dies (noch) nicht, weil er
sonst unterscheiden müßte, ob das Konstrukt in einen I/O Block gehört
(erlaubt), oder ob es in einem normalen Slice vorkommt, wo es nicht
erlaubt sein kann.

Grüße
Klaus

von FPGAküchle (Gast)


Lesenswert?

Hallo Tom

Man kann den Dritteltakt per FSM und counter generieren, der ist dann
allerdings etwas zum Ursprungstakt verschoben und jittert etwas.
Vorausgesetzt ist allerdings ein zweiter hoher FPGA takt. Mit diesem
läuft die FSM un der counter.

Prinzip:

1)Warten und erkennen der ersten (steiegenden) Flanke des zu
drittelnden Taktes,  dann:
 a) Dritteltakt auf '1' setzen, counter starten (jeden systemtakt um
1 erhöhen

2)Warten und detektieren der zweiten (steigenden) Flanke, dann
    counter stoppen.

3)counter in jeden Takt um zwei erniedrigen (oder bei Abschluss 2 um
eins nach rechts schieben und in drittens um 1 in jedem takt
erniedriegen)

4) Warten das counter gleich oder kleiner Null ist, dann:
  Dritteltakt auf '0' setzen

5) Warten auf die dritte Flanke, counter auf Null setzen und zurück mit
(1)

von Cpt (Gast)


Lesenswert?

Hallo

Also ich hätte da noch den Johnson Counter (im Prinzip ein über einen
Inverter rückgekoppeltes Schieberegister) anzubieten. Mit diesem Gerät
kannst du durch 3 oder 6 usw. teilen. Nur leider muß der Eingangstakt
vorher verdoppelt werden :(  Ich habe das damals in der Vorlesung mit
der DCM im Spartan 3 gemacht. Die kann man auch in einem low frequency
mode instantieren. Wie das bei deinem Teil ist weiß ich nicht. Kann
aber vllt. morgen mal nachschauen.
Viel Erfolg

Cpt

von FPGAküchle (Gast)


Lesenswert?

aber die DLL arbeitet doch erst ab 20 MHz?? -> Im datenblatt wühlen:
hier steht: CLK_Freq_DLL_LF (low frequency mode): > 18 MHz (Tab32)

geht nicht ... huch da is noch ne Fußnote (die DFS hat geringere
Eingangsfrequencen) .. hm *erinner*:

Ja die DCM (dig. Clock manager) besteht aus
DLL (delay looped lock) und DFS (dig. freqency synthesizer).

OK die DLL geht erst ab 18 MHz, schaun mer mal bei DFS (Tab 34)
CLKIN_FREQ_IN > 1 MHz, na das könnte doch klappen,

huch wieder ne Fussnote: If both DFS and DLL outputs are used on the
same DCM, follow the more restrictive CLKIN_FREQ_DLL specifications

Aha, also die Verdopplung der 1.5 MHz klappt wenn du ne xtra DCM dafür

nimmst. Hm aber was mache ich mit dem Feedback Pin? (muss das nicht mit
dem Ausgang der DCM verbunden werden)

weiterwühl Ahja XAPP463 hat die Antwort, clkfb kann bei reiner DFS
Nutzung unbenutzt bleiben.

-> also der Vorschlag von Cpt scheint realisierbar wenn du ne DCM übrig
hast,
und von dieser nur die DFS nutzt.

XAPP463 ist sehr empfehlenswert hinsichtlich Eingangsfrequenzen etc.

Ist mal wieder ein Paradebeispiel wie komplex die Spartans
sind,querverweise
in der Doc etc, man lernt halt immer dazu (und dann kommt Chefe und
sagt wir machen LATTICE nicht Xilinx) -> }:-(




nimmst,

die XAPP462 erklärts ganz gut.

aber woanders stand was

von Tom (Gast)


Lesenswert?

Hallo zusammen,

erstmal vielen Dank für Eure Mühen und Tipps....

Da ich einen älteren Virtex xcv1000 zur Verfügung habe, fällt die DCM
weg. Der Baustein hat nur 4 DLL's, die eben erst ab 20 MHz
arbeiten...
...und hat keine DDR-FF's...

@ FPGAküchele:

im Prinzip ist Dein Vorschlag schon sehr gut. Wie wäre es alternativ
mit dieser Methode:

...ansteigende und abfallende Flanke der zu drittelnde Clock auf hohe
Systemclock (ca.30 mal höher) eintakten und vom Typ Boolean als Signal
deklariert

FSM:
Z1) im ersten State bei erster detektierter ansteigenden Flanke der
Clock den Dritteltakt-Ausgang auf '1' setzen und Zustandsübergang(ZÜ)
in Z2

Z2) bei detektierter ansteigenden Clcok Flanke ZÜ in Z3

Z3) bei detektierter abfallender Flanke Dritteltakt-Ausgang auf '0'
setzen, ZÜ in Z4

Z4) mit detektierter ansteigender Flanke ZÜ in Z1

Gruß
Tom

von cpt (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen!

Ich habe gerade nochmal das Skript zur Vorlesung rausgesucht.
Schau dir mal die Seiten 16 bis 21 an. Da ist der Johnson Counter
beschrieben und auf Seite 20 eine Lösung ohne die DCM ... Habe diese
Variante aber nie getestet, da unsere Frequenzen höher waren.
Manche Formulierung klingt vllt etwas komisch weil das ein russischer
Gastprof war. Na ja vielleicht hilfts.

Grüße Cpt

von Tom (Gast)


Lesenswert?

Hallo cpt,

vielen dank für den Link....
Habe mir das Paper mal gezogen und werde heute abend mal dieses
durchgehen....

Gruß
Tom

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.