Forum: FPGA, VHDL & Co. Strings konkattinieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Fpga I. (fpga-ing)


Lesenswert?

Hallo zusammen,

ich möchte in meiner Testbench mir gern einen String zusammenbauen und 
diesen anschließend mit einem Report Statement ausgeben. Leider stehe 
ich gerade auf dem Schlauch, wie ich das am Besten anstelle. So schon 
mal nicht ;-)
1
process
2
  constant c_MyValue : integer := 42;
3
  variable v_MyString : string(1 to 1024);
4
begin
5
  v_MyString := "Hello ";
6
  wait for 10 ns;
7
  v_MyString := v_MyString & "World ";
8
  wait for 10 ns;
9
  v_MyString := v_MyString & to_string(c_MyValue);
10
  wait;
11
end process;

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


Lesenswert?

Fpga I. schrieb:
> So schon mal nicht ;-)
Welcher Simulator meldet da was? Auf welche VHDL-Version ist dein 
Simulator eingestellt?

BTW: kann dein Simulator was mit integer'image() anfangen?

von Fpga I. (fpga-ing)


Lesenswert?

Aktuell nutze ich Questsasim mit VHDL2008, wobei das ein VHDL-typisches 
Problem ist und m.E. simulatorunabhängig.

In der Zeile 7 würde der Simulator melden, dass der Range nicht passt 
(links 1024, rechts 1024 + 7 oder 8 (also die Länge von "World ").
Ich hab schon überlegt, ob mir eine line weiterhilft, da kann ich ja 
mittels write werte anhängen, allerdings weiß ich nicht, wie ich eine 
line in einen String konvertieren kann, damit er mittels Report 
ausgegeben werden kann.

integer'image() funktioniert auch, wobei ich mir mit VHDL2008 die 
to_string() Funktion angewöhnt habe.

P.S. in meinem Beispiel fehlt am Ende das report statement:
1
  [...]
2
  v_MyString := v_MyString & to_string(c_MyValue);
3
  report v_MyString severity note;
4
  wait;
5
end process;

: Bearbeitet durch User
von Markus F. (mfro)


Lesenswert?

Fpga I. schrieb:
> So schon
> mal nicht ;-)

so ginge es:
1
process(all)
2
    constant c_MyValue : integer := 42;
3
    type string_access is access string;
4
    variable v_MyString : string_access;
5
begin
6
    v_MyString := new string'("Hello ");
7
    v_MyString := new string'(v_MyString.all & "World ");
8
    v_MyString := new string'(v_MyString.all & to_string(c_MyValue));
9
    report(v_MyString.all) severity note;
10
end process;
(wobei das so natürlich ein paar Speicherleichen produziert, die Du 
selber aufräumen darfst).

Aber warum nicht einfach so:
1
report("Hello " & "World" & to_string(c_MyValue)) severity note;
???

von Fpga I. (fpga-ing)


Lesenswert?

Vielen Dank, das werde ich mal ausprobieren. Ist access string das VHDL 
Equivalent zu einem Pointer?


Markus F. schrieb:
> Aber warum nicht einfach so:
> report("Hello " & "World" & to_string(c_MyValue)) severity note;

In meinem Test sammle ich zu verschiedenen Zeitpunkten Informationen, 
die im report statement als eine Zeile ausgegeben werden sollen. Zum 
Zeitpunkt des Reset Statements weiß ich aber nicht mehr, wie viele und 
welche Informationen im Laufe des Testcases gesammelt habe. Daher der 
Wunsch, eine report Zeile stückweise zusammensetzen zu können.

von Markus F. (mfro)


Lesenswert?

Fpga I. schrieb:
> Vielen Dank, das werde ich mal ausprobieren. Ist access string das VHDL
> Equivalent zu einem Pointer?

Ja, access types sind praktisch Pointer.

Merke, dass jedes new ein korrespondierendes deallocate braucht, sonst 
produzierst Du Speicherlecks - VHDL hat keinen Garbage Collector.

von Wilhelm M. (wimalopaan)


Lesenswert?

Konkatenieren

von Gustl B. (-gb-)


Lesenswert?

1
  process
2
    constant c_MyValue : integer := 42;
3
    variable v_MyString : string(1 to 1024);
4
  begin
5
    v_MyString := (1 to 1024 - 6 => ' ') & "Hello ";
6
    wait for 10 ns;
7
    v_MyString := v_MyString(7 to 1024) & "World ";
8
    wait for 10 ns;
