Forum: FPGA, VHDL & Co. Takt ausgeben


von Sebastian B. (sfreak) Benutzerseite


Lesenswert?

Moin,

ich habe in den letzten Wochen ein bisschen mit VHDL rumgespielt und 
will jetzt mal was "richtiges" bauen, ein altes Laptop-TFT soll 
angesteuert werden. 1024x768, 64Mhz Pixeltakt. Mit nem Blackfin DSP hab 
ich das schon mal gebaut und es funktioniert, nun will ich es mit dem 
FPGA (Xilinx Spartan-3A) versuchen.

Im scheitere aber schon an der Takterzeugung. Hab diverse von den 
Takt-bezogenen Threads gelesen aber keine direkte Antwort auf meine 
Frage gefunden. Fuer Hinweise waere ich dankbar:

Ich habe auf meinem FPGA-Evalboard einen 16Mhz Oszillator an einem der 
Takteingaenge, den fuehre ich an einen DCM um ihn zu vervierfachen, den 
CLKFX_OUT benutze ich als Takt fuer meine ganze Logik.

Nun will ich diesen Takt auch als Pixeltakt fuer den externen 
LVDS-Treiber ausgeben. Wenn ich den Takt einfach an einen normalen 
Ausgangstreiber anschliesse bekomme ich die Meldung
1
WARNING:Route:455 - CLK Net:clk_64mhz_i may have excessive skew because 
2
      0 CLK pins and 1 NON_CLK pins failed to route using a CLK template.

Das Taktnetz an einen normalen Ausgang anzustoepseln ist also wohl keine 
so gute Idee. Nun habe ich hier im Forum von DDR Ausgaengen gelesen die 
man dafuer benutzen soll. Habe aber so auf Anhieb nichts weiteres dazu 
gefunden. Stimmt das? Wie kann ich die in VHDL einbauen?

Hoffe das ergibt ein bisschen Sinn :-)
Sebastian

von Sebastian B. (sfreak) Benutzerseite


Lesenswert?

Moin,

hab mit Hilfe eines Kollgen ein bisschen Info gefunden:

http://duteela.et.tudelft.nl/~elca/XilinxTutor/documents/ds099-2.pdf 
(Seite 3), demnach kann ich diese Komponente verwenden:
http://toolbox.xilinx.com/docsan/xilinx7/books/data/docs/lib/lib0299_285.html

Hab noch nicht ganz Durchblick wie das funktioniert. Werde das aber mal 
ausprobieren und weiterlesen :-)

Sebastian

von Joko (Gast)


Lesenswert?

Moin,

> WARNING:Route:455 - CLK Net:clk_64mhz_i may have excessive skew because
>   0 CLK pins and 1 NON_CLK pins failed to route using a CLK template.

'funktionieren' wird das Design in den allermeisten Fällen - nur nicht 
zu 100% 'sauber':
Wenn Du die Daten für Deinen LVDS-Treiber mit IOB-FFs erzeugst, werden 
sich alle Bits annäherd zur gleichen Zeit ändern.
Vorteil: wenig Skew zwischen den Datenbits -> sauberes Timing zum 
LVDS-Chip einfach machbar.
Nachteil: ggf. SSO-Probleme, da sich alle Bits gleichzeitig ändern, und 
sich damit u.U. Ground-Bounce im FPGA ergibt. (Hier muß der Anwender 
halt abwägen)
Verwendet man die IOB-FFs für die Daten, so sollte man den gewonnenen 
Vorteil auch nutzen, und ihn nicht durch undefiniertes Timing zwischen 
Daten und Clock wieder kaputt machen -> daher auch für die Clock IOB-FFs 
verwenden, da dann auch hier mit einem 'ähnlichen' Timing zu rechnen 
ist.
(Achtung: gleichen Strom/Slew für die Ausgangstreiber verwenden)
Hierzu INSTANZIIERT man dann die DDR-FFs: z.B. FDDRRSE (such mal bei 
Xilinx danach), legt '1' und '0' an die beiden Dateneingäge und treibt 
C0 und C1
a) mit der Clock und ihrer Invertierung => local Clock-Inversion)
b) mit CLK0 und CLK180 aus der DCM

a) spart clock-ressourcen, führt aber zu leicher unsymmetrie des 
Duty-Cycles zum LVDS-Chip
b) bevorzugt, wenn Clock-Ressourcen nicht Mangelware

