mikrocontroller.net

Forum: FPGA, VHDL & Co. std_logic_vector zu ASCII wandeln


Autor: Stanko T. (newie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

habe folgende Frage:

Wie kann ich einen std_logic_vector nach ASCII wandeln.

z.B: Ich messe binär "10101010" und möchte am LCD dez 170 sehen.

Habe was über character'vol(conv_integer.... ) gefunden, aber komme grad 
nicht weiter. In den Conversion Functions steht auch nix drin.


Vorab besten Dank!


Gruss
Stanko

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> Ich messe binär "10101010" und möchte am LCD dez 170 sehen.
Dann hilft dir ein character nicht unbedingt weiter, denn du kannst 
einen (VHDL-) character nicht auf FPGA-Portpins ausgeben. Vorher mußt du 
ihn wieder auf einen Vektor zurückwandeln. Damit das Ganze nicht in eine 
Konvertierungsorgie ausartet, solltest du es ein wenig binärer 
betrachten.

Du mußt erst mal die einzelnen Dezimalstellen ermitteln. Das hatten wir 
schon ein paar mal, zuletzt im 
Beitrag "Durch 10 teilen"

Wenn du dann die drei Dezimalstellen in BCD-Darstellung hast, dann 
stellt du dir die Frage: wie komme ich von binär 00000000 (=0) nach 
00110000 (=ASCII-Null)? Hier eine Tabelle zum Thema:

dez   binär      ASCII-binär
0     00000000   00110000
1     00000001   00110001
2     00000010   00110010
3     00000011   00110011
4     00000100   00110100
:

Du kannst das Muster leicht erkennen: einfach vor die 4-Bit-BCD-Zahl 
noch "0011" hängen. Fertig.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity bin2char is
    Port ( inp : in  STD_LOGIC_VECTOR (7 downto 0);
           einer : out  STD_LOGIC_VECTOR (7 downto 0);
           zehner : out  STD_LOGIC_VECTOR (7 downto 0);
           hunderter : out  STD_LOGIC_VECTOR (7 downto 0));
end bin2char;

architecture Behavioral of bin2char is
   subtype SLV12 is std_logic_vector (11 downto 0);
   type Rom128x8 is array (0 to 255) of SLV12;
   constant BCDRom : Rom128x8 := (
    x"000", x"001", x"002", x"003", x"004", x"005", x"006", x"007", x"008", x"009",  
    x"010", x"011", x"012", x"013", x"014", x"015", x"016", x"017", x"018", x"019",  
    x"020", x"021", x"022", x"023", x"024", x"025", x"026", x"027", x"028", x"029",  
    x"030", x"031", x"032", x"033", x"034", x"035", x"036", x"037", x"038", x"039",  
    x"040", x"041", x"042", x"043", x"044", x"045", x"046", x"047", x"048", x"049",  
    x"050", x"051", x"052", x"053", x"054", x"055", x"056", x"057", x"058", x"059",  
    x"060", x"061", x"062", x"063", x"064", x"065", x"066", x"067", x"068", x"069",  
    x"070", x"071", x"072", x"073", x"074", x"075", x"076", x"077", x"078", x"079",  
    x"080", x"081", x"082", x"083", x"084", x"085", x"086", x"087", x"088", x"089",  
    x"090", x"091", x"092", x"093", x"094", x"095", x"096", x"097", x"098", x"099",  
    x"100", x"101", x"102", x"103", x"104", x"105", x"106", x"107", x"108", x"109",  
    x"110", x"111", x"112", x"113", x"114", x"115", x"116", x"117", x"118", x"119",  
    x"120", x"121", x"122", x"123", x"124", x"125", x"126", x"127", x"128", x"129",  
    x"130", x"131", x"132", x"133", x"134", x"135", x"136", x"137", x"138", x"139",  
    x"140", x"141", x"142", x"143", x"144", x"145", x"146", x"147", x"148", x"149",  
    x"150", x"151", x"152", x"153", x"154", x"155", x"156", x"157", x"158", x"159",  
    x"160", x"161", x"162", x"163", x"164", x"165", x"166", x"167", x"168", x"169",  
    x"170", x"171", x"172", x"173", x"174", x"175", x"176", x"177", x"178", x"179",  
    x"180", x"181", x"182", x"183", x"184", x"185", x"186", x"187", x"188", x"189",  
    x"190", x"191", x"192", x"193", x"194", x"195", x"196", x"197", x"198", x"199",  
    x"200", x"201", x"202", x"203", x"204", x"205", x"206", x"207", x"208", x"209",  
    x"210", x"211", x"212", x"213", x"214", x"215", x"216", x"217", x"218", x"219",  
    x"220", x"221", x"222", x"223", x"224", x"225", x"226", x"227", x"228", x"229",  
    x"230", x"231", x"232", x"233", x"234", x"235", x"236", x"237", x"238", x"239",  
    x"240", x"241", x"242", x"243", x"244", x"245", x"246", x"247", x"248", x"249",  
    x"250", x"251", x"252", x"253", x"254", x"255" );
   signal digits : std_logic_vector (11 downto 0);

begin
   digits <= BCDRom(to_integer(unsigned(inp))); 
   
   -- Formal
   einer     <= std_logic_vector(("0000"&unsigned(digits (3 downto 0))) + to_unsigned(character'pos('0'),8));
   zehner    <= std_logic_vector(("0000"&unsigned(digits (7 downto 4))) + to_unsigned(character'pos('0'),8));
   hunderter <= std_logic_vector(("0000"&unsigned(digits(11 downto 8))) + to_unsigned(character'pos('0'),8));

   -- kürzere Schreibweise mit Hilfe von Nachdenken ermittelt ;-)
   einer     <= "0011"&digits (3 downto 0);
   zehner    <= "0011"&digits (7 downto 4);
   hunderter <= "0011"&digits(11 downto 8);
end Behavioral;
Die formale Beschreibung mit der expliziten Addition bringt gehörigen 
Mehraufwand in Form dreier Addiere mit ins Spiel (Screenshot). Die 
entfallen natürlich bei der direkten Concatenation von "0011".

Autor: Stanko T. (newie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Lothar,

vielen Dank für die Antwort!
Hab die Sache grad simuliert und es funktioniert.

Die Einbindung ins FPGA ist nur noch Fleißarbeit.

Ich sage nur Eins: "Yes, You can!"


Gruss
Stanko

Autor: Beobachter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OffTopic:

Mensch Lothar, ich bin ja immer wieder fasziniert, mit wie viel Elan du 
hier den Leuten die Aufgaben machst... Respekt!

Mit deinem Wissen müsstet du ja eine Menge Geld als VHDL-Entwickler 
verdienen. Darf ich fragen, ob du das auch beruflich machst oder ist das 
nur ein Hobby?

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

Bewertung
0 lesenswert
nicht lesenswert
> Mit deinem Wissen müsstet du ja eine Menge Geld ... verdienen.
Ja, wie war das?
Ich verdiene mehr als ich bekomme ;-)

> Darf ich fragen, ob du das beruflich machst oder ist das nur ein Hobby?
Sowohl als auch.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich den hier geposteten code verwende geht bei mir die Hunderter 
Stelle immer nur bis 2. Kann mir irgendwer erklären wieso?


Danke

mfg

michael

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

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Wenn ich den hier geposteten code verwende geht bei mir die Hunderter
> Stelle immer nur bis 2. Kann mir irgendwer erklären wieso?
Weil die Tabelle nur Einträge bis 255 hat, oder?

Konterfrage: WAS willst du machen?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine integer bzw. std_logic_vector Zahl auf einem LCD Display ausgeben.

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

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Eine integer bzw. std_logic_vector Zahl auf einem LCD Display ausgeben.
Welchen Bereich?
0..99, oder -9999..9999 oder ?...?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Bereich von +/-32 Bit

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei Hexadezimal Anzeige ist das klein und einfach... bei Dezimal wär die 
Lookup-Tabelle aber 8Gbyte groß.
Da ist rechnen besser ... also ne kleine Statemachine ist wohl das beste 
dafür

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie Würde der Ansatz dafür aussehen, bin momentan etwas verwirrt.

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Reche doch mal selber auf nem Blatt Papier ...
Beitrag "HEX2BCD Code - Frage zum Ablauf"
Dann ne eigen Statemachine mit countern, Registern und Subtrahierern 
oder nen Picoblaze.
Man muß halt gucken wie oft die einer(Milliarden) reingehen (Dividieren 
bzw. zählen wie oft 1.000.000.000 subtrahiert werden können ohne das das 
Ergebnis negativ wird, dann Zählstand notieren im Register und man hat 
die einer Miliarden) dann die Hunderter Millionen usw. das Ergebins 
sollte also nie größer als 9 sein. also brauchst du im worst case ca 100 
durchläufe ...
Ach ne du wilst ja auch negative Zahlen haben, na dann ...
und jetzt bist du dran ...

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

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Im Bereich von +/-32 Bit
Das passt nicht in einen "üblichen" Integer...

Uwe schrieb:
> Man muß halt gucken
... was schon dazu geschrieben wurde:
https://www.mikrocontroller.net/search?query=bcd+u...

> also brauchst du im worst case ca 100 durchläufe ...
Es geht schneller: Beitrag "Schnelle Conversion bin2dec"

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>also brauchst du im worst case ca 100 durchläufe ...
>>Es geht schneller: Beitrag "Schnelle Conversion bin2dec"
Jupp aber ich meinte auf dem Papier bzw. so wie ebend geschrieben.
Zudem soller erst mal das Grundlegende Prinzip verstehen und kein 
optimiertes Design vorgelegt bekommen. Selber nachdenken schadet nicht 
...

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

Bewertung
0 lesenswert
nicht lesenswert
Uwe schrieb:
> Jupp aber ich meinte auf dem Papier bzw. so wie ebend geschrieben.
> Zudem soller erst mal das Grundlegende Prinzip verstehen
Ja, da könnte man selber draufkommen. Oder zumindest versuchen, zu 
verstehen, warum der obige Code nur bis 255 funktioniert, oder zumindest 
den Post und die Links darin (wie z.B. denjenigen im 
Beitrag "Re: std_logic_vector zu ASCII wandeln") zu lesen und 
nachzuvollziehen, um was es da geht...

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.