Forum: FPGA, VHDL & Co. Quartus megafunction altvlds_rx einbinden


von Guggi Ebner (Gast)


Lesenswert?

Hallo Leute

ich möchte einen ADC mit LVDS (16 Bit + 1 Takt) an meinen Cyclone IV E 
anbinden.
Die Daten sollen intern in einem FIFO gespeichert werden. Die Daten vom 
ADC werden mit jeder ankommenden steigenden Taktflanke übernommen. 
Brauche ich dafür überhaupt die Megafunktion altlvds_rx? Ich benötige ja 
kein SerDes.

Wenn ich die Megafunktion einbinde und der deserialization factor auf 1 
steht, bekomme ich

component lvdsunterprog
  PORT
  (  rx_in: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
     rx_inclock    : IN STD_LOGIC ;
     rx_out    : OUT STD_LOGIC_VECTOR (15 DOWNTO 0));
end component;

Ein rx_outclock wird nicht erzeugt, wie soll ich ohne Takt die Daten 
weiterverarbeiten können?

Schonmal vielen Dank

von Karl (Gast)


Lesenswert?

Wenn du keine extra SERDES Funktion benötigst musst du auch die 
Megafunction nicht unbedingt verwenden. Achte aber darauf dass deine 
Constraints stimmen. Je nach Taktfrequenz kannst du auch ganz ohne PLL 
auskommen, ansonsten musst du eine PLL im Source Synchronuous Mode 
nehmen.

Ich kann mich aber wage erinnern dass man im Megawizard als Option auch 
den Taktausgang hinzufügen konnte. Eventuell findest du da ja doch noch 
eine Einstellung.

Generell würde ich mit/ohne einer einfachen PLL arbeiten - ohne SERDES 
IP. Der Cyclone IV hat meines wissens eh keine dedizierten SERDES Blöcke 
und macht alles in Logik, d.h. es gibt auch keine dedizierten Taktnetze 
und dann kann man es auch gleich manuell machen.

von Guggi Ebner (Gast)


Lesenswert?

Kannst du mir genauer erklären, was du mit Constraints meinst? Ich lese 
gerade, dass das etwas mit der Pinzuweisung zu tun hat, oder?

Und für was brauche ich bei LVDS eine PLL?


Ich habe zwei Taktquellen. Den Systemtakt und den Takt des ADC-Ausgangs. 
Ich weiß, dass das wirklich ungünstig ist. Eine Flankenerkennung zu 
programmieren, gefällt mir irgendwie nicht, zusätzlich wollte ich den 
Takt vom ADC variieren können.
Was haltet ihr davon, zwei Prozesse parallel ablaufen zu lassen, jeder 
mit einer Taktquelle? Ein Prozess lädt nur die Daten vom ADC ins FIFO 
und wird vom anderen Prozess gesteuert. So könnte ich den ADC-Takt 
direkt an meinen FIFO-Takt anlegen

von Karl (Gast)


Lesenswert?

Genauer formuliert: Timing Constraints. Du musst Quartus schon sagen 
dass die anliegen Daten was mit dem ankommenden Takt zu tun haben und 
dass bestimmte zeitliche Anforderungen eingehalten werden sollen. Eine 
PLL nimmt man dann her wenn man eine hohe Taktfrequenz hat und den 
eingehenden Takt zeitlich verschieben muss, denn der Takteingang hat 
eine andere Laufzeit als die Daten. Sagen wir deine Daten kommen mit 
>200MHz an und dein Takt braucht ein paar Nanosekunden länger als die 
Daten bis zum Flipflop - wie willst du da sicherstellen dass du gültige 
Daten sampelst? In der Mitte vom Abtastfenster bist du dann sicherlich 
nicht mehr. Eine PLL kann das mit einem zusätzlichen Phaseshift 
kompensieren.

Wenn du nur ein paar MHz hast brauchst du aber auch keine PLL. Das wäre 
übrigens auch der einzige Vorteil des LVDS RX IP Cores - der baut 
selbstständig eine PLL ein und kümmert sich um die Constraints.

Ansonsten kannst du natürlich den Empfangstakt nutzen um die Daten in 
ein DC-FIFO zu schieben und dann mit deinem Systemtakt auslesen. Hier 
muss man dann natürlich auf die Üblichen Clock Domain 
Crossing-Fallstricke achten.
Um das Timing zu vereinfachen würde ich aber zwischen Eingang und FIFO 
noch mindestens eine Registerstufe setzen.

von J. S. (engineer) Benutzerseite


Lesenswert?

Du brauchst nur die LVDS-Buffer für die Eingänge zu instanzieren, ist 
also eher eine elektrische Anforderung. Die Serializer werden nur bei 
seriellen Datenströmen verwendet, bzw bei parallen dann, wenn die 
Datenrate entsprechend hoch wäre, allerdings fordert das dann noch etwas 
Umsortierung.

von Guggi Ebner (Gast)


Lesenswert?

Also lieber wäre es mir, wenn die Daten über den LVDS IP Core in den 
FPGA gelangen, damit die Daten intern synchron zu ihrem Takt laufen. Von 
außen kommen Clock und Daten maximal 50 ps zeitversetzt. Das kann ich 
für meine Anforderungen als "gleichzeitig" beschreiben.

Aber ich kann im Megawizard einfach keine Phasenlage einstellen, selbst 
wenn ich wollte, dies geht erst ab einem Deserialisierungsfaktor von ca. 
5.

Und viel wichtiger: ich bekommen bei Faktor 1 keinen rx_out_clock 
erstellt. Wenn ich den Faktor auf 7 oder höher Stelle und dann auf 2, 
funktionierts. Klingt irgendwie nach einem Software-Fehler, diese 
Willkürlichkeit.

Bei Faktor 1 einen rx_out_clock manuell zu ergänzen klappt auch nicht. 
Weiß einer Rat?

von Karl (Gast)


Lesenswert?

Wenn du kein Serdes benötigst dann lass es weg, es kann auch ganz ohne 
PLL funktionieren. Nimm einfach deinen Takteingang im Design her und 
taste damit deine Eingangsdaten ab und schreib die dann so in ein FIFO.
Der LVDS IP Core hat eigentlich auch wenig mit LVDS zu tun. Eigentlich 
sollte er eher LVDS SERDER IP heißen - denn die neueren Architekturen 
haben dedizierte SERDES Blöcke nur an den LVDS Pins.

Du solltest allerdings Quartus mitteilen dass die Daten zum Takt eine 
Beziehung haben. Wie das geht ist in 
http://www.altera.com/literature/an/an433.pdf beschrieben. Wenn dann 
Quaruts meckert dass das Timing nicht eingehalten werden kann kannst du 
noch eine PLL einbauen welche die Taktphase verschiebt.

Viel Glück.

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.