Forum: FPGA, VHDL & Co. Ist diese Erzeugung des Clocks "erlaubt"?


von Michael F. (mifi)


Lesenswert?

Hallo zusammen,

es wird immer von synchronen Design gesprochen. D.h alle FF sollen
mit dem gleichen CLK betrieben werden. bei einem UART wird z.B. das
Nutzsignal mit einer 16 fach höheren CLK abgetastet. Oder anders,
das eigentliche Bit hat eine Breite von f/16. Ich hoffe das ist
verständlich ausgedrückt. Wo drauf ich hinaus will ist die Xilinx
App xapp339, "Manchester Encoder-Decoder". Wenn ich mir den Verilog
Source anschaue (md.v) arbeiten die einzelnen Teile mit einem clk16x.
Dieser wird über einen Counter durch 16 geteilt:

always @(posedge clk16x or posedge rst)
begin
  if (rst)
    cnt = 4'b0 ;
  else
    cnt = cnt + 1 ;
end

assign clk1x = cnt[3];

Später wird dieser neue Clock (clk1x) für weitere Module verwendet.

always @(posedge clk1x or posedge rst)
begin
  // do something here
end

Ist das die richtig Art, oder sollte man hier lieber mit einer Art
Clockfreigabe arbeiten?

always @(posedge clk16x or posedge rst)
begin
  if (rst)
    cnt = 4'b0 ;
  else if (cnt < 16)
    cnt    = cnt + 1;
    clk_en = 0;
  else
    cnt    = 0;
    clk_en = 1;
end

always @(posedge clk16x or posedge rst)
if (rst)
begin
  // reset
end
else if (clk_en) begin
  // do something here
end

Ja ich weis, im Beispiel wir ein asynchroner RESET verwendet was
auch nicht schön ist.

Viele Grüße,
Michael

von Jan M. (mueschel)


Lesenswert?

Michael Fischer schrieb:

> Wo drauf ich hinaus will ist die Xilinx
> App xapp339, "Manchester Encoder-Decoder". Wenn ich mir den Verilog
> Source anschaue (md.v) arbeiten die einzelnen Teile mit einem clk16x.
> Dieser wird über einen Counter durch 16 geteilt:
> Später wird dieser neue Clock (clk1x) für weitere Module verwendet.

> Ist das die richtig Art, oder sollte man hier lieber mit einer Art
> Clockfreigabe arbeiten?

Du musst beachtet, dass sich diese Application Note auf CPLDs bezieht - 
dort ist das durchaus gängige Praxis. In FPGA sollte man aber die von 
dir beschriebene Version mit clock-enable Signalen bevorzugen, sonst hat 
man am Ende relativ große Probleme mit dem Timing.

> Ja ich weis, im Beispiel wir ein asynchroner RESET verwendet was
> auch nicht schön ist.

Richtig, das sollte man im FPGA auch vermeiden. Hängt aber auch sehr vom 
Hersteller ab - Lattice hat in seinen FPGA beispielsweise einen (einen, 
nicht mehr!) globalen, asynchronen Resetpfad zu allen Komponenten.

von Michael F. (mifi)


Lesenswert?

Hallo Jan,

Danke für die Erklärung. D.h. aber auch das ich auf der sicheren Seite
bin wenn ich versuche bei CPLDs die gleiche Vorgehensweise zu benutzen
wie bei FPGAs.

Gruß,
Michael

von Harald F. (hfl)


Lesenswert?

Na ja, ganz so hart würde ich mit diesem erzeugten Takt nicht ins 
Gericht gehen wollen. Es ist durchaus in Ordnung, innerhalb eines 
FPGA-Designs mehrere unterschiedliche Takte zu verwenden. Man muss nur 
wissen, was man da tut und die nötigen Maßnahmen an den Übergängen 
zwischen den Taktdomänen ergreifen. Aber dann ist das ok. Ein einzelner, 
schneller Takt der überall im Design nur zusammen mit einem 
Freigabesignal verwendet wird, kann auch mal nachteilig sein, z.B. bei 
der Leistungsaufnahme.

Grüße,
Harald

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


Lesenswert?

Harald Flügel schrieb:
> Ein einzelner, schneller Takt der überall im Design nur zusammen mit
> einem Freigabesignal verwendet wird, kann auch mal nachteilig sein,
> z.B. bei der Leistungsaufnahme.
Hmmm....
Gerade der Leistungsaufnahme ist es (relativ) egal, wie oft der Takt 
verwendet wird. Denn nur FFs, die tatsächlich schalten, brauchen auch 
Strom. Ok, ein wenig mehr Verluste hast du, wenn du statt nur 1/4 vom 
Taktnetz das ganze Taktnetz bestromen mußt, aber ich stelle hinter 
dieses Argument ein Fragezeichen.

