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