Добро пожаловать в Stackoverflow. Вы, очевидно, не очень знакомы с типизированными языками. VHDL - это типизированный язык, в котором переменные, сигналы, константы имеют тип, например bit
, integer
, std_logic_vector(3 downto 0)
или unsigned(3 downto 0)
. И эти типы определяют, что можно сделать, а что нет.
- По умолчанию вы не можете добавить два
std_logic_vector(3 downto 0)
и получить результат, который также равен std_logic_vector(3 downto 0)
. Это то, что вы пытаетесь сделать с rslt<= a + b;
. Компилятор просто говорит вам, что такого оператора "+"
не видно.
- То же самое для
rslt<= a - b;
с оператором "-"
.
x<= (unsigned(a)) * (unsigned(b));
немного лучше, потому что вы не пытались умножить два std_logic_vector(3 downto 0)
. Вы конвертировали их в unsigned(3 downto 0)
. Хороший выбор, потому что пакет ieee.numeric_std
перегружает оператор "*"
для типов unsigned(...)
. К сожалению, вы пытаетесь присвоить результат std_logic_vector(7 downto 0)
, в то время как оператор ieee.numeric_std."*"
возвращает unsigned(7 downto 0)
. Итак, и здесь компилятор снова жалуется, что не находит подходящего оператора "*"
. Примечание: скобки не нужны. Вы могли бы просто написать unsigned(a) * unsigned(b)
.
- Остальные ошибки оставлены необъясненными в качестве упражнения.
Я предлагаю вам еще раз прочитать книгу VHDL и понять, какие это типы, какие операции определены по умолчанию для типов std_logic_vector(...)
и unsigned(...)
и какие дополнительные операции определены для тех же типов двумя пакетами, которые вы объявить (ieee.std_logic_1164
и ieee.numeric_std
).