Forum: FPGA, VHDL & Co. FPGA mit Signalgenerator takten


von Daniel G. (kaffekanne)


Lesenswert?

Hallo zusammen!

Ich würde meinen Altera-FPGA gern sowohl mit einem Oszillator wie auch 
mit einem extern angeschlossenen Rechtecksignalgenerator (CMOS-Pegel) 
betreiben. Dazu habe ich ein paar Fragen:

1. Megafunction altclkctrl
Habe ich das aus dem Datenblatt richtig verstanden, dass man bei 
unterschiedlichen Taktquellen die altclkctrl-Funktion verwenden muss, 
die als MUX funktioniert und den Takt an die PLLs weiterleitet? Wie ist 
das dann zu betreiben wenn ich entweder mit dem Oszillator und der PLL - 
ODER dem externen Takt als Global-Clock arbeiten möchte?

2. Pegelanpassung
Da die Takteingänge des FPGAs nur 3,3V vertragen, müsste ich den 
Taktpegel aus dem Signalgenerator dann noch durch einen Pegelwandler 
schicken oder gibt es (da nur ein Signal) auch noch einen andere 
Möglichkeit? Perfekt wäre eine 50ohm Anpassung-ist aber kein Muss.

3. Taktausgang
Zusätzlich möchte ich noch den Arbeitstakt ausgeben. Dafür muss ich dann 
auch die Megafunction von oben nehmen, oder? Es gibt zwar viel Text zu 
dem Thema oder scheinbar keine Applikations-Schaltung. Darum bin ich mir 
auch noch so unsicher.

Danke und viele Grüße!

von Pesto (Gast)


Lesenswert?

1. ja. du kannst jede PLL auch mit einem äusseren Takt zusätlzich 
betreiben und umschalten.

2. nein, 3,3V OSC oder einen passenden buffer. Serienterminierung mit 
z.B. 33 Ohm reichen.

3. DDR-FF im Ausgangspin nutzen und statisch mit 1/0 belegen.

von Daniel G. (kaffekanne)


Lesenswert?

Hey Pesto! Schon mal danke für deine Antwort.

Wie mag sich denn die PLL verhalten, wenn man ihr verschiedene 
Arbeitstakte gibt? Man gibt ihr ja vorher an, wie hoch der Eingangstakt 
ist. Wenn ich jetzt aber zwischen OSZ und ext. Takt hin-und-her schalte, 
gibt es da evtl. Probleme?

Was ist DDR-FF? Dazu finde ich irgendwie nichts..

von Daniel G. (kaffekanne)


Lesenswert?

Sorry, da war's wohl schon was spät..
Ich hab mich jetzt mal mit der Megafunction ALTDDIO (also dem DDR-FF) 
befasst. Das scheint wirklich alles mitzubringen, was ich benötige. 
Danke für den Hinweis!

Das einzige offene Problem ist jetzt noch der externe Takt mit 
CMOS-Pegel.
Dieser Pegelwandler scheint mir die beste Wahl zu sein: 
http://www.fairchildsemi.com/ds/NC/NC7SZ08.pdf

@Pesto: Wie kommst du zu den 33ohm?

von Joost S. (kxalpha)


Lesenswert?

Sofern Du die ALTPLL Megafuction benutzt kannst Du für Deine PLL auch 
zwei Clockeingänge wählen und diese in der Laufzeit umstellen, hab ich 
zwar noch nie gemacht, doch so habe ich es verstanden.

Ob Deine externe CLK mit 3,3V Pegel passt hängt in erster Linie von der 
IO Voltage der IO Bank ab an der das Signal ankommt. Ist diese ebenfalls 
3,3V sehe ich kein Problem. Ist sie geringer so sind die I/Os zwar over 
voltage tolerant, aber laut Datenblatt nicht beliebig viele Zyklen bevor 
der Pin sich verabschiedet.

