Hallo,
ich bin erst neu in der FPGA Programmierung. Ich nutze für den Anfang
ein Cyclone 10 LP und programmiere in VHDL mit der Quartus Software.
Nun möchte ich Daten via LVDS senden und empfangen. Ich habe diverse
Datenblätter auf der intel Seite gefunden, wie ich dies und das
berechne, wie LVDS funktioniert usw. ABER: Was ich nicht gefunden habe:
Wie setze ich das jetzt in VHDL um? Gibt es Beispielcode, den ich mir
anschauen und auf meine Bedürfnisse anpasssen kann? Für den Anfang
möchte ich 2 FPGAs mit LVDS Leitungen verbinden und Daten austauschen.
Ich habe noch keine speziellen "Bedürfnisse" an Geschwindigkeit etc.
Ersteinmal nur Daten austauschen, als Test. Aber ich finde kein Infos,
wie ich los legen kann.
Danke schonmal!
LVDS Newbie schrieb:> Ich habe noch keine speziellen "Bedürfnisse" an Geschwindigkeit etc.> Ersteinmal nur Daten austauschen, als Test.
Weil LVDS eigentlich lediglich ein IO-Standard is, kannst du auch jede
SPI- oder RS232-Schnittstelle statt mit einer Leitung Single-Ended auch
differentiell mit 2 Leitungen und LVDS-Pegeln übertragen.
Das machst du dann aber nicht im VHDL-Code, sondern im Constraint-File.
So richtig spannend wird es dann, wenn du hohe Geschwindigkeiten über
SerDes-Einheiten (Serializer, Deserializer) des FPGAs übertragen willst.
Insofern hat die Thematik LVDS eigentlich unmittelbar etwas mit
Datenraten zu tun.
Und die SerDes-Blöcke musst du dann als Komponenten in dein VHDL-Design
einbinden und passend ansteuern.
Lothar M. schrieb:> Das machst du dann aber nicht im VHDL-Code, sondern im Constraint-File.
Bei Xilinx Vivado kann man durchaus die entsprechenden LVDS-Blöcke in
VHDL instantiieren:
1
OBUFDS_clk:OBUFDS
2
genericmap(
3
IOSTANDARD=>"LVDS_25",
4
SLEW=>"SLOW")
5
portmap(
6
O=>lvds_clk_p,
7
OB=>lvds_clk_n,
8
I=>clk
9
);
Und zusätzlich gibt man dann die Signalpegel in der Constraintdatei an:
Man sollte tunlichst NICHT auf die Idee kommen, in obigem Beispiel das
invertierte Signal einfach mittels "lvds_clk_n <= not lvds_clk_p" zu
erzeugen, weil die Signale sonst ggf. zeitlich gegeneinander versetzt
sein können.
Bei Intel/Altera heißt die entsprechende Komponente ALTLVDS_RX bzw.
ALTLVDS_TX.
Die können - wenn man will - auch gleich einen Buffer mit anlegen und
(De-) Serialisierung übernehmen.
LVDS Newbie schrieb:> ABER: Was ich nicht gefunden habe:> Wie setze ich das jetzt in VHDL um?
Eigentlich gar nicht. LVDS ist nur ein Signalstandard. Das wird
vollständig an den Interface-Pins der Bausteine gelöst. In VHDL hast Du
damit nichts zu tun.
Hey,
vielen Dank für Eure schnelle Hilfe. Mir wurde jetzt einiges klarer. ich
habe jetzt in der Quartus Software die komponente Altlvds_tx verwendet
und auf einen Ausgang gelegt. Es kommt auch etwas raus. Mein Problem ist
nun: Wie genau kann ich konfigurieren, dass es sich um einen LVDS
Ausgang handelt, der einen zweiten Pin benötigt? Vermutlich, wie Lothar
M. geschrieben hat "im Constraint-File". Könnt ihr mir kurz auf die
Sprünge helfen, wie genau ich vorgehen muss, bzw. wo ich nachlesen kann,
was ich tun muss? Danke!
Das Anlegen der entsprechenden Pin Constraints wird genauso
funktionieren wie bei "normalen" Pins. Üblicherweise veröffentlichen die
FPGA-Hersteller zu jedem IP-Block und Treibertyp eine ausführliche
Dokumentation.
Elektrickser schrieb:> Andreas S. schrieb:>> einfach mittels "lvds_clk_n <= not lvds_clk_p" zu>> erzeugen> wie möchtest Du es ansonsten erzeugen, wenn nicht mit einem Inverter?FPGAs haben meist spezielle LVDS-Transciever, denen man ein single-ended
digitales Signal intern übergibt, und die intern die Invertierung selbst
übernehmen. Kein Bedarf, da was von Hand zu machen. (So muss man sich
auch nicht um das Delay kümmern, was ein Inverter mitbringen würde. Und
ob die elektrische Spezifikation von LVDS die gleiche ist, wie von zwei
Standard-IO-Pins bezweifle ich, müsste ich aber mal prüfen.)
Nur muss man die Pins eben auch als LVDS-IO-Pins definieren. Wie bereits
gesagt, mit den Pin Constraints.
Elektrickser schrieb:> Andreas S. schrieb:>> einfach mittels "lvds_clk_n <= not lvds_clk_p" zu>> erzeugen>> wie möchtest Du es ansonsten erzeugen, wenn nicht mit einem Inverter?
Natürlich kann man invertierte DS-Signale mit einem Inverter erzeugen
und dessen Verzögerung macht in der Regel nicht viel aus, weil er in der
Größenordnung des drifts, dem jitter und vor allem dem zeitlichem
Lageversatz der Pins liegt. Zudem ist nicht vorhersagbar, ob nicht
Kombinatorik davor dafür sorgt, dass der N-Pin direkt aus der LUT kommt,
da die Gleichung negiert sein kann und deshalb der P nochmal in eine
Negation muss. Über dies könnte man jede Differenz zwischen den beiden
mit den IODELAYs kompensieren.
Es ist aber einfach bequemer, die dafür vorgesehenen Pin-Paare zu
nehmen, weil die eben schon gematched sind. Oder sagen wir, sie sind
ohne Delay-Matching schon mal kongruenter.
Das Timing ist aber nicht der entscheidende Punkt bei der Nutzung eines
LVDS-Buffers, sondern die herabgesetzten Pegel und die damit einher
gehende deutlich verbesserte Robustheit gegenüber Einstreuungen.
Elias K. schrieb:> Und ob die elektrische Spezifikation von LVDS die gleiche ist> wie von zwei Standard-IO-Pins bezweifle ich
Die Pins sind ja dieselben, es wird nur der Treiber anders konfiguriert.
Beim Altera Stratix gab es da mal was, erinnere ich mich. Man hat die
IOs händisch als invertierte Pins definiert und ihnen einen speziellen
Standard verpasst, um auf die Pegel zu kommen. Ich bin aber nicht mehr
sicher, ob das nicht wegen eines bugs. Ist fast 10 Jahre her.
Elektrickser schrieb:> Andreas S. schrieb:>> einfach mittels "lvds_clk_n <= not lvds_clk_p" zu>> erzeugen>> wie möchtest Du es ansonsten erzeugen, wenn nicht mit einem Inverter?
Gar nicht.
Das macht Quartus von ganz alleine. Wenn Du einem Pin 'Pin' den LVDS
I/O-Standard zuordnest, bastelt es dir automatisch einen zweiten
'Pin(n)' dazu.
Lothar M. schrieb:> So richtig spannend wird es dann, wenn du hohe Geschwindigkeiten über> SerDes-Einheiten (Serializer, Deserializer) des FPGAs übertragen willst.> Insofern hat die Thematik LVDS eigentlich unmittelbar etwas mit> Datenraten zu tun.
Heißt dass, wenn die LVDS Treiber schnell genug sind, man mit den ganzen
moderne seriellen Schnittstellen reden kann wie die Wikipedia meint:
LVDS = Serial ATA (SATA), PCI Express (PCIe), FireWire, HyperTransport,
Videoschnittstellen wie DisplayPort und auch Feldbusse wie SpaceWire und
RapidIO..
Oder gibt es da feine&gemeine Unterschiede?
Jürgen S. schrieb:> Elias K. schrieb:>> Und ob die elektrische Spezifikation von LVDS die gleiche ist>> wie von zwei Standard-IO-Pins bezweifle ich> Die Pins sind ja dieselben, es wird nur der Treiber anders konfiguriert.> Beim Altera Stratix gab es da mal was, erinnere ich mich. Man hat die> IOs händisch als invertierte Pins definiert und ihnen einen speziellen> Standard verpasst, um auf die Pegel zu kommen. Ich bin aber nicht mehr> sicher, ob das nicht wegen eines bugs. Ist fast 10 Jahre her.
Gar nicht so einfach, dahinter zu kommen. Habe gerade mal beim Cyclone
10 ins Datenblatt geschaut:
1
Intel Cyclone 10 LP High-Speed Differential I/Os and SERDES
The Intel Cyclone 10 LP devices use registers and logic in the core fabric to implement LVDS input and output interfaces.
4
• For LVDS transmitters and receivers, Intel Cyclone 10 LP devices use the the double data rate I/O (DDIO) registers that reside in the I/O elements (IOE). This architecture improves performance with regards to the receiver input skew margin (RSKM) or transmitter channel-to-channel skew (TCCS).
5
• For the LVDS serializer/deserializer (SERDES), Intel Cyclone 10 LP devices use logic elements (LE) registers.
6
• The device uses shift registers, internal phase-locked loops (PLLs), and I/O cells to perform serial-to-parallel conversions on incoming data and parallel-to-serial conversion on outgoing data.
Weiterhin wird zwischen true und emulated differential in- und outputs
unterschieden.
1
The Intel Cyclone 10 LP devices support LVDS, RSDS, mini-LVDS, and PPDS highspeed differential I/O standards.
2
3
Differential Input
4
-------------------
5
The Intel Cyclone 10 LP devices features true input buffers for these I/O standards on the top, bottom, and right I/O banks.
6
7
Differential Output
8
-------------------
9
The Intel Cyclone 10 LP devices features dedicated differential output buffers:
10
• The true output drivers are available on the row I/O banks.
11
• Some of the differential pin pairs (p and n pins) are not located on adjacent pins. In these cases, a power pin is located between the p and n pins.
12
The Intel Cyclone 10 LP devices provide emulated support for these I/O standards on all columns and row I/O banks:
13
• Emulated differential output uses a pair of single-ended output pins.
14
• In the pin pair, the second output pin is programmed as inverted.
15
• The emulated differential output requires an external resistor network.
Also scheint es schon einen Unterschied zwischen GPIO und
Differential-IO zu geben. Worin der in der Praxis aber besteht, habe ich
auf die Schnelle nicht gefunden.
Quelle: Intel® Cyclone® 10 LP Core Fabric and General Purpose I/Os
Handbook
FPGA-Noob schrieb im Beitrag #5569774:
> Heißt dass, wenn die LVDS Treiber schnell genug sind, man mit den ganzen> moderne seriellen Schnittstellen reden kann wie die Wikipedia meint:
In der Theorie ja. In der Praxis: Wenn die Werte im Datenblatt zusammen
passen. Nicht jeder LVDS-Treiber schafft alle Geschwindigkeiten. Und
natürlich musst du die Datenraten auf dem FPGA handeln können.
Elias K. schrieb:> Also scheint es schon einen Unterschied zwischen GPIO und> Differential-IO zu geben.
Nun ja, dahingehend, dass ein echter gematchter Treiber in manchen
IO-Paaren existiert und in manchen nicht. Das ist bei den meisten
Spar-FPGAs so und auch sinnvoll. Wer braucht schon überall LVDS?
In meinen Anfangstagen habe ich das alles händisch gemacht. Die ersten
FPGAs und PLDs hatten das ja nicht. Auch die Pegel kann man herabsetzen,
wenn man serielle Terminierung mit einem Halb/Halb-Abschluss einsetzt.
Noch einen kleinen pF-Kondi über den oberen Zweig und man hat aus einem
5V-PLD ein voll symmetrisches Signal um 2,5V
Lothar M. schrieb:> Insofern hat die Thematik LVDS eigentlich unmittelbar etwas mit> Datenraten zu tun.
Jein. Differentielle Übertragungen sind aus verschiedenen Gründen
natürlich bei hohen Datenraten äußerst sinnvoll, siehe z.B. PCIe, SATA,
usw..
Aber auch schon bei wesentlich geringeren Datenraten kann so etwas sehr
sinnvoll sein, nämlich um "Klingeln" bzw. Potentialverschiebungen auf
den Versorgungsleitungen zu reduzieren. Bei guter Symmetrie der Treiber
und angeschlossenen Leitungen bzw. Lasten ändert sich bei einem
Pegelwechsel dann nämlich nicht die Stromaufnahme des Bausteins.
Deswegen haben z.B. viele hochauflösende ADC LVDS-Anschlüsse, auch wenn
dies aus reinen Geschwindigkeitsgründen bei kurzen Leitungen noch nicht
zwingend erforderlich wäre. Beispiele: LTC2335, 2344, 2345, 2348, 2357,
2358, 2385, 2386, 2512, AD7960
Andreas S. schrieb:> Bei guter Symmetrie der Treiber> und angeschlossenen Leitungen bzw. Lasten ändert sich bei einem> Pegelwechsel dann nämlich nicht die Stromaufnahme des Bausteins.
Das macht erstaunlich viel aus. Ich habe in einer Messanwendung mal die
Ströme am Ausgang in einer Schaltung mit addiert und die dadurch
bedingten Pulse aktiv mitberechnet, um ein Signal zu erhalten, welches
man vom Messsignal abziehen konnte, um die Störungen durch den Prozessor
rauszurechnen. Auch im FPGA habe ich das schon so gemacht.
Ob es jetzt viel bringt, die Versorgung glatt zu machen, weiß ich nicht.
Hängt wohl von der Anwendung ab. Wenn die Versorgungsstörungen ein
Problem sind, würde ich es lieber aktiv machen.
> Deswegen haben z.B. viele hochauflösende ADC LVDS-Anschlüsse, auch wenn> dies aus reinen Geschwindigkeitsgründen bei kurzen Leitungen noch nicht> zwingend erforderlich wäre. Beispiele: LTC2335, 2344, 2345, 2348, 2357,> 2358, 2385, 2386, 2512, AD7960
Interessante Interpretation. Das würde implizieren, dass man die LVDS
gerade bei den Wandlern benutzen müsste, um Störungen zu mindern.
Ich habe bei Messanwendungen solche Wirkungen schon untersucht, aber die
Effekte bei FPGAs sind so groß nicht, wenn man entsprechende dynamische
Versorgungen hat, hält sich der Effekt in Grenzen.
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