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
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
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
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
....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
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
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.
"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"
CoolRunnerII ist meines Wissens die einzige Familie, die solche Flip-Flops hat.
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.
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
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)
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.