Sagen wir mal so, ich hab aktuell einen FPGA der mit zwei externen 
Quarzoszillatoren 4 PLLs versorgt und darüber hinaus kommen noch 
mindestens 4-5 externe Clock dazu, die teilweise auf dedizierte 
Clockeingänge gehen, teilweise aber auch nur stumpfe GPIOs füttern. Geht 
alles ohne Probleme. Solange es aber nicht direkt in eine PLL danach 
geht ist das Constraining wichtig, damit Quartus weiss, mit welchem Takt 
es rechnen muss, ansonsten wird 1ns = 1GHz angenommen und dass schafft 
auch ein Stratix nicht. ;) Wenn möglich solltest Du aber immer auf 
dedizierte Clockeingänge routen, damit die Clocks sinnvoll auf die 
globalen Clocknetzwerke im FPGA verteilt werden können (das Delay ist 
dann minimal). Wenn die Clock aber nur ein paar Register taktet ist ein 
GPIO völlig ausreichend.

von Daniel G. (kaffekanne)


Lesenswert?

Hey! Danke für deine Antwort!

Mein Design wird wirklich relativ simpel. Ich glaub dafür mach ich mir 
einfach zu viele Sorgen :)

Also mein 150MHz Oszillator soll eine PLL füttern, die dann verschiedene 
Takte erzeugt die wiederum gemuxt werden. Der am MUX ausgewählte Takt 
soll dann einen Prozess takten.
Der externe Signalgenerator soll auch auf diesen MUX von oben aufgelegt 
werden, sodass man entweder einen der PLL-Takte ODER den externen 
Generatotakt wählen kann.
Ich kann bei Quartus für meinen CycloneIII nur einen Eingangstakt für 
die PLLs wählen. Als Eingangstakt-MUX steht die Megafunction ALTCLKCTRL 
zur Verfügung. Die würde aber, wie ich das verstehe, den selektierten 
Eingangstakt (Osz oder Signalgenerator) nur einer PLL zuführen und nicht 
als globalen Takt zur Verfügung stehen.
Ich weiß also nicht, wie ich den Osz über die PLL führe und den anderen 
Eingangstakt nicht.

von Daniel G. (kaffekanne)


Lesenswert?

Also so:

Takt1: Signalgenerator
Takt2: 150MHz Oszillator


                           |--------|
Takt1----------------------|        |
                           |  MUX   |
        |----------|       |        |---------> Prozess
        |        c0|       |        |      |
Takt2---| PLL    c1|-------|        |      |
        |        c2|       |--------|      ---> clk_out
        |----------|

Kann ich da einfach die beiden Eingangstakte auf zwei clk_p Pins legen 
und den clk_out über ein DDR-FF auf einen GPIO Pin?

von Robert K. (Firma: Medizintechnik) (robident)


Lesenswert?

Warum so kompliziert? Du musst und darfst den Takt nicht über einen MUX 
führen. Wozu? Da immer ein Takt inaktiv sein wird, kannst du das Ganze 
IN/VOr der PLL machen.

von Daniel G. (kaffekanne)


Lesenswert?

Wie kann ich das ganze denn IN der PLL machen, wenn der nur einen 
Takteingang hat?
Und wenn die Auswahl des Eingangstaktes VOR der PLL passiert, ist das 
doch auch ein MUX, oder wie meinst du das?

von Klaus F. (kfalser)


Lesenswert?

Daniel G. schrieb:
> Also mein 150MHz Oszillator soll eine PLL füttern, die dann verschiedene
> Takte erzeugt die wiederum gemuxt werden. Der am MUX ausgewählte Takt
> soll dann einen Prozess takten.

