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 | 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.
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.
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?
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 |
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.