2016-06-17 10 views
4

kann ich eine integer als Dezimalzahl drucken mit stdout:Wie schreibe ich eine ganze Zahl in hdhDecimal in VHDL als stdout?

library std; 
use std.textio.all; 

entity min is 
end min; 

architecture behav of min is 
begin 
    process is 
     variable my_line : line; 
    begin 
     write(my_line, 16); 
     writeline(output, my_line); 
     wait; 
    end process; 
end behav; 

die Ausgänge:

16 

Aber wie stattdessen die Ausgabe entweder:

10 
0x10 
+1

@downvoters: bitte erklären, so kann ich lernen und verbessern ;-) –

+0

[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

Antwort

2

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?

  1. umrechnen INTEGER in eine Binärdarstellung
  2. Gruppe der Binärwert in 4-Bit-Gruppen
  3. jede Gruppe in eine Ganzzahl/alpha im Bereich 0..F
  4. 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.

+0

Was, keine Funktion div_ceil? – user1155120

8

eine ganze Zahl i und VHDL-2008 Unter der Annahme, könnten Sie verwenden:

write(output, integer'image(i) & LF); -- Plain integer value 
write(output, "0x" & to_hstring(to_signed(i, 32)) & LF); -- Hexadecimal representation 

Sie müssen use std.textio.all; für diese Arbeit haben. Ändern Sie die 32, um die Länge des Hexadezimalwerts zu reduzieren. Ich habe 32 gewählt, damit es in den meisten Simulatoren einen ganzzahligen Wert darstellen kann.

Diese funktionieren auch für report Anweisungen, z.B.

report "i = 0x" & to_hstring(to_signed(i, 32)); 
+0

Können wir diese '32' rechnerisch ausrechnen? die Eingabe? Ich kenne das Attribut 'integer'high', aber gibt es etwas direkteres? –

+0

Ja, Sie könnten eine Antwort wie diese verwenden, um die erforderliche Breite zu berechnen: http://stackoverflow.com/questions/12750007/vhdl-use-the-length-of-an-integer-generic-to-determinine-number -von-Auswahl-Linien/12751341 # 12757674 –

3

Sie konnten die hwrite Prozedur im IEEE.std_logic_textio Paket verwenden:

library IEEE;             -- ADDED 
use IEEE.std_logic_1164.all;         -- ADDED 
use IEEE.numeric_std.all;          -- ADDED 
use IEEE.std_logic_textio.all;         -- ADDED 

library std; 
use std.textio.all; 

entity min is 
end min; 

architecture behav of min is 
begin 
    process is 
     variable my_line : line; 
    begin 
     hwrite(my_line, std_logic_vector(to_unsigned(16,8))); -- CHANGED 
     writeline(output, my_line); 
     wait; 
    end process; 
end behav; 

Das hwrite Verfahren eine std_logic_vector in eine Datei schreibt. Sie müssen also Ihre integer in eine std_logic_vector konvertieren (die Sie auch benötigen, um eine Anzahl von Bits in der to_unsigned-Funktion anzugeben).

http://www.edaplayground.com/x/exs