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
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
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?
> 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
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
@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
@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
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.