Forum: FPGA, VHDL & Co. Seriell ankommende Bits neu sortieren


von Klaus (Gast)


Lesenswert?

Hallo,

ich habe folgendes VHDL Problem:

Über einen seriellen Eingang kommen einen gewisse Menge an Bits an. 
Sagen wir mal 60000 Bits. Nun gehören jeweils die Bits 0,8,16, ... und 
1,9,17, ... und 2,10,18, ... usw. zusammen. Wie kann ich diese nun am 
effizientesten und Resourcen schonensten sortieren damit ich am Ende 
wieder einen Serielles Signal habe, bei dem die jeweils 
zusammengehörigen Bits hintereinander ausgelesen werden können. Also so: 
Bit0,Bit8,Bit16,....Bit1,Bit9,Bit17,....Bit2,Bit10,Bit18,...

Ich habe mir überlegt eine Variable zu definieren, die Mitzählt bei 
welchem Bit man gerade ist und das jeweilige Bit einem Vektor zuordnet. 
Wenn dann alle Bits in ihren Vektoren stehen wollte ich diese wieder 
über einen MUX zusammen binden. Gibt es eine effizientere Methode?

Kann man das so verstehen?

Würde mich über antworten freuen.

von Vanilla (Gast)


Lesenswert?

Hallo Klaus,

deine Aussage:
"Ich habe mir überlegt eine Variable zu definieren"
laesst vermuten dass Du dich bereits vom Tugend der HDL Beschreibung 
bereits entfernt hast...
Veriablen sind etwas voellig anderes wie bei der klassischen 
(Microprozessor) Programmierung...
Man(n/Frau) nutzt Register nicht Variablen...

Zu bedenken ist der zeitliche Ablauf, nicht dass waehrend der Ausgabe 
der Bits bereits Die ersten Werte wieder ueberschrieben werden...

In diesem Sinne

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


Lesenswert?

Klaus schrieb:
> Sagen wir mal 60000 Bits.
Ist diese Datenpaketlänge immer gleich?
Denn nur dann kannst du am Ende erst die Bits(n*8) (mit n=0..749), dann 
die Bits(n*8+1) usf. bis zu den Bits(n*8+7) ausgeben...

von Klaus (Gast)


Lesenswert?

Hallo Lothar,

das könnte funktionieren. Sie sind zwar nicht immer gleich, aber doch 
zumindest immer ein vielfaches davon. Das werd ich ausprobieren.

zu Vanilla: Ich bin noch kein VHDL Experte. Wie genau muss man sich denn 
eine Variabel hier vorstellen und warum ist es ein Problem sie zu 
benutzen?

Gruß

Klaus

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


Lesenswert?

Klaus schrieb:
> Wie genau muss man sich denn eine Variabel hier vorstellen
Du hast doch mit Variablen angefangen...  :-o

> und warum ist es ein Problem sie zu benutzen?
Variablen sind und machen in VHDL etwas grundsätzlich anderes als 
Variable in Programmiersprachen wie z.B. C

Immer wieder fallen da ein paar Anfänger auf die Nase, weil sich so eine 
Variable mitunter unschön verhält...
Beitrag "Variable vs Signal"
Wenn sich z.B. eine Variable in einem Prozess ändert, und deshalb 
eigentlich der Prozess neu berechnet werden müsste, ist sehr schnell die 
Simulation anders als die Hardware:
Beitrag "Re: Variable vs Signal"
Und das ist wirklich blöde...  :-/

von Klaus (Gast)


Lesenswert?

Hallo Lothar,

ja das hab ich, aber nach dem Rüffel von Vanilla werd ich das in 
Zukunft, wenn irgendwie möglich, vermeiden. Bis jetzt ist es mir zwar 
noch nicht ganz klar warum Variablen so ein Teufelszeug sind, aber ich 
das werd ich im Laufe der Zeit hoffentlich noch.

von Duke Scarring (Gast)


Lesenswert?

Klaus schrieb:
> Bis jetzt ist es mir zwar
> noch nicht ganz klar warum Variablen so ein Teufelszeug sind

Wenn das jedem Anfänger klar wäre, wäre die Welt ein Stück einfacher.

Duke

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Hallo Klaus,

hier ist ein Lösungsvorschlag. Du schiebst deinen seriellen Datenstrom 
in ein 8Bit Schieberegister. Nach jedem achten Bit schreibst du das Byte 
in einen BlockRAM. Das ist interner Speicher im FPGA. So etwas haben 
alle modernen FPGAs und das auch noch dual-ported. Heißt zweimal 
Adressbus, Datenbus und Steuerleitungen. Sodass du von zwei Seiten auf 
dieselben Daten zugreifen kannst. Von der zweiten Seite liest die die 
Daten wieder byteweise. Jedoch verwendest du nicht das ganze Byte 
sondern nur ein Bit. Dies gibst du aus. Dann liest du die nächste 
Adresse. Wenn du von allen Adresse ein Bit verarbeitet hast, fängst du 
wieder von vorn an mit dem nächsten Bit usw.

Wenn dir jetzt die Ohren von Bits. Bytes BRAM usw. klingeln, dann weist 
du auf was du dich eingelassen hast.

Viel Spaß

Tom

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Klaus schrieb:
> Über einen seriellen Eingang kommen einen gewisse Menge an Bits an.
> Sagen wir mal 60000 Bits. Nun gehören jeweils die Bits 0,8,16, ... und
> 1,9,17, ... und 2,10,18, ... usw. zusammen. Wie kann ich diese nun am
> effizientesten und Resourcen schonensten sortieren damit ich am Ende
> wieder einen Serielles Signal habe, bei dem die jeweils
> zusammengehörigen Bits hintereinander ausgelesen werden können. Also so:
> Bit0,Bit8,Bit16,....Bit1,Bit9,Bit17,....Bit2,Bit10,Bit18,...

Du kannst das ganze auch mit einem (oder zwei) langen Schieberegister 
lösen, dessen Bits nach und nach über zwei verschachtelte Zähler 
selektiert werden. nachdem Du Deine 256 Bits voll hast, kannst Du das 
Register raustakten und somit Deinen Datenstrom generieren, während 
mittlerweile der zweite Puffer gefüllt wird.

Gruß
Marcus

von Johannes (Gast)


Lesenswert?

Oder du nimmst 8 Schieberegister, in die immer der Reihe nach ein Bit 
reingeschoben wird. Wenn dann alle Register 8 Bit empfangen haben, wird 
der Inhalt der Register nacheinander ausgelesen und ins RAM geschrieben.

von Klaus (Gast)


Lesenswert?

Ich habs geschafft! Vielen Dank euch allen!

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


Lesenswert?

Klaus schrieb:
> Ich habs geschafft!
Schön wäre es, wenn du deine Lösung (wenigstens ansatz- oder 
auszugsweise) beschreiben würdest. Nur, falls irgendwann mal Einer eine 
ähnliche Aufgabe hat...

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.