2016-05-03 18 views
-4

Ich muss einige Integer-Werte auf einem 2x16-Display anzeigen, aber das Display erkennt nur ASCII-Zeichen. Bevor ich also einen Wert an die Anzeige sende, muss ich ihn in einen String umwandeln ... Irgendwelche Buchstaben?konvertieren Sie eine Ganzzahl in eine Zeichenfolge - VHDL

Vielen Dank!

+2

Die "pos" - und "val" -Attribute von Zeichen sind hier nützlich: der Rest der Antwort ist "eine Ziffer zu einer Zeit". Es ist nur eine einfache Programmierung. –

+1

Auch die Umwandlung von Ganzzahlen in BCD mit [double dabble] (https://en.wikipedia.org/wiki/Double_dabble) kann nützlich sein. –

Antwort

0

Es gibt eine Möglichkeit, das zu tun. Am Anfang müssen Sie die Ganzzahl in einen std_logic_vector umwandeln und diesen Wert dann in ein BCD-System umwandeln, so dass Sie Binärwerte jeder Ziffer eines Integer-Wertes haben. Dann speichern Sie die ASCII-Werte der einzelnen Ziffern zu einer Reihe von std_logic_vector-s, so dass Sie sie anzuzeigen ...

type  x_digits is array (3 downto 1) of natural; 
signal x_digit_tb : x_digits; 
constant d0 : std_logic_vector (7 downto 0) := "00110000"; -- \\ 
constant d1 : std_logic_vector (7 downto 0) := "00110001"; -- || 
constant d2 : std_logic_vector (7 downto 0) := "00110010"; -- || 
constant d3 : std_logic_vector (7 downto 0) := "00110011"; -- || 
constant d4 : std_logic_vector (7 downto 0) := "00110100"; -- \\ 
constant d5 : std_logic_vector (7 downto 0) := "00110101"; -- >> Constant ASCII-binary value of digits 0 to 9 
constant d6 : std_logic_vector (7 downto 0) := "00110110"; -- // 
constant d7 : std_logic_vector (7 downto 0) := "00110111"; -- || 
constant d8 : std_logic_vector (7 downto 0) := "00111000"; -- || 
constant d9 : std_logic_vector (7 downto 0) := "00111001"; -- // 
. 
. 
    process(CLK) 
      ----- Convert X to BCD ----- 
      if CLK'event and clk = '1' and dX0 = 1 then 
       x_shift(7 downto 0) := x_ein_local; 
       for l in 0 to 7 loop 
        x_shift := x_shift sll 1; 
        if l < 7 and x_shift(11 downto 8) > "0100" then 
         x_shift(11 downto 8) := x_shift(11 downto 8) + "0011"; 
        end if; 
        if l < 7 and x_shift(15 downto 12) > "0100" then 
         x_shift(15 downto 12) := x_shift(15 downto 12) + "0011"; 
        end if; 
        if l < 7 and x_shift(19 downto 16) > "0100" then 
         x_shift(19 downto 16) := x_shift(19 downto 16) + "0011"; 
        end if; 
       end loop; 
       x_BCD <= x_shift(19 downto 8); 
       x_shift := (others => '0'); 
       dX0 <= 2; 
      ---- Convert X to ASCII --------  
      if CLK'event and clk = '1' and dX0 = 2 then 
       for k in 1 to 3 loop 
        case k is 
         when 1 => WW := x_BCD(3 downto 0); 
         when 2 => WW := x_BCD(7 downto 4); 
         when 3 => WW := x_BCD(11 downto 8); 
        end case; 
        case WW is 
         when "0000" => x_digit(k) <= d0; 
         when "0001" => x_digit(k) <= d1; 
         when "0010" => x_digit(k) <= d2; 
         when "0011" => x_digit(k) <= d3; 
         when "0100" => x_digit(k) <= d4; 
         when "0101" => x_digit(k) <= d5; 
         when "0110" => x_digit(k) <= d6; 
         when "0111" => x_digit(k) <= d7; 
         when "1000" => x_digit(k) <= d8; 
         when "1001" => x_digit(k) <= d9; 
         when others => null; 
        end case; 
       end loop; 
       dX0 <= 3; 
      end if; 
     end if; 
end process; 

Die gespeicherten Werte in x_digits ASCII-Werte, die angezeigt werden könnten ...

0

Vielleicht ist es nützlich, eine Tabelle nachschlagen zu lassen. Speichern Sie die ASCII-Zeichen irgendwo und haben Sie eine Methode, die das ASCII auf Ihre "Ganzzahl" abbildet. Ich nehme an, dass Sie den Standard-INTEGER-Typ verwenden? In jedem Fall sollte das Format, in dem es sich gerade befindet, irgendwie auf ASCII abgebildet werden können, wenn es nicht bereits vorhanden ist.

+0

eigentlich muss ich eine reelle Zahl verwenden, aber weil es nicht synthase-fähig ist, wandle ich die Zahl irgendwie in einen Standard-INTEGER, verschiebe den Fließpunkt bis zum Ende, und dann muss ich das Inter in eine Zeichenkette umwandeln, damit ich es kann Zeigen Sie es auf dem Display ... die Idee mit der Nachschlagetabelle ist eine nette Möglichkeit, das Problem zu lösen, aber ich bin auf der Suche nach einer Funktion, die es automatisch tut (ex. wie die Funktion, die INTEGER in STD_LOGIC_VECTOR konvertiert). . – Limko

Verwandte Themen