Forum: FPGA, VHDL & Co. Teiler von 20Mhz auf 16Mhz


von Ralph H. (guru)


Lesenswert?

Wie kann ich in VHDL einen Teiler erstellen, der einen Takt von 20Mhz 
auf 16Mhz runterteilt ? Ich hab nicht mal ansatzweise ne Idee wie ich 
das umsetzen könnte. Vielen Dank !

von Uwe .. (uwegw)


Lesenswert?

Per PLL mal 4, und dann durch 5 teilen.

von Falk B. (falk)


Lesenswert?

@  Ralph H. (guru)

>Wie kann ich in VHDL einen Teiler erstellen, der einen Takt von 20Mhz
>auf 16Mhz runterteilt ?

So, wie du es haben willst, also einen schönen 16 MHz Takt mit 50% 
Tastverhältnis, geht nicht. Kauf dir einen passenden Quarzoszillator.

>Ich hab nicht mal ansatzweise ne Idee wie ich
>das umsetzen könnte. Vielen Dank !

Man kann mit dem 20 MHz per State Machine ein Clock enable erzeugen, das 
nach 4 Takten einmal aussetzt, macht 4/5 * 20 MHz = 16 MHz ;-)
Nennt der Angelsache gapped clock (enable).

MfG
Falk

von Ralph H. (guru)


Lesenswert?

@ Falk... na das klingt doch gut :-) Ich brauch zum Testen nicht 
zwingend ein Tastverhältnis von 50% beim Takt. Wie könnte sowas aussehen 
?

von Falk B. (falk)


Lesenswert?

@Ralph H. (guru)

>@ Falk... na das klingt doch gut :-) Ich brauch zum Testen nicht
>zwingend ein Tastverhältnis von 50% beim Takt. Wie könnte sowas aussehen
>?

Dass sowas jemand wie du mit den Nickname fragen muss . . .?
1
process(clk)
2
begin
3
  if rising_edge(clk) then
4
    cnt <= cnt+1;
5
    ce <= '1'; 
6
    if cnt=4 then
7
      cnt <= 0;
8
      ce <= '0';
9
    end if;
10
  end if;
11
end prosess;

MfG
Falk

von Ralph H. (guru)


Lesenswert?

Dankeschön.. hätte nicht gedacht das es so einfach ist :-)

> Dass sowas jemand wie du mit den Nickname fragen muss . . .?
Du für den Nick hab ich mich hier bei meinen ganzen Fragen ehrlich schon 
geschämt ;-).. grins aber das ist nun mal mein Cosename :D

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


Lesenswert?

> Wie könnte sowas aussehen
Aber jetzt bitte nicht den ce als Takt nehmen, sondern wie der Name 
nahelegt: als Clock Enable.

von Ralph H. (guru)


Lesenswert?

Jo Lothar.. wenigstens das hab ich so erkannt. :-)
Manchmal aber ist wirklich ne ganz einfache Lösung so nah, dass man sie 
vor lauter Grübeln gar nicht sieht. Und dafür gibt es zum Glück solche 
hilfreichen Menschen wie Euch !! :-) Danke dafür !!

von Falk B. (falk)


Lesenswert?

@  Ralph H. (guru)

>Du für den Nick hab ich mich hier bei meinen ganzen Fragen ehrlich schon
>geschämt ;-).. grins aber das ist nun mal mein Cosename :D

http://de.wikipedia.org/wiki/Selbstironie#Selbstironie

;-)

von Ralph H. (guru)


Lesenswert?


von Anguel S. (anguel)


Lesenswert?

Ralph H. schrieb:
> Und dafür gibt es zum Glück solche
> hilfreichen Menschen wie Euch !! :-) Danke dafür !!

Also ich finde Deine Fragen gar nicht so schlecht :) Ich denke die sind 
auch für andere hilfreich. Danke dafür ;)

von df1as (Gast)


Lesenswert?

Der Trick, jeden n-ten Clock auszulassen (dabei müsste n nicht einmal 
ganzzahlig sein), ist sicher sehr einfach zu realisieren und wenn es zum 
Ziel führt, spricht nichts dagegen (Variante a).

