mikrocontroller.net

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


Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
signal receive_buff  : std_logic_vector(15 downto 0);
signal tx_data_s     : std_logic_vector(7 downto 0);
.
.
.
-- Umwandlung
tx_data_s <= std_logic_vector(to_unsigned(to_integer(unsigned(receive_buff)),8));

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

Bewertung
0 lesenswert
nicht lesenswert
Probiers mal so:
 signal receive_buff  : std_logic_vector(15 downto 0);
 signal tx_data_s     : std_logic_vector(7 downto 0);
 :
 -- Umwandlung
 tx_data_s <=  receive_buff(15 downto 8);
 :
 tx_data_s <=  receive_buff(7 downto 0);

Autor: kyrel (Gast)
Datum:

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

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> gehts hier nur um das niederwertige Byte ?

Nein, um alle Bits des Vektors.

Autor: noips (Gast)
Datum:

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

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

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

Autor: noips (Gast)
Datum:

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

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

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

Autor: Marco (Gast)
Datum:

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

Autor: noips (Gast)
Datum:

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

Autor: noips (Gast)
Datum:

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

Autor: Floh (Gast)
Datum:

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

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

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

Autor: noips (Gast)
Datum:

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

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke euch allen!!!

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.