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;
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.
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.
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
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
Hast Du Platz in Deinem FPGA? Dann nimm einen Softcore und lass den das machen. Da bist Du mit der Formatierung viel flexibler. Rick
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
Erst mal musst du uns sagen welchen Zeichensatz das Display hat. Ist dein Eingabestring in ASCII formatiert ? Tobias
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
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 ?
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.