Die "Aussetzer" sind allerdings schon 2 Taktperioden lang (1 
Extrapause). Man könnte das - leider nur mit deutlichem Aufwand - 
doppelt so gut realisieren mit 1,5 Taktperioden, bzw. 0,5 Takten 
Extrapause (Variante b):

     _   _   _   _   _   _   _   _   _   
_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ 20 MHz

     _   _   _       _   _   _   _       
_/ \_/ \_/ \_/ \_____/ \_/ \_/ \_/ \_____/ \_ 16 MHz a)

     _     _   _     _   _     _   _     
_/ \_/ \___/ \_/ \___/ \_/ \___/ \_/ \___/ \_ 16 MHz b)


Man muss dazu voraussetzen, dass der 20-MHz-Clock annähernd mit 50% Duty 
anliegt. Außerdem müsste dieser neue Clock kombinatorisch erzeugt 
werden. Das ergibt eine neue Clock-Domäne mit ihren Problemen.

Ist also keine Empfehlung, weil zu kompliziert - wäre aber eine mögliche 
Verbesserung des Timings.

von df1as (Gast)


Lesenswert?

Die Grafik wird hier nicht richtig wiedergegeben. Im Editorfenster sah 
es noch ok aus. Aus einem Underline-Zeichen wird eine 
Underline-Anweisung.

Zweiter Versuch als "Code":
1
   _   _   _   _   _   _   _   _   _   _   _ 
2
 _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ 20 MHz
3
4
   _   _   _   _       _   _   _   _       _ 
5
 _/ \_/ \_/ \_/ \_____/ \_/ \_/ \_/ \_____/ \_ 16 MHz a)
6
7
   _   _     _   _     _   _     _   _     _ 
8
 _/ \_/ \___/ \_/ \___/ \_/ \___/ \_/ \___/ \_ 16 MHz b)

von df1as (Gast)


Lesenswert?

Na ja ...

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


Lesenswert?

df1as schrieb:
> Zweiter Versuch als "Code":
Probiers mal mit [ pre ] und [ /pre ]...
1
   _   _   _   _   _   _   _   _   _   _   _ 
2
 _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ 20 MHz
3
4
   _   _   _   _       _   _   _   _       _ 
5
 _/ \_/ \_/ \_/ \_____/ \_/ \_/ \_/ \_____/ \_ 16 MHz a)
6
7
   _   _     _   _     _   _     _   _     _ 
8
 _/ \_/ \___/ \_/ \___/ \_/ \___/ \_/ \___/ \_ 16 MHz b)

Die eigentliche Idee ist aber, diesen neuen "Takt" nicht tatsächlich als 
Takt, sondern als Clock-Enable zu nutzen, und da sieht das dann eher so 
aus:
1
   _   _   _   _   _   _   _   _   _   _   _ 
2
 _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_ 20 MHz
3
4
    _______________     _______________     ___ 
5
 __/               \___/               \___/   16 MHz Enable a)

von Michael H. (michael_h45)


Lesenswert?

df1as schrieb:
> Na ja ...
ist ja nicht so, als gäbs hier einen vorschau-button...
oder einen link mitten im augenschein, der auf Formatierung zeigt...

von df1as (Gast)


Lesenswert?

Ja klar. Aber wie soll ich ahnen, dass ein Undescore-Zeichen etwas 
anrichtet? Ist für mich bis hierher immer ein Zeichen gewesen, dass man 
ohne Seiteneffekte in den Text werfen durfte. Zum Unterstreichen hätte 
ich
1
<u> </u>
 oder ähnlich vermutet. An eine Vorschau habe ich daher nicht 
ansatzweise gedacht. Mein Fehler - man muss einfach mit allem rechnen!

Zum Thema: Das mit dem Clock-Enable ist ja bereits ganz gut. Nur wenn es 
um minimalen Jitter geht, ist man um den Faktor 2 besser, wenn man beide 
Flanken ausnutzt und einen neuen Clock generiert. Solange der 
ursprüngliche Clock für nichts anderes benutzt wird, hätte es auch keine 
weiteren Seiteneffekte, wie erforderliche Synchronisierungsstufen etc. 
Auf einen Clock-Netztreiber kommt man von der nötigen Kombinatorik auch 
wieder bei den meisten FPGA - und alles unter der Prämisse 'keine PLL'. 
Die hat auch ihre Nachteile.

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


