www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Takt ausgeben


Autor: Sebastian B. (sfreak) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
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.

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

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

hab mit Hilfe eines Kollgen ein bisschen Info gefunden:

http://duteela.et.tudelft.nl/~elca/XilinxTutor/doc... 
(Seite 3), demnach kann ich diese Komponente verwenden:
http://toolbox.xilinx.com/docsan/xilinx7/books/dat...

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

Sebastian

Autor: Joko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:

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

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?

Autor: Joko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Joko (Gast)

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

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

MFG
Falk

Autor: Joko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.