Hallo,
ich bin auf der Suche nach etwas Hilfe bei meinem aktuellen Projekt. Es
ist für ein Praktikum hier im Studium und es ist recht neu für mich,
leider war die Themenwahl nicht frei :(
Es geht darum, dass ich in einem Teilprjekt (mein Partner macht den
anderen Teil) LVDS Daten abspeichern muss. Dazu sollen wir ein Board,
bestückt mit einem Spartan3A-DSP XC3SD1800A, verwenden.
Die LVDS Signale werden an die Samtec Steckverbinder geführt und müssen
nun verarbeitet werden.
Da ich mich mit FPGAs bisher nur rudimentär beschäftigt habe, habe ich
recht großen Bammel/Respekt vor dieser Aufgabe und wollte nun erst
einmal anfangen, einen LVDS Takt auszugeben. Einfach um zu schauen, wie
händle ich die Bitsignale und wandle diese in LVDS um... das denke ich
erleichert mir dann den Weg rückwärts, also die LVDS Signale in
verwertbare Signale zu wandeln.
Ich habe auf dem Board zwei Oszillatoren, 25,xxMHz und 125MHz. Ich
wollte den 125MHz Takt nun einfach mal an zwei Pins als LVDS ausgeben.
Dazu sind laut Datenblatt ja nur die Bänke 0 und 2 geeignet, 1 und 3
können wohl nur LVDS entgegennehmen.
Wie gehe ich nun am besten vor. Ich habe bisher nur den Takt halbiert
und habe damit eine LED blinken lassen:
1
entityTakt_LEDis
2
Port(CLOCK:inSTD_LOGIC;
3
LED:outSTD_LOGIC);
4
endTakt_LED;
5
6
architectureBehavioralofTakt_LEDis
7
signalclk_halbe:STD_LOGIC;
8
9
begin
10
process(BLINK)
11
begin
12
13
ifrising_edge(CLOCK)then
14
clk_halbe<=notclk_halbe;
15
endif;
16
endprocess;
17
18
COUNT_OUT<=clk_halb;
19
20
endBehavioral;
Nun habe ich leider keine Ahnung, wie ich die Bausteine IBUFDS und
OBUFDS richtig einsetze. Wobei ich für die Ausgabe ja nur den OBUFDS
benötige. Wie verschalte ich die Variable clk_halbe z.B. mit dem Eingang
des OBUFDS und welche Maßnahmen muss ich noch treffen, dass es
funktioniert.
Welche I/O Spannung (das Board kann 2,5V oder 3,3V per Jumper) muss ich
einstellen? Laut Datenblatt sollen wohl beide gehen, zumindest lese ich
das so heraus, aber ganz sicher bin ich mir leider nicht.
Ich wäre für Hilfe Sehr sehr dankbar!
Andreas
LVDS läuft üblicherweise mit 2,5V VCCIO. Das ist ja durch die externe
BEschaltung vorgegeben bzw. muss geklärt werden mit der "Gegenstelle".
Die Ausgabe ist denkbar einfach, du instanziierst einfach den OBUFDS und
verschaltest den Eingang an deinen Takt intern, die Ausgänge N und P
müssen direkt an die entsprechenden Pins des FPGA. Die sind ja auch so
gekennzeichnet (also N und P, die zusammengehörigen). Dann klappt das
schon. Ansonsten ist das genauso einfach wie bei Single ended Signalen,
das meiste, was man beachten muss, spielt sich auf der Platine an sich
ab.
Achja, den CLK so zu teilen geht zwar auch, ist aber unschön und bremst
eventuell das Timing aus. Mach das mal lieber mit dem DCM, dazu sind die
schließlich da. Und die Takt-Ausgabe empfilet Xilinx mit ODDR FlipFlop
zu machen.
Vielen Dank,
ergibt folgender Code Sinn?
Ich setze jetzt also die Ausgänge des OBUFDS mit den Ausgängen meines
entities Test2 gleich, geht das so einfach?
Auch wenn die Takterzeugung erstmal unsauber ist, würde ich dennoch
gerne dabei bleiben, denn da weiß ich, dass sie funktioniert :)
1
entityTest2is
2
Port(CLOCK:inSTD_LOGIC;
3
LVDSTakt_OB:outSTD_LOGIC;
4
LVDSTakt_O:outSTD_LOGIC);
5
endTest2;
6
7
architectureBehavioralofTest2is
8
9
-- Component Declaration for OBUFDS should be placed
10
-- after architecture statement but before begin keyword
11
componentOBUFDS
12
port(O:outSTD_ULOGIC;
13
OB:outSTD_ULOGIC;
14
I:inSTD_ULOGIC);
15
endcomponent;
16
17
signalclk_halb:STD_LOGIC;
18
19
begin
20
21
process(CLOCK)
22
begin
23
24
ifrising_edge(CLOCK)then
25
clk_halb<=notclk_halb;
26
endif;
27
28
-- Component Instantiation for OBUFDS should be placed
29
-- in architecture after the begin keyword
30
LVDS_Takt_out:OBUFDS
31
portmap(O=>LVDSTakt_O,
32
OB=>LVDSTakt_OB,
33
I=>clk_halb);
34
35
endprocess;
36
37
endBehavioral;
Ich kann ihn leider nicht gleich testen, weil ich nicht an der FH bin,
erst morgen wieder...
Ich schau mir mal das Template an, hatte eigentlich genau dort schon
danach gesucht, aber leider nichts gefunden. Ich hoffe ich schaffe es am
Wochenende weiter zu kommen.
Vielen Dank :)
Super, hatte zwar noch einen Fehler drin, dass ich OBUFDS im process
aufgerufen hatte und das nicht geht, aber nun habe ich vorerst ein
125MHz LVDS Takt.
Nun versuche ich mal, mit Hilfe des DCM den Takt zu teilen und von mir
aus auch noch weiter in die Höhe zu treiben, mal schauen ob es mir
gelingt.
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.