Lesenswert?

df1as schrieb:
> Aber wie soll ich ahnen, dass ein Undescore-Zeichen etwas
> anrichtet?
Wenn du sowas schreibst:
1
*ein Stern* schreibt hier im Forum *FETT*
2
/ein Slash/ schreibt  /kursiv/
3
ein Underline schreibt _unterstrichen_
4
_ein Underline_ schreibt _unterstrichen_
Kommt sowas raus:
ein Stern schreibt hier im Forum FETT
ein Slash schreibt  kursiv
ein Underline schreibt unterstrichen
ein Underline_ schreibt _unterstrichen

Und wie man sieht, geht es am ehesten beim Underline schief. Da wird der 
Anfang und das Ende der Formatierung nicht so ohne weiteres erkannt... 
:-o

df1as schrieb:
> Nur wenn es um minimalen Jitter geht, ist man um den Faktor 2 besser,
> wenn man beide Flanken ausnutzt und einen neuen Clock generiert.
Richtig, aber es gibt keine FFs, die auf beide Flanken triggern können, 
und so wird das eine üble kombinatorische Bastelei. Das ist in 
programmierbaren Bausteinen nach Möglichkeit zu vermeiden...

von df1as (Gast)


Lesenswert?

Was ist an der Kombinatorik für ein neues Clock-Signal so 'übel'?

Immerhin braucht es damit in allen angeschlossenen Funkhäusern kein 
Clock-Enable mehr. Das Clock-Enable zieht sich ja durch alle 
angeschlossenen Prozesse hindurch. Müsste man also immer wieder 
hinschreiben ...

von df1as (Gast)


Lesenswert?

Das Clock-Enable wird meist nicht über ein Clock-Netz verteilt. Ist zwar 
auch unkritisch, weil es fast eine ganze Clock-Periode Skew haben darf, 
verbraucht aber ggf. auch mehr Ressourcen (je nach Fan-out) als eine 
kleine, nur einmal vorhandene Kombinatorik für ein neues Clock-Signal 
(wenn es dann das einzige ist).

von modem (Gast)


Lesenswert?

df1as schrieb:
> Was ist an der Kombinatorik für ein neues Clock-Signal so 'übel'?

Es gibt 2 Gründe:
- Clock Skew. In Clock-Netzwerken sind die Leitungen schön ausbalanciert 
und mit starken Treibern versehen, so dass das Clocksignal überall 
gleichzeitig ankommt und eine Steile Flanke aufweist.
- Hazards: Logikschaltungen können bei einer Änderung am Eingang mehrere 
Flanken am Ausgang erzeugen. Dadurch hast du also mehrere Taktsignale. 
(Genaueres findest du sicher in der Wikipedia.)

df1as schrieb:
> Das Clock-Enable wird meist nicht über ein Clock-Netz verteilt. Ist zwar
> auch unkritisch, weil es fast eine ganze Clock-Periode Skew haben darf,

Warnung: Das spielt überhaupt keine Rolle bzw. hilft hier gar nicht! 
Beispiel Schieberegister:

--- FF(1) --- FF(2) --- FF(3)

Bei der Taktflanke übernimmt also jedes Flipflop die Daten, die am 
Ausgang seines Vorgängers anliegen. Wenn der Clock Skew zu gross ist, 
und somit Flipflop(2) seinen Takt deutlich nach Flipflop(1) bekommt, 
dann ist es gut möglich, dass Flipflop(1) seinen Eingang bereits 
übernommen und an den Ausgang weitergeleitet hat. Flipflop(2) übernimmt 
dann also sogar schon Daten, die am Anfang der Taktperiode noch am 
Eingang von Flipflop(1) lagen. (Stichwort: Contamination Delay)

von modem (Gast)


Lesenswert?