Allerdings muß ganz ohne Frage der letze Pfad von der 
Enable-Kombinatorik bis zu allen beteiligten FFs ausreichend schnell 
sein, dass ein Enable rechtzeitig/gleichzeitig an allen FFs ankommt. Und 
das kann bei einer unnötig hohen Taktfrequenz schon mal Probleme 
geben... (und hoffentlich war dann wenigtens das Clock-Constraint 
gesetzt)

von MCUA (Gast)


Lesenswert?

>D.h. aber auch das ich auf der sicheren Seite bin wenn ich versuche bei
>CPLDs die gleiche Vorgehensweise zu benutzen wie bei FPGAs.
Ja, weil das Clk-Verteil-Problem bei CPLD/FPGA prinzip. das Gleiche ist.
(Und man mit möglichst guter Clk-Verteilung u. Enab-Sign rel grossen 
Freiraum hat)

von Michael F. (mifi)


Lesenswert?

Hallo Harald,

>Na ja, ganz so hart würde ich mit diesem erzeugten Takt nicht ins
>Gericht gehen wollen. Es ist durchaus in Ordnung, innerhalb eines
>FPGA-Designs mehrere unterschiedliche Takte zu verwenden. Man muss nur
>wissen, was man da tut und die nötigen Maßnahmen an den Übergängen
>zwischen den Taktdomänen ergreifen.

Und das ist genau mein Problem!

Als C Programmierer der etwas mehr mit HDL machen möchte fehlen mir
hier einfach noch die Grundlagen welche über eine einfach 
kombinatorische Schaltung hinausgehen.

Ich habe hier mehrere Bücher unter anderem das immer wieder empfohlene
Buch "VHDL-Synthese Entwurf digitaler Schaltungen und Systeme". Aber so
richtig kann ich mich mit VHDL nicht anfreunden. Darum habe ich mal
einen Blick auf Verilog geworfen und mir folgendes Buch besorgt,
"FPGA-Design mit Verilog"

Harald, kann es sein das Du hier der Autor bist? ;o) Als C Programmierer 
komme ich mit dem Buch/Sprache (Verilog) besser zurecht. Wobei an 
einigen Stellen hier auch noch die Fragezeichen auftauchen.

Lothar hat geschrieben:
>Und das kann bei einer unnötig hohen Taktfrequenz schon mal Probleme
>geben... (und hoffentlich war dann wenigtens das Clock-Constraint
>gesetzt)

Man liest die Info über die Clock-Constraints immer wieder. Aber für
jemanden der sich HDL im Selbststudium beibringen möchte sind die
Grundlagen etwas umständlich/schwer zu erlernen. Ich kenne Lothar seine
Seite, wo schon viel erklärt wird, aber ich glaube hier muss man schon
einen bestimmtem Level überschritten haben.

Bei der Software ist es einfacher, hier gibt es den klassischen Debugger
wo man die Probleme suchen kann. Bei HDL ist das dann eher der
Logic Analyzer. Ich habe selber mal versucht den Anwender eine ARM 
Toolchain näher zu bringen, http://www.yagarto.de/ , und entsprechende 
kleine Beispiele und HowTo Seiten erstellt.

Vielleicht gibt es so eine Art Seite auch für "HDL-DAUs" die noch mehr
in die Grundlagen eingeht als Lothar seine Seite? Mit den Grundlagen
meine ich jetzt nicht was ist ein NAND oder FF, sondern eher noch
die Hintergrundinformationen wie z.B. Clock-Constraint.

Viele Grüße,
Michael

von MCUA (Gast)


Lesenswert?

>Als C Programmierer der etwas mehr mit HDL machen möchte fehlen mir
>hier einfach noch die Grundlagen welche über eine einfach
>kombinatorische Schaltung hinausgehen.
Musst dir halt grundl. Digit-Schaltungen, komb...seq.Logic anguggen 
(<>C!). HDL kommt erst danach.

von Harald F. (hfl)


Lesenswert?

Hallo Michael,

