Forum: FPGA, VHDL & Co. std_logic_vector nach character konvertieren/umwandeln


von Andreas D. (Gast)


Lesenswert?

Via Google kann ich leider nichts finden, aber vielleicht kann mir ja 
hier jemand den entscheidenden Tipp geben.

Bisher habe ich std_logic_vector immer wie folgt in charecter 
konvertiert:
1
RX_char := character'val(to_integer(unsigned(RX_data)));

Mit den Actel Tools ging das auch immer ohne Probleme. Nun muss ich aber 
ein Projekt auf Xilinx umstellen und das Xilinx ISE 9.2.04i spuckt mir 
beim Synthetisieren immer folgenden Fehler aus:

ERROR:Xst:772 - " ... /debug_UART_processor.vhd" line 109: Attribute is 
not authorized : 'val'.

Vielleicht kann mir ja jemand auf die Sprünge helfen wie ich die 
Konvertierung auch mit Xilinx hin bekomme. Die Forums-Suche hat mich 
leider auch nicht weiter gebracht.

Vielen Dank im Voraus

Andreas

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

Laut XST User Guide ist 'val nicht unterstützt (leider).
Das wäre mal wieder ein Grund einen Webcase zu eröffnen.

Du kannst Dir aber ungefähr so helfen:
1
function slv_to_char( slv: std_logic_vector) return character is
2
  variable tmp: natural;
3
begin
4
  tmp := to_integer( unsigned( slv));
5
  case tmp is
6
    -- ...
7
    when 32 => return( character'(' '));
8
    -- ...
9
    when 64 => return( character'('@'));
10
    when 65 => return( character'('A'));
11
    when 66 => return( character'('B'));
12
    -- ...
13
  end case;
14
end;

Duke

von Andreas D. (Gast)


Lesenswert?

:-(

nicht sonderlich praktisch.

Gibt es denn keine einfachere Lösung für die Konvertierung?

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


Lesenswert?

Andreas D. schrieb:
> Gibt es denn keine einfachere Lösung für die Konvertierung?
Blöderweise geht auch 'succ' nicht und auch keines der anderen 
brauchbaren Attribute...
1
XST V12.4
2
VHDL Specifications 
3
• Attribute
4
Supported for some predefined attributes only:
5
– HIGH
6
– LOW
7
– LEFT
8
– RIGHT
9
– RANGE
10
– REVERSE_RANGE
11
– LENGTH
12
– POS
13
– ASCENDING
14
– EVENT
15
– LAST_VALUE

Andreas D. schrieb:
> Bisher habe ich std_logic_vector immer wie folgt in charecter
> konvertiert:
Wofür brauchst du das eigentlich?

von Andreas D. (Gast)


Lesenswert?

Na ja empfange halt ein ASCII-Zeichen via UART und muss dann abhängig 
vom empfangenem Zeichen reagieren. Klar kann ich das auch mit dem ROM 
lösen oder einfache die Überprüfung in den entsprechenden Hex-Wert des 
ASCII-Zeichen ändern, aber mit meinem oben genannten Ansatz ist es halt 
einfach viel lesbarer und übersichtlicher. Bei Actel klappt das auch 
alles wunderbar.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Also von character to unsigned have ich eine einfach Lösung. Kann man 
auch zustd_logic_vector weiter casten.
1
--when not endfile(in_file) loop
2
if  wr_en='0' then 
3
  --wr<='0';
4
  elsif clk'event and clk='1' then
5
    if not endfile (in_file) then
6
      read(in_file,a);
7
    end if;
8
    data_in<=to_unsigned(character'pos(a),8);--very tricky the conversation
9
  --  wr<='1';
10
   
11
end if;
12
end process;

Gibt es nicht so ein Cast in die andere Richtung?
Wie vom Autor ursprünglich gesucht?
Ich will auch nur es für die Testbench nutzen und in ein File schreiben.
Lesen kann ich die Bytes schon.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Lothar hat es schon beantwortet.
Danke Lothar, von deinen Posts wird die Nachwelt noch profitieren. Auch 
wenn sie unvollständig sind. Der Startpunkt für die Idee hatte mir nur 
gefehlt.

1
char_buff<=character'val(to_integer(unsigned(data_in)));

von Rick Dangerus (Gast)


Lesenswert?

René D. schrieb:
> Ich will auch nur es für die Testbench nutzen und in ein File schreiben.
Jupp, da funktioniert 'val auch. Der Simulator kann mehr, als der 
Synthesizer. Vielleicht schaut mal jemand, ob Vivado schon zu den 
Actel-Tools aufgeschloassen hat?

Rick

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.