VHDL-квалифицированное выражение должно соответствовать типу, подразумеваемому для выражения по контексту

Этот вопрос является продолжением моего последнего вопроса .

Как я уже упоминал ранее, я пытаюсь взаимодействовать с классическим HD44780 LCD. Я реализовал локальную ОЗУ, в которую я записываю данные, которые я хочу показать на дисплее.

ОЗУ определяется таким образом (небольшое изменение от последнего вопроса):

type ram_type is array (integer range <>) of std_logic_vector(7 downto 0);
signal lcd_mem : ram_type(0 to 16*2-1);

Я хотел бы отобразить кучу постоянных символов и число в определенном месте на ЖК-дисплее, я пытался сделать это, написав непосредственно на lcd_mem таким образом:

lcd_mem <= (0 => x"45", 1 => x"72", 2 => x"72", 3 => x"6F", 4 => x"72", 5 => x"73", 6 => x"3A", 15 => x"30",    16 => x"54", 17 => x"58", 18 => x"3A", 30 => x"4D", 31 => x"3A", others => x"20");

Строка 79:

lcd_mem(22 to 28) <= get_ascii(1234567); --to_integer(unsigned(n_bits(39 downto 20)))

целое число 1234567 позже будет заменено комментарием to_integer.

Я написал функцию get_ascii, которая должна преобразовать целое число в представление bcd, а затем в ascii, добавив 0x30 к представлению bcd.
Вот часть функции:

variable num    : ram_type(0 to 16*2-1);
variable temp   : std_logic_vector(number'range);
variable bcd    : unsigned ((4*7-1) downto 0) := (others => '0');
.
.
.
num(0) := std_logic_vector(bcd(3 downto 0) + x"30");
num(1) := std_logic_vector(bcd(7 downto 4) + x"30");
num(2) := std_logic_vector(bcd(11 downto 8) + x"30");
num(3) := std_logic_vector(bcd(15 downto 12) + x"30");
num(4) := std_logic_vector(bcd(19 downto 16) + x"30");
num(5) := std_logic_vector(bcd(23 downto 20) + x"30");
num(6) := std_logic_vector(bcd(27 downto 24) + x"30");          
return num;

При компиляции я получаю следующую ошибку:

Ошибка (10511): VHDL квалифицированная ошибка выражения на display_ber.vhd( 79): тип get_ascii, указанный в квалифицированном выражении, должен соответствовать типу ram_type, подразумеваемому для выражения контекстом

Я не могу спокойно понять смысл сообщения.
Я попытался определить более короткую переменную ram_type (от 0 до 6), чтобы получить значение из функции get_ascii, но это не помогло.

1 ответ

  1. Хорошо, по-видимому, это происходит, потому что я определил тип «ram_type» как в пакете, так и в архитектуре.

    После удаления определения «ram_type» в архитектуре ошибка исчезла.