www.mikrocontroller.net

Forum: FPGA, VHDL & Co. String in std_logic_vector tranformieren


Autor: Klaus S. (profi_sa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
möchte einen String auf eine Anzeige ausgeben.Dazu müssen die einzelnen 
Characters in 2x4Bit für die Ausgabe transformiert werden.
Hier mein Ansatz

constant   LCD_display_len:positive:=16;
subtype  LCD_display_string is string(1 to LCD_display_len);
subtype  LCD_display_bit is std_logic_vector(1 to LCD_display_len*8);


process (clk)
variable data_string :LCD_display_string := "test string for ";
variable data_bit    :LCD_display_bit;

nun bginnt das Problem

data_bit <= conv  ????????????????????????????

gibt es hier eine Lösng ?????????????????????????????


klaus


end process;

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da niemand außer die den Zeichensatz deines Displays kennt, wirst du 
nicht umhin kommen, selbst ein Skript zu schreiben, das dir das 
erledigt, oder es von Hand zu machen.

Kleiner Tipp am Rande: Die Fragezeichen-Taste reagiert genauso schnell 
wie alle anderen Tasten deiner Tastatur - also innerhalb einer Sekunde 
wieder loslassen.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib dir eine Konvertierungsfunktion, die alle Zeichen im String 
durchgeht und dem std_logic_vector die entsprechenden Werte zuweist. Du 
solltest dir aber im darüber im Klaren sein dass das alles nur mit 
konstanten Strings funktioniert, wenn überhaupt.

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Quartus zumindest sind strings kein Problem.
signal out_word : std_logic_vector(7 downto 0);
variable chr : character;

chr := data_string(index);
out_word <= CONV_STD_LOGIC_VECTOR(character'POS(chr), out_word'length);

Cheers, Roger

Autor: klaus Sandner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warte noch auf bessere Lösungsvorschläge!

die gesamte Stringläge soll mit einer Funktion oder Procedur in ein 
Bitarray übertragen werden,um dann über mir bekannte Funktionen an das 
Display auszugeben

Klaus

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du Platz in Deinem FPGA?
Dann nimm einen Softcore und lass den das machen. Da bist
Du mit der Formatierung viel flexibler.

Rick

Autor: klaus Sandner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin ja grad auf der Suche nach einer eigenen Lösung.Ich habe vor 
kurzem mit dem Programmieren in VHDL angefangen und möchte die 
Prinzipien der Progrmierung kennenlernen.
Ich versuche mit den vorhandenen Biliotheken richtig umzugehen.
Wer kann mir bitte den Lösungsweg nachvolziehbar aufzeigen.

Klaus

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erst mal musst du uns sagen welchen Zeichensatz das Display hat.
Ist dein Eingabestring in ASCII formatiert ?

Tobias

Autor: Klaus S. (profi_sa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Zeichensatz ist rein Aski.
Mir geht es hier hauptsächlich um Anwendung der Blibliotheken 
Tranformieren Text Aski in ein Array of Bits Std_logic_voctor der Größe 
8*Anzahl der Askizeichen.Die Bits müssen selectiv adressierbar sein,da 
die Ausgabe eines Zeichens in 2x4 Bit erfolgt.Doch mein Problem liegt im 
Moment nur in der Transformation

Klaus

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was meinst du mit Transformation. Du sagst doch selbst, das der 
Zeichensatz in Ascii schon vorliegt. Da musst du doch nix 
Transformieren. Liegt dein Problem einen geeigneten Datentyp zu 
definieren ? Die Standardbibliotheken haben nur Standardlösungen parat. 
Da musst du schon etwas eigenes definieren.

Einen BIT_VECTOR gibt es doch schon. Da kannst du jedes einzelne Bit 
direkt selektiv addressieren.

signal b_v : BIT_VECTOR(7 downto 0);
b_v(7) <= '1';

Du legst dir einen eigenen Datentyp an:

type t_BIT8VEC is array (7 downto 0) of BIT_VECTOR(7 downto 0);
type t_CHARARRAY is array ( integer range <> ) of t_BIT4VEC;

und dann:

signal m_string : CHARARRAY(DISP_LENGHT downto 0);

Jedes einzelne Bit kannst du dir jetzt setzen:
m_string(0)(0) <= '1'

Einzelne Zeichen rausholen und setzen wie belieben.
Wo ist dein Problem ?

Autor: Klaus S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Antwort

Hier sind Ansätze für die Lösung zum Teil aufgezeichnet.

Doch meine Ausgangslage ist kein Bitvektor sondern reiner Text in Form 
einer Stringvariablen

Beispiel

constant   LCD_display_len:positive:=16;
subtype    LCD_display_string is string(1 to LCD_display_len);

variable data_string :LCD_display_string := "String 16 Stelle";

Somit ist dein Ansatz schon einen Schritt zu weit:
------------------------------------------------------------------------ 
--
Einen BIT_VECTOR gibt es doch schon. Da kannst du jedes einzelne Bit
direkt selektiv addressieren.
------------------------------------------------------------------------ 
--

Variable data_string ist erst in das Hexformat zu transformiern.

Ansonsten müsste ich dies für jedes Zeichen selbst machen.
Mir geht es hier in erster Linie um die klassische Lösung mit 
Biblotheken  nicht um eine umständlich mögliche.

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also mir ist keine Funktion in einer VHDL-Standardlibrary bekannt, die 
eine Umwandlung von Strings in Binär nach Ascii-Codierung macht. Zumal 
das eh nur für simulative Zwecke sinnvoll wäre, da Strings in HW 
logischerweise nicht realisierbar sind. Für die Simulation würde ich 
nach einem passenden Package googeln oder eine Funktion mittels LUT 
schreiben, die zu jedem Character das passende Bitmuster aus der 
Ascii-Tabelle fischt.

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wo ist eigentlich das Problem?
string ist ein array von character, also kannst du mit 
data_string(index) darueber iterieren.
den ASCII ordinal von einem character laesst sich mit dem pos attribut 
herausfinden.
Steht auch alles in dem Buch wo du dein Beispiel her hast.
Es geht kaum klassischer als das.
Und mein Beispiel in eine Funktion packen sollte kein Problem sein.

Tip: wenn du einen haufen Strings hast, dann kann es sinvoller sein, die 
in einen internen RAM Block zu verschieben.

Cheers, Roger

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
T.M. wrote:
> [...] da Strings in HW logischerweise nicht realisierbar sind.

ABSOLUTER QUATSCH!

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.