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


von Thomas B. (thomas1)


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
1
constant string_hw : string := "hello world";
2
signal rs_232_data : STD_LOGIC_VECTOR;
3
4
process(CLK_50M)
5
begin
6
7
   rs_232_data <= CONV_STD_LOGIC_VECTOR(string_hw(0),8);
8
9
end process;

Irgendwie sollte das doch funktionieren!
Weiss jemand wie?

Gruss
Thomas

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ein einzelnes Zeichen (hier das 'X') wandelst du (mit der numeric_std) 
so in einen Vektor:
1
  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.

von Thomas B. (thomas1)


Lesenswert?

Was bedeutet
1
...(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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

Sieh mal nach, wie der Datentyp Character definiert ist:
1
type character is (
2
nul, soh, stx, etx, eot, enq, ack, bel,
3
bs, ht, lf, vt, ff, cr, soe, si,
4
dle, dc1, dc2, dc3, dc4, nak, syn, tb,
5
can, em, sub, esc, fsp, gsp, rsp, usp,
6
7
' ', '!', '"', '#', '$', '%', '&', ''',
8
'(', ')', '*', '+', ',', '-', '.', '/',
9
'0', '1', '2', '3', '4', '5', '6', '7',
10
'8', '9', ':', ';', '<', '=', '>', '?',
11
12
'@', '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...

von Thomas B. (thomas1)


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?
1
subtype byte is STD_LOGIC_VECTOR(7 downto 0);
2
type array_of_bytes is array(15 downto 0) of byte;
3
constant constant_bytes : array_of_bytes := 
4
(
5
   x"AA", x"FF", x"A9", ..... x"1F"
6
);
7
8
signal test_byte : STD_LOGIC_VECTOR(7 downto 0) := (others => '0');
9
10
11
process(CLK)
12
begin
13
   ...
14
   test_byte <= constant_bytes'pos(x"A9");
15
   ...
16
end process;
Hier hätte also test_byte den Wert 2, weil es an Stelle 2 ist?
Oder ist es dann 3?

von Thomas B. (thomas1)


Lesenswert?

@ Lothar Miller

Stimmt das, was ich da geschrieben habe?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
signal test_byte : STD_LOGIC_VECTOR(7 downto 0) := (others => '0');
2
:
3
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.

von Thomas B. (thomas1)


Lesenswert?

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

Da heisst es folgendes:
1
type CHARACTER is (
2
   NUL,  SOH,  STX,  ETX,  EOT,  ENQ,  ACK,  BEL,
3
   BS,  HT,  LF,  VT,  FF,  CR,  SO,  SI,
4
   DLE,  DC1,  DC2,  DC3,  DC4,  NAK,  SYN,  ETB,
5
   CAN,  EM,  SUB,  ESC,  FSP,  GSP,  RSP,  USP,
6
   
7
   usw....
8
)
Wie geht das genau mit dem type? Das sieht fast so aus wie wenn man ein 
Enum deklariert:
1
type my_enum is (State1, State2, State3);
2
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!

von Rick Dangerus (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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-debuggen.html

> Wie geht das genau mit dem type?
Du kannst in VHDL deine eigenen Typen definieren.
Z.B. sowas:
1
type myfamily_type is (mum, dad, myself, brother, sister);
2
signal oneofmyfamily : myfamily_type := mum;
und dann kannst du diesen Typ als Auswahlelement verwenden:
1
  if oneofmyfamily=mum then ...
2
3
  case oneofmyfamily is
4
     when mum => ...
5
     when dad => ...
6
     when others => ...
7
  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.

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.