Ваша проблема в том, что оператор ror
не определен для std_logic_vector
.
VHDL демонстрирует поведение компьютерных (и описания оборудования) языков, называемое перегрузкой .Перегрузка - это когда оператор, функция или процедура множественно определены для разных типов.Компилятор просматривает комбинацию типов, когда используется оператор (и т. Д.) (Называемый signature ), и пытается сопоставить его с различными версиями, которые были объявлены.Это работает, только если есть только одно совпадение.Больше и код неоднозначен, потому что компилятор не знает, какую версию использовать.Меньше, и нет версии для компилятора.Это ваша проблема - не существует версии оператора ror
, которая использует std_logic_vector
.
У вас есть два решения:
(i) РЕКОМЕНДУЕТСЯ: реализовать вращение вправоПоведение вручную с использованием оператора сцепления и нарезки :
if up_down="1" then
reg <= reg(0) & reg(7 downto 1);
end if;
(ii) НЕ РЕКОМЕНДУЕТСЯ: преобразовать std_logic_vector
в другой тип, который выполняетиметь определенную версию оператора ror
, например, unsigned
.Почему "не рекомендуется"?Потому что я бы не советовал использовать какие-либо из перечисленных ниже операторов, потому что они могут вести себя странно (и их поведение не выглядит одинаковым для разных инструментов EDA);
ror rol sla sra sll srl
Кстатиэта строка была бы неправильной, даже если ror
было определено для std_logic_vector
:
reg ror 1;
Вы не можете просто сказать это больше, чем просто сказать
reg + 1;
Вам нужно присвоить результат операции в обоих случаях чему-либо.У меня предполагается, , что вы хотите присвоить reg
в обоих случаях.