Hallo,
kann mir jemand einen Tipp oder ein Beispiel geben wie man zwei bzw.
mehrere serielle Datenströme mit jeweils eigener Clock mittels VHDL
multiplexen kann? (Bin Anfänger damit und versuche gerade Anhaltspunkte
zusammenzusuchen um das Konzept dahinter zu verstehen).
Also angenommen 2x je 8 bit streams zu einem zusammenzufassen.
Ich stelle mir das vom Input so vor:
Input 1: 8 Bit
Input 2: 8 Bit
Output 1: 12 Bit interleaved, jeder Kanal fügt ggf. einen Prefix beim
Datenstrom hinzu woher dieser kommt, aber wie man das in VHDL umsetzt
ist für mich noch nicht klar...
Wenn man das in der Praxis anders macht bitte darauf hinweisen, ich
versuch wie gesagt das irgendwie zu lernen auch wenn noch ein ganzer
Berg vor mir ist...
Stell Dir vor, Du müsstest eine Handvoll Arbeiter einweisen, genau das
zu leisten, Daten abzuholen, sie markieren und wechselseitig zum Ausgang
geben.
Die Arbeiter müssten wissen, wann was Neues da ist, was sie auf die
Daten draufschreiben sollen und wann sie dran sind, was auf den Ausgang
zu geben.
Wenn du das formulieren kannnst, malst du die Schaltung hin. Und dann
hast du die Lösung.
Martin schrieb:> Wenn man das in der Praxis anders macht bitte darauf hinweisen
Dazu müsste man mehr zum "das" wissen: Quelle, Ziel, Datenraten,
Taktfrequenzen...
Als Quelle würde ich einfach mal einen billigen Funktionsgenerator
nehmen der 10101010101 (ohne Synchronisation) mit z.B 10 MHz ausgibt. Es
geht mir ja in erster Linie darum das Konzept dahinter zu verstehen.
Bei der Ausgabe vom FPGA würde ich dann einen USB Chip (z.B FX2)
verwenden.
Ich stehe da noch ganz am Anfang...
Martin schrieb:> Bei der Ausgabe vom FPGA würde ich dann einen USB Chip (z.B FX2)> verwenden.
Naja, nimm gleich den FX3, wenn Du was neues machst. Der ARM ist
wesentlich angenehmer zu debuggen als der 80C51...
Martin schrieb:> Ich stehe da noch ganz am Anfang...
Von WAS denn? WAS soll denn das Ganze letztendlich geben?
Ein USB-Wandler gibt ja keinen kontinuierlichen Bitstrom, sondern Daten
entsprechend einem Protokoll aus.
Lothar Miller schrieb:> Martin schrieb:>> Ich stehe da noch ganz am Anfang...> Von WAS denn? WAS soll denn das Ganze letztendlich geben?>> Ein USB-Wandler gibt ja keinen kontinuierlichen Bitstrom, sondern Daten> entsprechend einem Protokoll aus.
Wiegesagt von einem Funktionsgenerator (1010101010...) also der Input
ist nicht sinnvoll, Ausgabe soll am PC ein 8 bit Datenstrom sein.
Synchronisation ist hinfällig ich will mal das allgemeine Konzept
dahinter verstehen.
Ich hab bis jetzt ein paar Schaltungen probiert leuchtende LED, Adder,
Dekodierung eines Streams und Ausgabe auf einem 7-Segment Modul. Aber
wie man einen Datenstrom bei einem FPGA einlesen, serialisieren und
ausgeben kann dazu fehlt mir nach wie vor das Hintergrundwissen bzw. ich
erkenne da auch kein Konzept wie man das machen könnte..
Martin schrieb:> ich> erkenne da auch kein Konzept wie man das machen könnte..
weil das Konzept von den Randbedingungen abhängt. Und die
Randbedingungen von nicht-sinnvollen Problemstellungen sind nicht
definiert
Hilft dir folgender Vorschlag:
- jeder der beiden seriellen Datenströme wird durch ein Schieberegister
erst mal in 8 bit breite Datenströme umgewandelt.
- diese byte-breiten Datenströme aus den nicht synchronisierten Quellen
werden in jeweils ein FIFO geschickt, dessen Eingang in der Taktdomäne
der jeweiligen Datenquelle läuft
- am anderen Ende der FIFOs wartet eine FSM darauf, dass die FIFOs Daten
enthalten. Sobald das der Fall ist, holt sie beim volleren FIFO ein
Paket von Daten ab, versieht es mit dem passenden Prefix (der die Quelle
identifiziert), und sendet es an den PC
Martin schrieb:> Aber wie man einen Datenstrom bei einem FPGA einlesen, serialisieren und> ausgeben kann dazu fehlt mir nach wie vor das Hintergrundwissen bzw. ich> erkenne da auch kein Konzept wie man das machen könnte..
Bei einer so allgemeinen Fragestellung kann man nur verallgemeinert
antworten: den Datenstrom schnell genug einlesen, schnell genug
verarbeiten und mit der nötigen Geschwindigkeit ausgeben. Das wars.
Bei einem mit 100MHz getakteten FPGA und einer Datenrate von 1MBit/s
wäre das kein Problem. Bei einer Datenrate von 50MBit/s wäre das schon
spannender. Deshalb eben die Frage nach dem WOZU...
Die Aufgabenstellung ist viel zu wässrig und abstrakt, als dass man
daraus eine konkrete Übung mit konkreten Tips machen könnte. Da es aber
anscheinend erstmal um Grundlagen geht, sollte man ein eher einfaches
Beispiel wählen, auch nicht mit hohen Takten oder sonstwas. Man sollte
auch nichts mit mehrfachen Takten etc. nehen, das ist was für die
höheren Semester. Also ein einfaches System mit EINEM globalen Takt und
mehreren Daten/Steuereingängen.
Z.B. 2x 8 Bit Dateneingänge mit je einem Data enable Eingang (der
natürlich nicht permanant aktiv sein kann). Diese werden auf einen 4 Bit
Datenausgang gemultiplext. Dazu wird auf einer Zusatzleitung eine
Synchronmarke ausgegeben, damit der Empfänger die Daten wieder
demultiplexen kann. Alles mit einem globalen Takt. Dafür braucht man ein
paar Zwischenpuffer, Schieberegister, Zähler und eine kleine state
machine. Für den Anfang sollte das reichen. Als ersten Schritt erstellt
man ein Blockschaltbild, dann kann man schrittweise die einzelnen Module
erstellen, dazu die Testbenches. Wobei hier auf grund der eher geringen
Komplexität alles in einer VHDL-Entity Platz hat, man muss nicht
krampfhaft modularisieren. Trotzdem sollten sich die Blöche des
Blockschaltbildes in den VHDL-Konstrukten wiederfinden lassen.
Und als 2. Aufgabe kann man dann den Demultiplexer entwerfen.
Als Zusatzaufgabe kann man beim MUX eine Fehlererkennung einbauen, wenn
z.B. die Eingangsdaten zu schell kommen (data enable ist zu oft oder zu
lange aktiv).