So etwas klingt mir eher mach Murx.
Falls Du mit der Taktfrequenz nach oben gehen willst, also > 150 MHz, 
dann würde ich mit der PLL die höchste Taktfrequenz erzeugen.
Alle anderen, tieferen Frequenzen werden mit einem Clock Enable erzeugt, 
und die gesamte Schaltung läuft mit immer mit dem selben Takt.
Alternativ könntest Du auch die Parameter der PLL ändern, sodass diese 
unterschiedliche Takte erzeugt, sodass trotzdem immer nur der Ausgang 
der PLL OHNE Mux an die Schaltung geht. Zumindest bei Xilinx, glaube 
ich, kann man die Teilerfaktoren der PLL dynamisch ändern. Habe das aber 
noch nicht benötigt.
Und auch das mit dem Signalgenerator ist sicher nicht optimal. So ein 
Generator liefert für FPGA Verhältnisse niedere Frequenzen, und die 
Flanken entsprechen üblicherweise nicht den Anforderungen eines FPGAs. 
Du musst also am Eingang sicherlich einen Schmitt-Trigger vorsehen, der 
Dir die Flankensteilheit garantiert.

von Daniel G. (kaffekanne)


Lesenswert?

Genau so hatte ich es vor. 150MHz ist die höchste Taktgeschwindigkeit. 
Alle teilbaren Takte werden durch clock enable erzeugt. Jedoch gibt es 
auch "ungerade" Takte, die ich mit der PLL erzeugen muss - und deshalb 
der MUX dahinter.
Das Thema "rekonfigurierbare PLL" führt für dieses Projekt zu weit.
Das mit der Flankensteilheit ist auch richtig. Die Quelle wird hier 
einfach mal als qualitativ hochwertig vorausgesetzt.

Die immer noch offene Frage ist nun: wie bekomme ich den Takt des 
Generators (für meine Zwecke) in den FPGA? clk_in oder einfach durch ein 
GPIO wie von Joost S. beschrieben. Und wie bekomme ich den aktiven Takt 
wieder aus den Chip raus? Über ein DDR-FF an einem GPIO oder muss ich da 
wie schon oft gelesen über einen clk-pin gehen (wobei die doch nur als 
Eingang gedacht sind, oder)?

Viele Grüße!

von Klaus F. (kfalser)


Lesenswert?

Daniel G. schrieb:
> Die immer noch offene Frage ist nun: wie bekomme ich den Takt des
> Generators (für meine Zwecke) in den FPGA?
> clk_in oder einfach durch ein
> GPIO wie von Joost S. beschrieben.
Dazu musst Du das Datenblatt lesen oder jemand, der Altera besser kennt, 
kann es beantworten.
Der Unterschied liegt einmal in der Laufzeit (dürfte Dir wahrscheinlich 
egal sein), und andererseits kann es möglich sein, dass der GPIO nicht 
zu einem Taktmultiplexer geroutet werden kann.
Nimm einen dedizierten Eingang und Du bist auf der sicheren Seite.

> Und wie bekomme ich den aktiven Takt
> wieder aus den Chip raus? Über ein DDR-FF an einem GPIO oder muss ich da
> wie schon oft gelesen über einen clk-pin gehen (wobei die doch nur als
> Eingang gedacht sind, oder)?

Auch hier liegt der Unterschied nur in der Laufzeit. Ein DDR-FF erzeugt 
ein Taktsignal, dessen Flanken gleichzeitig zu den anderen, durch diesen 
Takt erzeugten Ausgängen liegt.
Das kann hilfreich sein wenn man den Takt dazu verwendet, mit einem 
anderen Baustein die ausgegebenen Daten wieder einzutakten (Bus).
Wenn Du nur den Takt als Signal allein brauchst, dann genügt ein 
normaler Ausgang.
Dedizierte Clock Pins haben damit nichts zu tun.

von Daniel G. (kaffekanne)


Lesenswert?

Ah wunderbar! Das ist genau das, was ich lesen wollte. Ja, Laufzeiten 
sind in meinem Fall wirklich egal. Ich hab nur in einem Altera-Forum 
gelesen, dass man den Clock-Ausgang zu einem dedizierten Clock-Pin 
routen soll. Und das hat mich verwirrt.
Vielen Dank!

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.