2016-05-03 5 views
-4

Мне нужно показать некоторые целочисленные значения на дисплее 2x16, но на дисплее распознаются только символы ASCII. Поэтому, прежде чем я отправлю какое-то значение на дисплей, мне нужно преобразовать его в строку ... Любые иды?преобразовать целое число в строку - VHDL

Большое спасибо!

+2

Здесь полезны атрибуты '' pos' и ''val' символов: resth ответа -« одна цифра за раз ». Это просто программирование. –

+1

И целочисленное преобразование BCD с использованием [double dabble] (https://en.wikipedia.org/wiki/Double_dabble) также может быть полезно. –

ответ

0

Существует способ сделать это. Поэтому в начале вам нужно преобразовать целое число в std_logic_vector, а затем преобразовать это значение в BCD-систему, поэтому у вас есть двоичные значения каждой цифры целочисленного значения. Тогда просто сохранить значения ASCII каждой цифры в массив STD_LOGIC_VECTOR-х годов, так что вы можете отобразить их ...

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; 

Значения сохраняются в x_digits являются значения ASCII, которые могут быть отображены ...

0

Возможно, стол будет выглядеть полезным. Храните символы ASCII где-нибудь и у вас есть метод, который отображает ASCII в «Integer». Я полагаю, вы используете стандартный тип INTEGER? В любом случае, формат, в котором он сейчас находится, должен каким-то образом отображать ASCII, если он еще не был.

+0

На самом деле мне нужно использовать реальное число, но поскольку это не synthase-able, я как-то конвертирую число в стандартный INTEGER, перемещая с плавающей точкой в ​​конец, а затем мне нужно преобразовать inter в строку, поэтому я могу показать его на дисплее ... Идея с таблицей поиска - отличный способ решить проблему, но я ищу какую-то функцию, которая делает это автоматически (например, как функция, которая преобразует INTEGER в STD_LOGIC_VECTOR). , – Limko

Смежные вопросы