Forum: FPGA, VHDL & Co. LVDS VHDL Beispielcode


von LVDS Newbie (Gast)


Lesenswert?

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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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
   generic map (
3
      IOSTANDARD => "LVDS_25",
4
      SLEW => "SLOW")
5
   port map (
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:
1
set_property IOSTANDARD LVDS_25 [get_ports lvds_clk_p]
2
set_property IOSTANDARD LVDS_25 [get_ports lvds_clk_n]

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.

von Markus F. (mfro)


Lesenswert?

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.

von Rolf S. (audiorolf)


Lesenswert?

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.

von LVDS Newbie (Gast)


Lesenswert?

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!

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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.

von Elektrickser (Gast)


Lesenswert?

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?

von Elias K. (elik)


Lesenswert?

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.

von J. S. (engineer) Benutzerseite


Lesenswert?

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.

von Markus F. (mfro)


Lesenswert?

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.

von FPGA-Noob (Gast)


Lesenswert?

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?

von Elias K. (elik)


Lesenswert?

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
2
==========================================================
3
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.

von J. S. (engineer) Benutzerseite


Lesenswert?

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

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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

von J. S. (engineer) Benutzerseite


Lesenswert?

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.

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.