Forum: FPGA, VHDL & Co. Clockmultiplexing vom mehreren Taktsignalen


von Daniel G. (kaffekanne)


Lesenswert?

Hallo zusammen!

Da ich schon seit einiger Zeit auf der Stelle trete, würde ich mir hier 
gerne ein paar Experten-Meinungen einholen.

Ich habe einen LFSR-Prozess, der mit zehn verschiedenen 
Geschwindigkeiten (vom Benutzer selektierbar) getaktet werden soll. Dazu 
hängt ein 150MHz Oszillator an der PLL des FPGAs. Diese PLL erzeugt fünf 
unterschiedliche  Grundtakte. Dahinter liegen Teiler, die aus den 
Grundtakten die 10 Nutztakte erzeugen.
Jetzt zum Problem: Mir ist klar, dass es bezogen auf Clock-Skrewing und 
entstehenden Glitches nicht gerne gesehen wird, wenn man Takte durch 
einen einfachen MUX multiplext. Da es aber nicht auf sauberes 
Umschaltverhalten ankommt und nur ein einziger Prozess getaktet wird 
wozu nichts anderes synchron laufen muss, könnte man dann nicht einen 
konventionellen MUX nehmen, oder muss ich da auf ein anderes Verfahren 
ausweichen?

Besten Dank schon mal im Voraus!

von DuArte (Gast)


Lesenswert?

>Da ich schon seit einiger Zeit auf der Stelle trete

Wie äußert sich das?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Daniel G. schrieb:
> ein 150MHz Oszillator ... 10 Nutztakte
Welche denn? Kannst du nicht einfach mit Clock-Enables arbeiten?

von Bronco (Gast)


Lesenswert?

Daniel G. schrieb:
> Dahinter liegen Teiler, die aus den
> Grundtakten die 10 Nutztakte erzeugen.
Wie sind diese Teiler aufgebaut? Erzeugst Du da eventuell schon Gated 
Clocks?

von Falk B. (falk)


Lesenswert?


von Daniel G. (kaffekanne)


Lesenswert?

Die Teiler sind bisher als Schieberegister aufgebaut und laufen immer - 
auch wenn der "erzeugte" Takt nicht verwendet werden. Also wäre die 
einfachste Möglichkeit die zehn Eingänge der Teiler zu "gaten", oder?
Ich bin für jeden Verbesserungsvorschlag zu haben, denn das Thema Timing 
scheint mir echt eine Wissenschaft für sich zu sein :)
Und mit "auf der Stelle treten" meine ich - nach hunderten Seiten 
Datenblätter lesen und sonstiger Recherche, immer noch keine gute Lösung 
gefunden zu haben, die das Thema Takt nicht komplexer macht als sie 
wahrscheinlich ist.

von Lattice User (Gast)


Lesenswert?

Daniel G. schrieb:
> Also wäre die
> einfachste Möglichkeit die zehn Eingänge der Teiler zu "gaten", oder?

Nein, genau das ist nicht gemeint.
Lies mal den Artikel den Falk verlinkt hat ganz genau durch.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Am einfachsten ist es, mit genau 1 Takt auszukommen. Das gelingt in 
sehr vielen Fällen und dieses Vorgehen ist besonders Anfängern zu 
empfehlen.

Was soll denn mit dem letztlich aus dem 150MHz erzeugten "Takt" 
passieren? Wo und wofür wird der verwendet?

von Daniel G. (kaffekanne)


Lesenswert?

Schon mal Danke für die Antworten!

Lothar Miller schrieb:
> Was soll denn mit dem letztlich aus dem 150MHz erzeugten "Takt"
> passieren? Wo und wofür wird der verwendet?

Der soll ein LFSR takten, welches dann mit einer der zehn Bitraten 
(Taktraten) eine pseudo-Zufallszahl rausgibt. Und das ist auch der 
einzige Prozess, der damit versorgt wird.

