Forum: FPGA, VHDL & Co. Umwandlung 16-Bit-Vektor nach 8-Bit-Vektor??


von noips (Gast)


Lesenswert?

Hallo allerseits,

ich würde gerne den Inhalt eines 16-Bit-Vektors mittels Terminal am PC 
anzeigen. Dazu habe ich Uart im FPGA eingebaut (Code von Lothar Miller). 
Ich will jetzt nicht Vektor->BCD->ASCII Umwandlung machen. Es geht nur 
darum, den 16-Bit-Vektor ungefähr zu sehen, zur Kontrolle. Dazu würde 
ich den Vektor in ein 8-Bit-Vektor (also Byte) umwandeln und das Byte 
als Zeichen über ser. Schnittstelle an PC schicken und dort hexadezimall 
in einem Terminal anzeigen.

Das Problem ist noch, den 16-Bit-Wert in ein 8-Bit-Zeichen für den Uart 
hineinzubekommen. Wie kann man so eine Umwandlung machen? Ich habe da an 
so eine Möglichkeit gedacht, allerdings weiß ich nicht ob es 
synthesefähig ist und ob dabei das passiert was ich will:
1
signal receive_buff  : std_logic_vector(15 downto 0);
2
signal tx_data_s     : std_logic_vector(7 downto 0);
3
.
4
.
5
.
6
-- Umwandlung
7
tx_data_s <= std_logic_vector(to_unsigned(to_integer(unsigned(receive_buff)),8));

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


Lesenswert?

Probiers mal so:
1
 signal receive_buff  : std_logic_vector(15 downto 0);
2
 signal tx_data_s     : std_logic_vector(7 downto 0);
3
 :
4
 -- Umwandlung
5
 tx_data_s <=  receive_buff(15 downto 8);
6
 :
7
 tx_data_s <=  receive_buff(7 downto 0);

von kyrel (Gast)


Lesenswert?

Hallo noips,

gehts hier nur um das niederwertige Byte ? Wenn ja, wieso nicht sowas 
hier:

tx_data_s <= receive_buff(7 downto 0);

Schöne Grüße

von noips (Gast)


Lesenswert?

> gehts hier nur um das niederwertige Byte ?

Nein, um alle Bits des Vektors.

von noips (Gast)


Lesenswert?

> Nein, um alle Bits des Vektors.

naja, so stimmt es natürlich nicht, weil 8-Bit-Wert viel ungenauer ist. 
Ich meine der Wert des 16-Bit-Vektors soll umskaliert im 8-Bit-Vektor 
erscheinen.

16-bit(hex)    --->    8-bit(hex)

 0000          --->      00
 1000          --->      10
 FFFF          --->      FF

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


Lesenswert?

Du willst also nur die 8 MSB?
Falls ja: ich hatte die Lösung schon erwähnt...
1
 tx_data_s <=  receive_buff(15 downto 8);

von noips (Gast)


Lesenswert?

> Du willst also nur die 8 MSB?

mmm, nein. Ich kanns irgendwie nicht erklären was ich meine. Also wenn 
der 16-bit-vektor zur Hälfte "belegt" ist, dann soll auch 8-Bit-Vektro 
zur Hälfte belegt sein, das Gleiche gilt auch bei einem Viertel, Achtel 
und allen denkabaren Verhältnissen. Ich hoffe, dass das jetzt 
verständlich ist!

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


Lesenswert?

noips schrieb:
> Ich hoffe, dass das jetzt verständlich ist!
Nein.

Aber ich meine, dass du da einen kapitalen Denkfehler hast:
Du wirst sowieso einen Genaugkeitsverlust bekommen, denn die Information 
von 16 Bits passt ganz einfach nicht in 8 Bits...

> Ich kanns irgendwie nicht erklären was ich meine.
Probiers und fülle die Tabelle aus:
 0000          --->      00
 0080          --->
 00FF          --->
 0180          --->
 1000          --->      10
 1001          --->
 1000          --->
 2000          --->
 8000          --->
 8001          --->
 8181          --->
 FFFF          --->      FF

von Marco (Gast)


Lesenswert?

noips schrieb:
>> Nein, um alle Bits des Vektors.
>
> naja, so stimmt es natürlich nicht, weil 8-Bit-Wert viel ungenauer ist.
> Ich meine der Wert des 16-Bit-Vektors soll umskaliert im 8-Bit-Vektor
> erscheinen.
>
> 16-bit(hex)    --->    8-bit(hex)
>
>  0000          --->      00
>  1000          --->      10
>  FFFF          --->      FF

Du willst also die "oberen" 8 Bits von deinem 16 bit Vektor ! Damit hat 
dir Lothar die Lösung schon verraten.

von noips (Gast)


Lesenswert?

Erstmal Danke für eure Antworten!!

> Aber ich meine, dass du da einen kapitalen Denkfehler hast:

Ich meine nicht.

> Du wirst sowieso einen Genaugkeitsverlust bekommen, denn die Information
> von 16 Bits passt ganz einfach nicht in 8 Bits...

Das ist mir ja klar. Genau das habe ich hier gemeint:

noips schrieb:
>> Nein, um alle Bits des Vektors.
>
> naja, so stimmt es natürlich nicht, weil 8-Bit-Wert viel ungenauer ist.

von noips (Gast)


Lesenswert?

Ich probiere es mal so:

Bekannt ist das 16-Bit-Ergebnis einer AD-Wandlung von einem anlogen Wert 
mit 16-Bit-Wandler.

Gesucht ist der 8-Bit-Wert, den ein 8-Bit-Wandler bei gleichem analogen 
Wert ausgeben würde.

Das 8-Bit-Wandler nicht so fein auflöst wie der 16-Bit verstehe ich 
schon. Aber, wie gesagt, es geht mir um eine grobe Darstellung.

von Floh (Gast)


Lesenswert?

noips schrieb:
> Bekannt ist das 16-Bit-Ergebnis einer AD-Wandlung von einem anlogen Wert
> mit 16-Bit-Wandler.
>
> Gesucht ist der 8-Bit-Wert, den ein 8-Bit-Wandler bei gleichem analogen
> Wert ausgeben würde.

Das wären dann die oberen 8 Bit.

Stells dir so vor, für jede ungenaue Stufe des 8-bit-ADCs hätte der 
genaue ADC 256 Abstufungen (8bit).
:-)

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


Lesenswert?

>> Aber ich meine, dass du da einen kapitalen Denkfehler hast:
> Ich meine nicht.
Oh, doch.... :-o

noips schrieb:
> Gesucht ist der 8-Bit-Wert, den ein 8-Bit-Wandler bei gleichem analogen
> Wert ausgeben würde.
Wenn beide AD-Wandler den selben Messbereich haben (z.B. o..5V), dann 
sind das die 8 MSB.
Nur kann eben der 16-Bit ADC kleine Änderungen noch besser aufteilen. 
Das sind die 8 LSB.

von noips (Gast)


Lesenswert?

OK, überredet :-)

Ich sehe meinen Fehler jetzt. Ich habe die AD-Wandlung mit der 
13-Segment-Kennlinie in digitaler Form verwechselt. Da durfte man nicht 
einfach so die unteren Bits weglassen. Aber da ist die Kennlinie auch 
nicht linear.

von noips (Gast)


Lesenswert?

Danke euch allen!!!

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.