В VHDL со строгой типизацией при выполнении умножения я ожидаю, что следующий оператор получит 14-битный вывод:
frame_addr : out STD_LOGIC_VECTOR(13 downto 0);
...
signal y_pos : unsigned(4 downto 0);
...
frame_addr <= std_logic_vector(y_pos * 320);
Но я получаю ошибку:
expression has 10 elements, but must have 14 elements
Что не имеет смысла для меня ... Поскольку 320 должно быть не менее 9 битов как без знака, 10 как целое число, а при умножении на 5-битный сигнал y_pos я бы ожидал увидеть AT-LEAST 14 бит ...
У меня есть еще одна секция кода, где это работает ОТЛИЧНО:
ram_addr <= std_logic_vector(h_pos + (v_pos * 80))(14 downto 0);
Умножение с 80 работает просто отлично, без ошибок.
Итак, я попробовал все, чтобы получить до 14 бит ... и, конечно, умножение просто не происходит, когда в моей логике ...
Итак, я наконец сказал, хорошо, что если я просто умножу с BINARY, скажи ему, что я хочу ...
frame_addr <= std_logic_vector(y_pos * "101000000");
Компилируется нормально без ошибок ...
И логика начинает работать так, как я ожидал.
Так почему же это несоответствие? Оба они находятся в пределах структуры архитектуры для релевантности, а не внутри процессов или чего-то подобного.
Я просто не могу обернуть голову, почему существуют эти несоответствия ...
Оба используют одни и те же библиотеки:
library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;
Так что же дает? Нужно ли использовать двоичный код в любом месте, где я хочу, чтобы число соответствовало коду?