modem schrieb:
> df1as schrieb:
>> Das Clock-Enable wird meist nicht über ein Clock-Netz verteilt. Ist zwar
>> auch unkritisch, weil es fast eine ganze Clock-Periode Skew haben darf,

Moment...da habe ich ungenau gelesen. Meine Antwort bezieht sich auf 
'Clock' und nicht 'Clock-Enable', sorry ;-)

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


Lesenswert?

df1as schrieb:
> Das Clock-Enable wird meist nicht über ein Clock-Netz verteilt.
Kein Clock-Enable wird über Taktnetze verteilt. Denn Taktnetze sind für 
Takte da...

> verbraucht aber ggf. auch mehr Ressourcen (je nach Fan-out)
Davon hat das FPGA genug... ;-)

> als eine kleine, nur einmal vorhandene Kombinatorik für
> ein neues Clock-Signal (wenn es dann das einzige ist).
Die allerdings dann garantiert nicht mehr protabel ist, und mit üblen 
Effekten von Glitches bis Spikes daherkommt, und daher auch von der 
Toolchain nicht mehr sauber verwaltet werden kann...

Sowas mache ich nur, wenn mir das Wasser bis Unterkante Oberlippe steht. 
Und das war bisher genau 1 mal... ;-)

von df1as (Gast)


Lesenswert?

Üble Effekte, Glitches, Spikes? Keiner sagt, dass man es falsch machen 
soll! Und was soll dabei nicht "portabel" sein? Kann man doch relativ 
übersichtlich und geschwind in VHDL dahinschreiben.

Mit VHDL wären das ein paar übersichtliche Zeilen, als Schematic 
zusammen eine Handvoll FF und Gatter. Kaum aufwändiger als der 
Bis-fünf-Zähler, der ein CKE generiert, das mit kaum Hold-Time 
daherkommt und an sämtliche (!) angeschlossenen Speicherelemente mit 
verteilt werden muss. Den Bis-fünf-Zähler braucht man in ähnlicher Form 
natürlich sonst auch, das muss aber auch kein Binärzähler sein. Besser 
wäre hier z. B. ein Johnson-Counter, dessen Ausgänge direkt 
kombinatorisch beliebig (und immer glitchfrei!) verküpft werden können.

Man kann immer ein von einem Speicherelement erzeugtes Signal auf der 
richtigen Seite und mit der passenden Logik mit dem Ursprungs-Clock 
vergattern, ohne dass es Glitch gibt. Wenn das nicht ginge, könnte man 
gar keine Speicherelemente bauen. Die Wirkung kommt zum Glück nie vor 
der Ursache.

Synchron tut ja ganz gut, aber man kann es auch mal schnell falsch 
verstehen. Ich sehe in einem generierten Clock nur den einen Nachteil, 
wenn nämlich BEIDE Clocks (hier 20 MHz UND 16 MHz) verwendet werden 
müssen. Ansonsten vereinfachte sich die ganze Geschichte sogar.

von modem (Gast)


Lesenswert?

df1as schrieb:
> Ich sehe in einem generierten Clock nur den einen Nachteil,

Also wie gesagt: Clock muss über ein Clock-Netz verteilt werden, 
ansonsten handelt man sich die von mir oben genannten Probleme mit Skew 
und verletztem Contamination Delay ein.

Wenn man sehr genau weiss, was man tut, dann kann man Clock 
kombinatorisch verschalten bzw. erzeugen. "Gated Clock" kennen wir ja 
beispielsweise auch von Prozessoren, die einen Teil ihrer Logik bei 
Nichtbenutzung auschalten können. Aber man sollte sich dann im Minimum 
vergewissern, dass keine Spikes, Glitches etc. auftreten können, und 
zwar bis hinunter zu den Details der Synthese.

von df1as (Gast)


Lesenswert?

Ja wie? Generierte Clocks können etwa NICHT in ein Clock-Netz 
eingespeist werden? Merkwürdig, sehr merkwürdig ...

von Roland (Gast)


Lesenswert?

DCM und fertig! Ein Takt ist ein Takt und kein Enable wie oben 
diskutiert wird.

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.