Es gibt keine Standard-Bibliothek Implementierung, aber zum Beispiel unsere PoC-Libary hat mehrere Formatierungsfunktion in der PoC.Strings Paket. Darüber hinaus gibt es eine to_string(...)
-Funktion, die ein Formatzeichen wie h
für hexadezimale Ausgaben akzeptiert.
Wie schreibe ich eine solche Integer-Hex-Konvertierung?
- umrechnen INTEGER in eine Binärdarstellung
- Gruppe der Binärwert in 4-Bit-Gruppen
- jede Gruppe in eine Ganzzahl/alpha im Bereich 0..F
- prepend
0x
wenn gewünscht übersetzen
Also hier ist ein Wrapper die ganze Zahl in eine binäre Darstellung zu konvertieren:
-- format a natural as HEX string
function raw_format_nat_hex(Value : NATURAL) return STRING is
begin
return raw_format_slv_hex(std_logic_vector(to_unsigned(Value, log2ceil(Value+1))));
end function;
Und nun die Gruppierung und Transformation
-- format a std_logic_vector as HEX string
function raw_format_slv_hex(slv : STD_LOGIC_VECTOR) return STRING is
variable Value : STD_LOGIC_VECTOR(4*div_ceil(slv'length, 4) - 1 downto 0);
variable Digit : STD_LOGIC_VECTOR(3 downto 0);
variable Result : STRING(1 to div_ceil(slv'length, 4));
variable j : NATURAL;
begin
Value := resize(slv, Value'length);
j := 0;
for i in Result'reverse_range loop
Digit := Value((j * 4) + 3 downto (j * 4));
Result(i) := to_HexChar(unsigned(Digit));
j := j + 1;
end loop;
return Result;
end function;
-- convert an unsigned value(4 bit) to a HEX digit (0-F)
function to_HexChar(Value : UNSIGNED) return CHARACTER is
constant HEX : STRING := "ABCDEF";
begin
if (Value < 16) then
return HEX(to_integer(Value)+1);
else
return 'X';
end if;
end function;
-- return TRUE, if input is a power of 2
function div_ceil(a : NATURAL; b : POSITIVE) return NATURAL is -- calculates: ceil(a/b)
begin
return (a + (b - 1))/b;
end function;
-- return log2; always rounded up
function log2ceil(arg : positive) return natural is
variable tmp : positive;
variable log : natural;
begin
if arg = 1 then return 0; end if;
tmp := 1;
log := 0;
while arg > tmp loop
tmp := tmp * 2;
log := log + 1;
end loop;
return log;
end function;
Hinweis: Diese Funktionen prepend 0x
nicht.
@downvoters: bitte erklären, so kann ich lernen und verbessern ;-) –
[Jede hexadezimale Ziffer vier Binärzahlen repräsentiert (Bits)] (https://en.wikipedia.org/wiki/Hexadecimal“ Ein Integer-Skalar ist ein diskreter Typ mit einer Position, die ein ganzzahliger Wert ist (IEEE Std 1076-2008, 5.2 Skalar-Typen) - und integr hat keine Bits Sie könnten eine Funktion schreiben, um einen Integer-Wert in base16 zu konvertieren zu einer Zeichenkettennotation mit einem literalen Äquivalent (15.5.3), oder wandeln einen ganzzahligen Wert in einen Typ um, der binäre Bits numerisch darstellt und dessen Zeichenkette eine Bit-Zeichenkette entspricht (15,8). – user1155120