• В Verilog я могу присвоить строку вектору, например:

    wire [39:0] hello;
    assign hello = "hello"; 
    
  • В VHDL мне сложно найти такой метод:

    SIGNAL hello : OUT std_logic_vector (39 DOWNTO 0);
    ...
    hello <= "hello";
    

Я использую:

hello <= X"65_68_6c_6c_6f";

Что непонятно и требует много времени для больших струн.

Я просмотрел пакет textio и пакет txt_util, но ни один из них не очень понятен как интерпретировать строку и преобразовать ее в std_logic.

Есть ли простой способ присвоения кодов ascii std_logic в VHDL?

Вот минимальный пример:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY test IS
PORT(
   ctrl : IN std_logic;
   stdout : OUT std_logic_vector (39 DOWNTO 0)
);
END ENTITY;

ARCHITECTURE rtl OF test IS
   SIGNAL temp : std_logic_vector (39 DOWNTO 0);
BEGIN
   stdout <= temp;
   PROCESS(ctrl)
   BEGIN
      IF (ctrl = '0') THEN
         temp <= "hello"; -- X"68_65_6C_6C_6F";
      ELSE
         temp <= "world";
      END IF;
   END PROCESS;

END rtl;
9
N8TRO 7 Апр 2014 в 02:43

4 ответа

Лучший ответ

Этот вариант мало отличается от ответа Мортена - он использует только одно умножение, он копирует строку вместо создания псевдонима, он использует дополнительную переменную и возвращает стандартный логический вектор с возрастающим диапазоном индекса.

Из пакета с именем string_utils:

library ieee; 
use ieee.numeric_std.all;
-- ...
    function to_slv(s: string) return std_logic_vector is 
        constant ss: string(1 to s'length) := s; 
        variable answer: std_logic_vector(1 to 8 * s'length); 
        variable p: integer; 
        variable c: integer; 
    begin 
        for i in ss'range loop
            p := 8 * i;
            c := character'pos(ss(i));
            answer(p - 7 to p) := std_logic_vector(to_unsigned(c,8)); 
        end loop; 
        return answer; 
    end function; 

Вы можете добавить аргумент со значением по умолчанию, определяющим диапазон индекса по возрастанию / убыванию для возвращаемого значения. Вам нужно будет только указать аргумент для нестандартного значения.

7
user1155120user1155120 7 Апр 2014 в 14:39
Где доступен пакет "string_utils"?
 – 
Morten Zilmer
7 Апр 2014 в 14:45
1
 – 
user1155120
7 Апр 2014 в 18:25

Небольшая общая функция - это один из способов сделать это, с предложением ниже:

library ieee;
use ieee.numeric_std.all;
...
-- String to std_logic_vector convert in 8-bit format using character'pos(c)
--
-- Argument(s):
-- - str: String to convert
--
-- Result: std_logic_vector(8 * str'length - 1 downto 0) with left-most
-- character at MSBs.
function to_slv(str : string) return std_logic_vector is
  alias str_norm : string(str'length downto 1) is str;
  variable res_v : std_logic_vector(8 * str'length - 1 downto 0);
begin
  for idx in str_norm'range loop
    res_v(8 * idx - 1 downto 8 * idx - 8) := 
      std_logic_vector(to_unsigned(character'pos(str_norm(idx)), 8));
  end loop;
  return res_v;
end function;
5
Morten Zilmer 7 Апр 2014 в 11:21

Чтобы вернуть значение ascii символа, используйте этот код:

some_variable <= character'pos('a'); --returns the 'a' ascii value
3
Mohammad 24 Июн 2021 в 00:02

В вашем примере вы пытаетесь назначить строковый тип типу std_logic_vector. Это просто недопустимо. VHDL строго типизирован.

СИГНАЛ привет: OUT std_logic_vector (39 DOWNTO 0); ... привет <= "привет";

Если ваша цель - преобразовать шестнадцатеричный формат в ascii для печати результата моделирования, вы можете просто сделать это:

character'val (to_integer (unsigned (my_std_logic_vector)))

1
Clement 20 Сен 2019 в 14:57