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


von Klaus S. (profi_sa)


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;

von Jan M. (mueschel)


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.

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von Roger S. (edge)


Lesenswert?

In Quartus zumindest sind strings kein Problem.
1
signal out_word : std_logic_vector(7 downto 0);
2
variable chr : character;
3
4
chr := data_string(index);
5
out_word <= CONV_STD_LOGIC_VECTOR(character'POS(chr), out_word'length);

Cheers, Roger

von klaus Sandner (Gast)


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

von Rick Dangerus (Gast)


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

von klaus Sandner (Gast)


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

von Tobias (Gast)


Lesenswert?

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

Tobias

von Klaus S. (profi_sa)


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

von Tobias (Gast)


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 ?

von Klaus S. (Gast)


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.

von T.M. (Gast)


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.

von Roger S. (edge)


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

von Roger S. (edge)


Lesenswert?

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

ABSOLUTER QUATSCH!

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.