ich weiß schon, dass das Erlernen des "Modellierens einer digitalen 
Schaltung" nicht ganz ohne ist. Und wenn man außer dieser neuen 
Vorgehensweise auch noch eine krätzige Sprache wie VHDL lernen muss, 
dann ist das doppelt schwer. Das war der Grund warum ich dieses Buch 
geschrieben habe. Die syntaktische Nähe von Verilog und C ist sicherlich 
eine Hilfe, aber man muss trotzdem lernen, dass das, was man da 
hinschreibt, kein Programm sondern ein Modell ist, eine Beschreibung für 
eine Schaltung aus Gattern und Flipflops.
Die Flipflops haben die nicht wegzudiskutierenden Eigenschaft, dass sie 
in einer Zeitspanne vor und nach der relevanten Taktflanke keine 
Änderung des Eingangssignals verkraften. Das muss verhindert werden. 
Wenn da trotzdem eine Änderung auftritt, dann ist das Ausgangssignal für 
eine kurze Zeit undefiniert. Timing Constraints sind dazu da, dem 
Synthesetool Taktinformationen zu geben. Damit kann es die 
Gatterschaltung zwischen zwei Flipflop der gleichen Taktdomäne so 
optimieren, dass diese Zeitbedingung eingehalten wird.

Ach und noch 'was:

Michael Fischer schrieb:
> Bei der Software ist es einfacher, hier gibt es den klassischen Debugger
> wo man die Probleme suchen kann. Bei HDL ist das dann eher der
> Logic Analyzer.

Nein, es ist der Simulator. Und ich würde dir von Anbeginn an raten, 
deine FPGA-Designs im Simulator zu testen, bevor Du sie ins FPGA 
bringst.

Grüße,
Harald

p.s. hast Du dir die Beispieldesigns runtergeladen?

von Uwe Bonnes (Gast)


Lesenswert?

So wie oben formuliert
assign clk1x = cnt[3];
sind die Flanken von clk1x und clk16x phasenverschoben, denn nach der 
clk16x Flanke muss das Signal noch die clock-to-output Verzoegerung im 
clk16x synchronen Teiler, die Verzoegerung im clock Puffer und die 
Verzoegerung im clocknety durchlaufen. Wenn jetzt etwas, was in clk16x 
passiert, mit clk1x abtastet wird , kann sich der Ausgang mit clk16x 
schon geaendert haben bevor die Flanke in clk1x kommt, und umgekehrt. 
Damit haette man das typische Problem beim Uebergang in den Clock 
Domains.
Wenn man statt des Teiler eine DCM/PLL verwendet, wuerden bei richtiger 
Beschaltung  durch die DCM/PLL die Flanken aneinander angepasst und 
alles ist in Ordnung.

Beim FPGA Design bringt das aber nur etwas in der Leistungsaufnahme, da 
die Last auf dem schnellen Takt verringert wird. Ausserdem kann es das 
Schreiben der Randbedingungen (Constraints) vereinfachen, wenn Netze in 
clk1x sehr lang werden und die Durchlaufzeit laenger als clk16x wird. 
Arbeitet man mit einem Clock Enable, muss man dann fuer jedes dieser 
Netze spezielle Multiclock Contraints (oder wie sie auch heissen) 
schreiben.

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


Lesenswert?

Michael Fischer schrieb:
> Man liest die Info über die Clock-Constraints immer wieder.
Sagen wir mal so: wenn du ein Ideal-Design hast (nur 1 Takt), dann hast 
du nur 1 Constraint auf genau diesen Takt. Und damit sagst du der 
Toolchain:

Sorge doch bitte gefälligst dafür, dass alle Logikpfade zwischen 2 
Flipflops im FPGA so kurz sind, dass die Laufzeit (durch die 
Verbindungen/Routing und die Kombinatorik) dazwischen diese Taktfrequenz 
ermöglicht.

Hier eine kleine Skizze zum Thema:
1
... ---[FF1]--Kombinatorik--[FF2]---  ...
2
         |                    |
3
clk ... -o--------------------o----   ...  
4
5
         |  |              |  |   |
6
...      tco     tpd       tsu tco    ...
Die maximale Taktfrequenz ist also 1/(tco+tpd+tsu).
Hier eine Erklärung zu den Kürzeln: 
Beitrag "Re: Wie viel sind 304Mhz denn wirklich?"
Und weil tco (Clock to Output) und tsu (Setup) fest in die Flipflops 
eingebaut sind, kann die Toolchain nur noch was an der tpd (Propagation 
Delay) drehen. Dein Clock-Constraint betrifft also die maximale 
Logiktiefe zwischen 2 Flipflops (z.B. Und, Oder, MUX, Addierer, 
Multiplizierer...).

von Hagen (Gast)


Lesenswert?

> kann die Toolchain nur noch was an der tpd (Propagation
> Delay) drehen
clock skew bei PLLs nicht unterschlagen

von gollum (Gast)


Lesenswert?

da kann halt aufgrund der Streukapazitäten im FPGA dein Hund krank 
werden. Hunde reagieren sehr empfindlich auf Taktunterschiede!

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.