Forum: FPGA, VHDL & Co. Drei 8 Bit Wörter in ein 24 Bit Wort


von pico (Gast)


Lesenswert?

Guten Morgen Allerseits,

ich bekomme über einen MISO Kanal drei 8 Bit Wörter, welche ich in ein 
24 Bit Wort speichern möchte um dieses dann später in einem RAM Speicher 
abzulegen.

Meine Frage: Wie verknüpfe ich die einzelnen Vektoren bzw. wie lege ich 
Sie in einem neuen Register ab?

Oder wäre es besser ein 24 Bit Schieberegister zu bauen, in das in 
Abhängigkeit des SCLK's  alle 24 Bit nacheinander hinein geschoben 
werden?

Viele Grüße,

pico

von Duke Scarring (Gast)


Lesenswert?

Auf was für einem System bist Du denn unterwegs? PC, µC oder FPGA?

Duke

von pico (Gast)


Lesenswert?

Oh, entschuldigung. Ich habe via SPI Daten über den MISO von einem ADC 
ausgelesen und möchte diese nun in ein 24 Bit Vektor speichern.

von der_max (Gast)


Lesenswert?

Da du im vhdl-Forum gepostet hast wuerde ich mal
folgenden Vorschlag machen (das ist als Vorlage
zum selbstdenken gedacht, nicht als Loesung):
1
  bitwort_24 <= bitwort8_1 & bitwort8_2 & bitwort8_3;

Die drei 8 Bitworte einfach dem 24 Bitwort zuweisen.


Gruss

Max

von pico (Gast)


Lesenswert?

Hi Max,

das heißt, mit dem '&' Operator hänge ich sozusagen die Wörter 
aneinander?

Entschuldigung, ich habe mich am Anfang ein wenig undeutlich 
ausgedrückt. Die 8 Bit habe ich nicht einzeln in einem Vektor 
gespeichert, sondern sie kommen bei fallender Taktflanke des SCLK's über 
den MISO Kanal. Das bedeutet: für jede der 8 fallende Taktflanken des 
SCLK's kann ich ein Bit des MISO's entnehmen. Danach geht der SCLK in 
den IDLE Zustand. Kurz darauf taktet dieser weiter und es werden wieder 
bei jeder fallenden Taktflanke die 8 Bit übertragen. Und das ganze 3 
mal.

Wäre es dann besser, erst einmal jedes Byte in ein 8 Bitwort zu packen 
und dann mit dem '&' Operator verknüpfen oder direkt bei jeder fallenden 
Flanke den aktuellen Wert des MISO's in ein 24 Bit Register zu schieben?

von Duke Scarring (Gast)


Lesenswert?

pico schrieb:
> Wäre es dann besser, erst einmal jedes Byte in ein 8 Bitwort zu packen
> und dann mit dem '&' Operator verknüpfen oder direkt bei jeder fallenden
> Flanke den aktuellen Wert des MISO's in ein 24 Bit Register zu schieben?
Letzteres. Bei Lothar Miller findest Du auch ein Beispiel dazu:
http://www.lothar-miller.de/s9y/categories/45-SPI-Master

Duke

von Autsch (Gast)


Lesenswert?

>Wäre es dann besser, erst einmal jedes Byte in ein 8 Bitwort zu packen
>und dann mit dem '&' Operator verknüpfen oder direkt bei jeder fallenden
>Flanke den aktuellen Wert des MISO's in ein 24 Bit Register zu schieben?


Da 24bit wahrscheinlich bei deinem nächsten Projekt nicht mehr aktuell 
sind, würde ich auf Byte-Ebene arbeiten. Dann kannst du später auch auf 
64bit oder was auch immmer gehen.

von der_max (Gast)


Lesenswert?

> Wäre es dann besser, erst einmal jedes Byte in ein 8 Bitwort zu packen
> und dann mit dem '&' Operator verknüpfen oder direkt bei jeder fallenden
> Flanke den aktuellen Wert des MISO's in ein 24 Bit Register zu schieben?

Das kommt auf dein Anwendungsfall an. Das kann man generell nicht
so einfach beantworten.
Wie "Autsch" schrieb, wenn du die Komponente wiederverwenden
willst, bist du mit einer 8 Bitorganisation wahrscheinlich
besser dran. Die 24 Bit Schiebeorganisation wird wahrscheinlich
die einfachere sein, kann aber beim naechsten Projekt vielleicht
gar nicht mehr so eingesetzt werden.

Max

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


Lesenswert?

Autsch schrieb:
> Da 24bit wahrscheinlich bei deinem nächsten Projekt nicht mehr aktuell
>sind, würde ich auf Byte-Ebene arbeiten.
Es ist mit VHDL auf einem FPGA i.A. eine schlechte Idee, sich an die 
8-Bit-Konventionen von irgendwelchen uCs zu halten. Wenn du ein FPGA 
verwendest, und für irgendeine Aufgabe 7 oder 13 Bits ideal sind, dann 
nimmst du natürlich nicht 8 bzw. 16 Bits! Und daher ist deine Aufgabe 
einfach: du bekomst einen Datenstrom mit Blöcken von jeweils 24 Bit und 
willst den abspeichern. In dieser Aufgabe kommt die Zahl 8 nicht vor...

Und wenn du dann hinterher dieses 24-Bit-Wort in 8-Bit Häppchen 
aufteilen willst (z.B. für eine Übertragung über einen 8-Bit-Bus), dann 
gibt es Multiplexer...

von Autsch (Gast)


Lesenswert?

>Und wenn du dann hinterher dieses 24-Bit-Wort in 8-Bit Häppchen
>aufteilen willst (z.B. für eine Übertragung über einen 8-Bit-Bus), dann
>gibt es Multiplexer...

Ich würde es genau umgekehrt machen: 8-Bit-Wort als Basis und diese 
Basis
dann (in Vielfachen) in einen breiteren Kontext bringen.
Aber viele Wege führen nach Rom, man muss sich nur im Klaren darüber 
sein, dass viele Busbreiten Vielfache von 8 sind ;-)

Autsch

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


Lesenswert?

Autsch schrieb:
> man muss sich nur im Klaren darüber sein,
> dass viele Busbreiten Vielfache von 8 sind ;-)
Und im Besonderen, dass das innerhalb eines FPGAs total egal ist...
;-)

von der_max (Gast)


Lesenswert?

> Und im Besonderen, dass das innerhalb eines FPGAs total egal ist...
> ;-)
Deswegen wuerde ich mal das Datenblatt des ADC lesen, wie die Daten
dort gesendet werden, und dann entscheiden was in diesem Fall
die bessere Loesung ist.
Es gibt auch die Moeglichekeit einen generellen SPI Slave machen
und die Bitbreite als Generic festlegen. Da gibt es viele
Moeglichkeiten...

Max

von Autsch (Gast)


Lesenswert?

Dickkopf ;-)

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


Lesenswert?

Autsch schrieb:
> Dickkopf ;-)
Pech, Zweiter. Jetzt passt der Zusammenhang nicht mehr... ;-)

von Autsch (Gast)


Lesenswert?

:-))

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.