Ich hab den Artikel Taktung FPGA/CPLD schon einige Male gelesen. Aber 
scheinbar überles ich da was wichtiges.

von D. I. (Gast)


Angehängte Dateien:

Lesenswert?

Lothar Miller schrieb:
> Am einfachsten ist es, mit genau 1 Takt auszukommen. Das gelingt in
> sehr vielen Fällen und dieses Vorgehen ist besonders Anfängern zu
> empfehlen.

Ich gebe gerade dem kleinen Bruder eines Freundes etwas Nachhilfe in 
VHDL. Er hat sich an mich gewandt da seine Schaltung (die 
algorithmisch/simulativ gesehen ok war) nicht in Hardware funktioniert 
hat.

Das Skriptum (insbesondere Versuch 4) lässt einen schon die Fußnägel 
hochrollen.
Ach ja, Timing constraints? Nie gehört!

Aber zum Bestehen des Scheins muss hinterher alles in Hardware laufen, 
... bei den Practices eher Glückssache :)

von Bronco (Gast)


Lesenswert?

Daniel G. schrieb:
> Ich hab den Artikel Taktung FPGA/CPLD schon einige Male gelesen. Aber
> scheinbar überles ich da was wichtiges.

Es macht einen Unterschied, ob man das macht:
1
process (Clock1) begin
2
  if rising_edge(Clock1) then 
3
    Clock2 <= ...
4
5
process (Clock2)
6
  if rising_edge(Clock2) then
7
  ...

oder das
1
process (Clock1) begin
2
  if rising_edge(Clock1) then 
3
    Enable2 <= ...
4
5
process (Clock1)
6
  if rising_edge(Clock1) then
7
    if (Enable2) then
8
    ...

Der erste Fall ist "Gated Clock" und problematisch, weil Clock1 und 
Clock2 eine Phasenverschiebung haben.
Der zweite Fall ist "Clock Enable" und unproblematisch, weil beide 
Prozesse mit Clock1 laufen und daher immer perfekt synchron sind.

von Lattice User (Gast)


Lesenswert?

Daniel G. schrieb:
> Ich hab den Artikel Taktung FPGA/CPLD schon einige Male gelesen. Aber
> scheinbar überles ich da was wichtiges.

Offensichtlich

Das LFSR bekommt einen festen Takt.
Ein zusätzlicher Clock Enable Input bestimmt wann das LFSR 
weitergeschaltet wird. Das Clock Enable ist nur bei jedem n.ten Takt 
aktiv, wobei "n" dann den "Takt" des LFSR bestimmt.

Dann kann der Synthesier das bei jedem einzelenen FF im FPGA vorhandene 
CE verwenden.
Vorteil: EIN Takt, und als Folge einfache Constraints.

von Daniel G. (kaffekanne)


Lesenswert?

