mikrocontroller.net

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


Autor: Thomas B. (thomas1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag

Ich möchte ein String in einen std_logic_vector umwandeln, den ich dann 
an den Prozess weitergebe, der die serielle Schnittstelle steuert.

Ich habe schon diverses ausprobiert, aber auf einen grünen Zweig bin ich 
bisher nicht gekommen.
Es sollte ungefähr so aussehen
constant string_hw : string := "hello world";
signal rs_232_data : STD_LOGIC_VECTOR;

process(CLK_50M)
begin

   rs_232_data <= CONV_STD_LOGIC_VECTOR(string_hw(0),8);

end process;

Irgendwie sollte das doch funktionieren!
Weiss jemand wie?

Gruss
Thomas

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

Bewertung
0 lesenswert
nicht lesenswert
Ein einzelnes Zeichen (hier das 'X') wandelst du (mit der numeric_std) 
so in einen Vektor:
  rs_232_data <= std_logic_vector(to_unsigned(character'pos('X'),8)),
Jetzt mußt du nur noch die Zeichen aus der Zeile in einen character 
extrahieren.

BTW:
> CONV_STD_LOGIC_VECTOR
vergiss die alten Synopsys-Libs, nimm besser die numeric_std.

Autor: Thomas B. (thomas1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bedeutet
...(character'pos('X'),8))
 ?

Wie meinst Du das extrahieren in den Character?
Muss ich der Reihe nach jeden Character des String in ein 
Character-Signal kopieren?

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

Bewertung
0 lesenswert
nicht lesenswert
> Was bedeutet
> ...(character'pos('X'),8))
> ?
VHDL-Buch?

Sieh mal nach, wie der Datentyp Character definiert ist:
type character is (
nul, soh, stx, etx, eot, enq, ack, bel,
bs, ht, lf, vt, ff, cr, soe, si,
dle, dc1, dc2, dc3, dc4, nak, syn, tb,
can, em, sub, esc, fsp, gsp, rsp, usp,

' ', '!', '"', '#', '$', '%', '&', ''',
'(', ')', '*', '+', ',', '-', '.', '/',
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '?',

'@', 'A', 'B', ... 'X', ...
Dann überlegst du, was das Attribut 'pos zurückgibt, wenn es mit einem 
ASCII-Zeichen (z.B. 'X') aufgerufen wird: einen Integer mit der Position 
in dem obigen Array.

Und dieser integer wird dann in einen vector gewandelt.

> Muss ich der Reihe nach jeden Character des String in ein
> Character-Signal kopieren?
Ja, so ist das...

Autor: Thomas B. (thomas1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort, es funktioniert und im Terminal auf dem PC kann 
ich mein Character empfangen!

Jetzt noch eine Theorie-Frage:
Das 'pos guckt also, wo in der Character-Tabelle der Character (z.Bs. 
'X') zu finden ist und gibt dann den ASCII-Code dieser Stelle als 
Integer heraus.

Folglich könnte man also mit diesem 'pos auch andere Arrays nach einem 
Wert durchsuchen und dann wird der Index dieses Wertes herausgegeben?
subtype byte is STD_LOGIC_VECTOR(7 downto 0);
type array_of_bytes is array(15 downto 0) of byte;
constant constant_bytes : array_of_bytes := 
(
   x"AA", x"FF", x"A9", ..... x"1F"
);

signal test_byte : STD_LOGIC_VECTOR(7 downto 0) := (others => '0');


process(CLK)
begin
   ...
   test_byte <= constant_bytes'pos(x"A9");
   ...
end process;
Hier hätte also test_byte den Wert 2, weil es an Stelle 2 ist?
Oder ist es dann 3?

Autor: Thomas B. (thomas1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Lothar Miller

Stimmt das, was ich da geschrieben habe?

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

Bewertung
0 lesenswert
nicht lesenswert
signal test_byte : STD_LOGIC_VECTOR(7 downto 0) := (others => '0');
:
test_byte <= constant_bytes'pos(x"A9");
Das geht sowieso nicht, weil 'pos einen Integer zurückliefert.

Und zudem ist 'pos nicht auf solche zusammengesetzten Arrays anwendbar:
Prefix of attribute 'pos must be of discrete or physical type or 
subtype.

Du müssstest deshalb hier in einem Package deinen eigenen Typ definieren 
(ohne die std_logic_vector Sache). Sieh dir doch einfach mal an, wie das 
Package mit dem Character aufgebaut ist.

Autor: Thomas B. (thomas1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, das Package habe ich gefunden. Es ist in der Library STD im 
standard.vhd.

Da heisst es folgendes:
type CHARACTER is (
   NUL,  SOH,  STX,  ETX,  EOT,  ENQ,  ACK,  BEL,
   BS,  HT,  LF,  VT,  FF,  CR,  SO,  SI,
   DLE,  DC1,  DC2,  DC3,  DC4,  NAK,  SYN,  ETB,
   CAN,  EM,  SUB,  ESC,  FSP,  GSP,  RSP,  USP,
   
   usw....
)
Wie geht das genau mit dem type? Das sieht fast so aus wie wenn man ein 
Enum deklariert:
type my_enum is (State1, State2, State3);
signal State_enum : my_enum := State1;

Das 'pos habe ich zwar bisher nicht gefunden!
Wo ist das definiert?

Gruss
Thomas

PS: Hoffentlich ärgerst Du Dich nicht allzusehr ab meinen Fragen!

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas B. schrieb:
> Das sieht fast so aus wie wenn man ein Enum deklariert
Das ist ein enum :-)

> Das 'pos habe ich zwar bisher nicht gefunden!
> Wo ist das definiert?

'pos und 'val sind attribute, die es bei jedem enum gibt.

Rick

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

Bewertung
0 lesenswert
nicht lesenswert
Thomas B. schrieb:
> Das 'pos habe ich zwar bisher nicht gefunden!
> Wo ist das definiert?
Das ist eines der vordefinierten Attribute, die sich auf Typdefinitionen 
anwenden lassen:
http://www.quicknet.se/hdc/hdl/educaton/attribut/index.htm
Hier eine Anwendung für das Attribut 'pos:
http://www.lothar-miller.de/s9y/archives/49-FSM-de...

> Wie geht das genau mit dem type?
Du kannst in VHDL deine eigenen Typen definieren.
Z.B. sowas:
type myfamily_type is (mum, dad, myself, brother, sister);
signal oneofmyfamily : myfamily_type := mum;
und dann kannst du diesen Typ als Auswahlelement verwenden:
  if oneofmyfamily=mum then ...

  case oneofmyfamily is
     when mum => ...
     when dad => ...
     when others => ...
  end case;

> Das sieht fast so aus wie wenn man ein Enum deklariert:
Das ist es eigentlich auch, allerdings sind hier bei VHDL wesentlich 
tiefergehende Manipulationen möglich, wie du am Typ time (package 
standard) sehen kannst.

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.