Gruß
Jochen

von Sebastian B. (sfreak) Benutzerseite


Lesenswert?

Also das DDR-FF habe ich hinbekommen:
1
   inst_OFDDRCPE: OFDDRCPE
2
   port map (
3
      Q => bank0_io(21),     -- Data output (connect directly to top-level port)
4
      C0 => clk_64mhz_i,      -- 0 degree clock input (CLKFX_OUT of DCM)
5
      C1 => clk_64mhz_180_i,  -- 180 degree clock input (CLKFX180_OUT of DCM)
6
      CE => '1',            -- Clock enable input
7
      CLR => '0',          -- Asynchronous reset input
8
      D0 => '1',            -- Posedge data input
9
      D1 => '0',            -- Negedge data input
10
      PRE => '0'           -- Asynchronous preset input
11
   );

Jedenfalls laut behavioral Simulation kommt dabei das Richtige heraus.

@Joko:
So ganz habe ich deinen Beitrag nicht verstanden. Mein DDR-FF ist das 
IOB-FF von dem du sprichst? Wenn ich die Daten jetzt an "normale" IOBs 
haenge passt das Timing zum Takt?

von Joko (Gast)


Lesenswert?

> Mein DDR-FF ist das IOB-FF von dem du sprichst?
jap

> Wenn ich die Daten jetzt an "normale" IOBs haenge passt das Timing zum Takt?

kommt drauf an: ließt Dein LVDS-Chip die Daten mit der fallenden oder 
mit der steigenden Flanke?

Im Moment sieht's so aus, als 'änderten' sich Deine Daten zum gleichen 
Zeitpunkt, an dem Du auch die stiegende Taktflanke an den IOBs 
erzeugst...
wenn der LVDS-Chip mit der fallenden Flanke arbeitet, ist das korrekt.
Andernfalls wüßtest Du die Konstanten an D0 und D1 vertauschen, wodurch 
sich der ausgegebene Takt invertieren würde

Jochen

von Sebastian B. (sfreak) Benutzerseite


Lesenswert?

Hi Jochen,

mit der Taktflanke hast du natuerlich recht. Der LVDS-Chip sampled auf 
der steigenden Flanke.

Vielen Dank fuer die Tips! Mal sehen ob ich den rest jetzt hinbekomme...

Dauert leider noch eine ganze Weile bis ich die Hardware bauen kann. 
Aber zumindest den VHDL-Teil werd ich schonmal angehen.

Sebastian

von Falk B. (falk)


Lesenswert?

@Sebastian B. (sfreak)

>Ich habe auf meinem FPGA-Evalboard einen 16Mhz Oszillator an einem der
>Takteingaenge, den fuehre ich an einen DCM um ihn zu vervierfachen, den
>CLKFX_OUT benutze ich als Takt fuer meine ganze Logik.

16 MHz ist AFAIK zu wenig, die DCM brauchen mind. 24 MHz 
Eingangsfrequenz.

>Das Taktnetz an einen normalen Ausgang anzustoepseln ist also wohl keine
>so gute Idee.

In der Tat. Das Timng ist nicht sonderlich präzise und reproduzierbar.

> Nun habe ich hier im Forum von DDR Ausgaengen gelesen die
>man dafuer benutzen soll. Habe aber so auf Anhieb nichts weiteres dazu
>gefunden. Stimmt das?

Ja.

> Wie kann ich die in VHDL einbauen?

Direkt als Blackbox (Xilinx Primitive) instanzieren. Dann ist auch das 
Timing zu den Daten absolut sauber. Bei Bedarf kann man per 2. DCM den 
Takt für diese DDR-FFs noch in der Phase schieben.

MFG
Falk

von Joko (Gast)


Lesenswert?

@Falk,

  Sebastian sagte in der ursprünglichen Anfrage, er würde einen 
Spartan3A verwenden wollen! Dessen DCMs funktionieren ab 5MHz - 
Andernfalls hätte ich ihn auch gewarnt ;-)

Gruß
Jochen

von Falk B. (falk)


Lesenswert?

@ Joko (Gast)

>Spartan3A verwenden wollen! Dessen DCMs funktionieren ab 5MHz -

Aaaaaaaahhchso, das ist natürlich was AAAnderes ;-)

MFG
Falk

von Joko (Gast)


Lesenswert?

:-)

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.