Also um das nochmal schnell mit meinen eigenen Worten zu sagen (mal 
sehen ob ich's jetzt hab):
Ich führe den Oszillator-Takt direkt in den LFSR-Prozess. Und dann 
bestimme ich durch einen CE, nach jeweils wievielen Taktflanken das LFSR 
reagieren soll.

Also wenn ich mit 150MHz arbeite und bspw. 1MHz LFSR-Taktung haben will, 
dann lasse ich einen Zähler bis 150MHz laufen und CE aktivieren, oder?
Wie würde das denn funktionieren, wenn auch "ungerade" Takte dabei 
wären? z.B. 8,192MHz?

Es gibt ja nun zehn verschiedene CE-Werte. Wie selektiere ich die am 
geschicktesten von außerhalb des Prozesses? Einfach die zehn Werte in 4 
Bit coieren und durch "case" abfragen?

Nochmals vielen Dank an euch!

von D. I. (Gast)


Lesenswert?

Daniel G. schrieb:
> Also wenn ich mit 150MHz arbeite und bspw. 1MHz LFSR-Taktung haben will,
> dann lasse ich einen Zähler bis 150MHz laufen und CE aktivieren, oder?

Ja

> Wie würde das denn funktionieren, wenn auch "ungerade" Takte dabei
> wären? z.B. 8,192MHz?

Garnicht.

von Daniel G. (kaffekanne)


Lesenswert?

D. I. schrieb:
>> Wie würde das denn funktionieren, wenn auch "ungerade" Takte dabei
>> wären? z.B. 8,192MHz?
>
> Garnicht.

Hm.. verdammt. Wieso muss alles einen Haken haben? :P
Also müsste man für diesen Fall dann doch noch einen separaten 
PLL-Ausgang legen?

von D. I. (Gast)


Lesenswert?

Daniel G. schrieb:
> Hm.. verdammt. Wieso muss alles einen Haken haben? :P
> Also müsste man für diesen Fall dann doch noch einen separaten
> PLL-Ausgang legen?

Und welches Teilerverhältnis willst du bei der PLL einstellen um von 150 
MHz auf 8,192 MHz zu kommen?

von Lattice User (Gast)


Lesenswert?

Daniel G. schrieb:
> Also wenn ich mit 150MHz arbeite und bspw. 1MHz LFSR-Taktung haben will,
> dann lasse ich einen Zähler bis 150MHz laufen und CE aktivieren, oder?

Ja

> Wie würde das denn funktionieren, wenn auch "ungerade" Takte dabei
> wären? z.B. 8,192MHz?

Am einfachsten den Grundtakt als kleinstes gemeinsames Vielfaches aller 
Wunschtakte wählen.
Wenn das nicht geht und 7 nsec Jitter (bei 150MHz Grundtakt) kein 
Problem sind, sich eine Scheibe bei DDC abschneiden.

>
> Es gibt ja nun zehn verschiedene CE-Werte. Wie selektiere ich die am
> geschicktesten von außerhalb des Prozesses? Einfach die zehn Werte in 4
> Bit coieren und durch "case" abfragen?

Ich würde den Teiler rückwerts zählen lassen, und den Ausgangswert des 
Zählers über case auswählen. Hat auch den Vorteil dass glitchfreies 
Umschalten möglich ist.

von Daniel G. (kaffekanne)


Lesenswert?

Lattice User schrieb:
> Am einfachsten den Grundtakt als kleinstes gemeinsames Vielfaches aller
> Wunschtakte wählen.

Ich glaub, das gestaltet sich schwierig bei 150,100,50,25,...,8.192 und 
32.768 Mb/s. Da werd ich mich wohl mal in DDC einlesen.

Wie schon erwähnt, was beim Umschalten passiert ist egal. Glitches, 
Phasenverschiebung und co. werden ignoriert und erst nach ca. einer 
Sekunde die PRBS-Daten ausgegeben.

von Daniel G. (kaffekanne)


Lesenswert?

D. I. schrieb:
> Und welches Teilerverhältnis willst du bei der PLL einstellen um von 150
> MHz auf 8,192 MHz zu kommen?

Da es nicht auf ITU-Konformität ankommt kann die dritte Nachkommastelle 
auch wegfallen bzw. etwas variieren. Mit z.B. M=15und N=275 käme man auf 
8.18, was völlig ausreicht.

von Bronco (Gast)


Lesenswert?

Jetzt muß ich aber doch noch mal nachhaken.

Daniel G. schrieb:
> Da es aber nicht auf sauberes
> Umschaltverhalten ankommt und nur ein einziger Prozess getaktet wird
> wozu nichts anderes synchron laufen muss

Wenn das korrekt ist und dabei auch wirklich nichts übersehen wurde, 
dann kann er doch den Takt machen, wie er will? Also auch ge-mux-ed und 
ge-gated usw.?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bronco schrieb:
> Wenn das korrekt ist und dabei auch wirklich nichts übersehen wurde,
> dann kann er doch den Takt machen, wie er will?
Letztendlich sollte ein Takt, der großflächiger verwendet wird, aber 
wieder einen Weg ins Taktnetz finden, dann sonst wird der quer durchs 
FPGA irgendwie verdrahtet und hat dementsprechende 
Laufzeitverschiebungen (Skew).

Lattice User schrieb:
> sich eine Scheibe bei DDC abschneiden.
Ist das das, was ich als DDFS kenne? Das hätte ich nämlich auch 
vorgeschlagen. Und dann weiter mit Clock-Enables arbeiten. Denn auf dem 
FPGA ist doch sicher noch irgendwas anderes auch, das mit 150MHz 
läuft...

von Bronco (Gast)


Lesenswert?

Lothar Miller schrieb:
> Letztendlich sollte ein Takt, der großflächiger verwendet wird, aber
> wieder einen Weg ins Taktnetz finden.

Wenn ich diesen Takt über einen BUFG führe, wäre das aber gegeben, oder?

von hoppel (Gast)


Lesenswert?

> Das Skriptum (insbesondere Versuch 4) lässt einen schon die Fußnägel
> hochrollen.
> Ach ja, Timing constraints? Nie gehört!

Ja, dem Professor sollte man mal etwas ueber gated clock und
Takteilung erzaehlen, kein Wunder das es hier immer
wieder falsch gemacht wird, es wird ja so gelehrt...

hoppel

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bronco schrieb:
> Wenn ich diesen Takt über einen BUFG führe, wäre das aber gegeben, oder?
Ob mit oder ohne BUFG: sowas ist bestenfalls der allerletzte Notnagel, 
an dem ich mich aufhängen kann...

von Daniel G. (kaffekanne)


Lesenswert?

Lothar Miller schrieb:
> dann sonst wird der quer durchs
> FPGA irgendwie verdrahtet und hat dementsprechende
> Laufzeitverschiebungen (Skew).

Die Laufzeitverschiebung macht aber wirklich nichts aus in meinem Fall. 
Hinter dem LFSR kommt nichts mehr und es gibt auch keinen anderen 
Prozess, der die 150MHz verwendet. Es soll ein ganz kleines, simples 
Design werden. Das FPGA wird in diesem Projekt einzig und allein für die 
PRBS-Generierung und deren Takterzeugung verwendet.

Quasi so:

Oszillator -> PLL -> c0 (150MHz)--------------->  MUX0 ->  LFSR Prozess
                                                   ^
                  -> c1 (100MHz)--------------->   |
                           |-------> Teiler0 -->   |
                           |-------> Teiler1 -->   |
                           |-------> Teiler2 -->   |
                           |-------> Teiler3 -->   |
                           |-------> Teiler4 -->   |
                                                   |
                  -> c2 (8.192MHz)------------->   |
                           |-------> Teiler5 -->   |
                                                   |
                  -> c3 (32.768MHz)------------>   |
                                                   |
                                                   |
                                                   --- sel(4bit)

Die Frage: kann man das in meinem Fall so machen? Mir ist bewusst, dass 
das bei großen Designes strunz ist und man viele Probleme bekommt. Aber 
mein Design (oder die Anforderung an das Design) ist vergleichsweise ja 
eher primitiv.

von Lattice User (Gast)


Lesenswert?

Zwei Fragen:

1. Ist der FPGA schon ausgewählt, bzw angedacht?
2. Wenn ja, was ist das für ein FPGA?

Ich hatte bei einen Lattice ECP3 schon mal die Feedbackteiler einer PLL 
in Logik implementiert und programmierbar gemacht.

Ein Lattice MachXO2 hat eine fractional-N PLL, die man über ein Wishbone 
Port programmieren kann.

von Daniel G. (kaffekanne)


Angehängte Dateien:

Lesenswert?

Ich hab mich noch nicht komplett festgelegt, würde aber gerne mit dem 
ALTERA CycloneIII arbeiten weil ich den von der UNI schon kenne.
Mein momentanes Timing-Design hängt an. Die Funktionalität ist schon mal 
gegeben. Aber das hat ja noch nicht viel zu sagen...

von Mux Mäuschen still (Gast)


Lesenswert?

Warum nicht so?

-> c0 (150MHz)--------------->  ->  LFSR Prozess -> Mux 0 \
                                                     |     \
-> c1 (100MHz)--------------->  ->  LFSR Prozess -> Mux 0   \
         |-------> Teiler0 -->  ->  LFSR Prozess -> Mux 0    \
         |-------> Teiler1 -->  ->  LFSR Prozess -> Mux 0     \
         |-------> Teiler2 -->  ->  LFSR Prozess -> Mux 0      \
         |-------> Teiler3 -->  ->  LFSR Prozess -> Mux 0      / Out
         |-------> Teiler4 -->  ->  LFSR Prozess -> Mux 0     /
                                                     |       /
-> c2 (8.192MHz)------------->  ->  LFSR Prozess -> Mux 0   /
         |-------> Teiler5 -->  ->  LFSR Prozess -> Mux 0  /
                                                     |    /
-> c3 (32.768MHz)------------>  ->  LFSR Prozess -> Mux 0/
                                                     |
                                                  Sel(3..0)


Da ein LFSR wohl nahezu Null HW Ressourcen frisst kannst du es auch 
einfach maherfach ausführen.

Das Mux hinterher ist komplett ungetaktet, was aber höchstens zum 
Umschaltzeitpunkt kurz Probleme macht.

von Lattice User (Gast)


Lesenswert?

Mux Mäuschen still schrieb:
> Warum nicht so?

Gute Idee.
Braucht halt relativ viele Clocktrees.

Ich würde eine kleine Modifikation vorschlagen:

4 LFSR Prozesse, je einer für c1,c2,c3,c4

Die LFSR  Prozesse für c2 und c3 bekommen ein vom jeweiligen Teiler 
generiertes Clock Enable.

von Daniel G. (kaffekanne)


Lesenswert?

Hey Danke!

Das sieht mal nach einer geschickten Lösung aus. Ich werd's mal so 
aufbauen.
Vielen Dank schonmal an alle Beteiligten!

von bko (Gast)


Lesenswert?

Bei Xilinx gibt es extra "clock mux" Primitive:
http://www.xilinx.com/support/answers/19947.htm
wenn man diese hernimmt (statt Mux0), sollte der Takt
glitchfrei und sicher umschaltbar sein, und auf ein
Taktnetzwerk gehen - es sollte doch bei
Altera auch solche clock muxes geben oder?

>Oszillator -> PLL -> c0 (150MHz)--------------->  MUX0 ->  LFSR Prozess
>                                                   ^
>                  -> c1 (100MHz)--------------->   |
>                           |-------> Teiler0 -->   |
>                           |-------> Teiler1 -->   |
>                           |-------> Teiler2 -->   |
>                           |-------> Teiler3 -->   |
>                           |-------> Teiler4 -->   |
>                                                   |
>                  -> c2 (8.192MHz)------------->   |
>                           |-------> Teiler5 -->   |
>                                                   |
>                  -> c3 (32.768MHz)------------>   |
>                                                   |
>                                                   |
>                                                   --- sel(4bit)

von Duke Scarring (Gast)


Lesenswert?

bko schrieb:
> Bei Xilinx gibt es extra "clock mux" Primitive:
> http://www.xilinx.com/support/answers/19947.htm
> wenn man diese hernimmt (statt Mux0), sollte der Takt
> glitchfrei und sicher umschaltbar sein
Die CLKMUX bei Xilinx haben nur zwei Eingänge. Bei zehn Takten wird es 
mit dem Routing im CLK-Tree schon etwas komplexer.

Duke

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.