www.mikrocontroller.net

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


Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vanilla (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...  :-/

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Reinemann (Firma: abaxor engineering) (abaxor)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs geschafft! Vielen Dank euch allen!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.