9
    v_MyString := v_MyString(to_string(c_MyValue)'Length + 1 to 1024) & to_string(c_MyValue);
10
    wait for 10 ns;
11
    report v_MyString;
12
    wait;
13
  end process;

Simuliert wunderprächtigst. Der String ist eben fest 1024 Zeichen lang. 
Wenn man da hinten was anhängen will, dann muss man den String schieben 
und vorne was weglassen.

von Markus F. (mfro)


Lesenswert?

Gustl B. schrieb:
> Simuliert wunderprächtigst. Der String ist eben fest 1024 Zeichen lang.
> Wenn man da hinten was anhängen will, dann muss man den String schieben
> und vorne was weglassen.

Na ja. Wir haben das Jahr 2023, ganze Zeitschriftenartikel, 
Diplomarbeiten und Abiturprüfungen werden von AIs geschrieben, aber 
unsereins soll Buchstaben abzählen wie vor 100 Jahren?

Ich würde - wenn ich so was machen wollte - wenigstens so was: 
https://github.com/kevinpt/vhdl-extras verwenden. Dort gibt es eine 
(soweit das in VHDL eben geht) VHDL-Implementierung des unbounded 
strings Pakets "Ada.Strings.Unbounded".

Auch nicht unbedingt Raketentechnik, aber das bringt uns wenigstens auf 
den Stand der Siebziger.

von Gustl B. (-gb-)


Lesenswert?

Markus F. schrieb:
> unsereins soll Buchstaben abzählen

Du kannst auch 'Length verwenden.

von Markus F. (mfro)


Lesenswert?

Gustl B. schrieb:
> Du kannst auch 'Length verwenden.

Gustl B. schrieb:
1
> v_MyString := (1 to 1024 - 6 => ' ') & "Hello ";

So etwa?
1
v_MyString := (1 to 1024 - string'("Hello ")'Length) & "Hello ";

Das sieht dann aber aus wie ein sehr angestrengter Versuch ;)

von Gustl B. (gustl_b)


Lesenswert?

Wenn du schon feste Strings hast wie hier das "Hello " dann kannst du 
beim Tippen mitzählen. Oder den String als Konstante ablegen. Oder beim 
Report den noch undefinierten String mit einem & an den konstanten 
String ranhängen. Ich finde es macht wenig Sinn da einen langen String 
mit 1024 Zeichen haben zu wollen. Wo ist der Mehrwert? Ich würde immer 
dort wo Informationen anfallen die ich haben will diese sofort reporten. 
Im Terminal sind das dann viele Zeilen, aber das kann man ja schön 
formatieren.

von Stefan F. (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Konkatenieren

Auch richtig geschrieben ist das eins der schrecklichen IT-Denglisch 
Wörter, die im Wortschatz normaler Menschen gänzlich fehlen.

Warum schreibt man nicht "verketten"?

von Gustl B. (gustl_b)


Lesenswert?


von Motopick (motopick)


Lesenswert?

> Warum schreibt man nicht "verketten"?

Warum sollte man?
Mann benutzt ja auch 'disjunkt', 'adjazent' oder 'imbazil'.

Bei "konkattinieren" dreht sich aber der Magen schon um.

: Bearbeitet durch User
von Percy N. (vox_bovi)


Lesenswert?

Stefan F. schrieb:
> Auch richtig geschrieben ist das eins der schrecklichen IT-Denglisch
> Wörter, die im Wortschatz normaler Menschen gänzlich fehlen.

Wer sie gleichwohl benutzt, wird trotzdem nicht inkarzeriert.

Aber "normale Menschen" verständigen sich vermutlich ohnehin eher auf 
Chinesisch. Hindi, Spanisch oder Punjabi.  Oder Pidgin-Englisch.

Motopick schrieb:
> Mann benutzt ja auch 'disjunkt',
wenn, dann diskret, selbst Frauen ...
> 'adjazent'
im Grenzbereich
> oder 'imbazil'.
Allenfalls zur Selbstdarstellung.

: Bearbeitet durch User
von Motopick (motopick)


Lesenswert?

Percy N. schrieb:
> 04:54: Bearbeitet durch User

Keinen Nachtschlaf gefunden?

> Allenfalls zur Selbstdarstellung.

Wenn man viel Kommunizieren muss, sind mir die viel lieber
als die, die einen Satz qualsam und langvoll mit dutzenden
"Aeeeh" fuellen muessen, weil deren (imbaziles) Gehirn beim
Sprechen nicht mit dem Denken nachkommt.

von Stefan F. (Gast)


Lesenswert?

Motopick schrieb:
>> Warum schreibt man nicht "verketten"?
> Warum sollte man?
> Mann benutzt ja auch 'disjunkt', 'adjazent' oder 'imbazil'.

Also ich benutze diese Wörter niemals. Andererseits muss ich zugeben, 
dass ich meinen Computer häufig update.

Percy N. schrieb:
> Wer sie gleichwohl benutzt, wird trotzdem nicht inkarzeriert.

Oha, dass muss ich googeln.

von Motopick (motopick)


Lesenswert?

> Oha, dass muss ich googeln.

Wenn du schon dabei bist: "fuesilieren".

Und den lateinischen Wortstamm vom "konkatinieren" kannst du
dabei auch gleich nachschlagen.
Es ist mitnichten Denglisch.

Einem String wird dabei eigentlich zu viel der Ehre zuteil.
Die beiden Teile werden ja nur "zusammengepappt".
Im Gegensatz zu einer Liste die danach u.U. Vorwaerts- und
Rueckwaertsverkettung kennt.

von Stefan F. (Gast)


Lesenswert?

Motopick schrieb:
> Einem String wird dabei eigentlich zu viel der Ehre zuteil.

Mein Sohn kriegt immer rote Ohren, wenn ich das Wort benutze.

von Motopick (motopick)


Lesenswert?

> wenn ich das Wort benutze

"zusammenpappen"?

von Gustl B. (gustl_b)


Lesenswert?


von Stefan F. (Gast)


Lesenswert?

Ich meinte natürlich den String, ihr Pappnasen.

von Percy N. (vox_bovi)


Lesenswert?

Stefan F. schrieb:
> Ich meinte natürlich den String, ihr Pappnasen.

Dann hast Du bei seiner Erziehung entweder alles richtig oder einiges 
falsch gemacht. Ansichtssache.

SCNR

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.