VHDL - рор и рол операции - PullRequest
       16

VHDL - рор и рол операции

0 голосов
/ 20 ноября 2018

Как я могу решить эту проблему?Переменная reg определяется как:

 signal reg:STD_LOGIC_VECTOR(7 downto 0):="00000001";

В коде ниже есть проблема с операцией ror.Сообщение об ошибке:

Line 109: Syntax error near "ror".

Line 108: found '0' definitions of operator "=", cannot determine exact overloaded matching definition for "="

-

  process(clk1,up_down,enable,reset)
        begin
        if up_down="1" then
            reg ror 1;
        end if;
        end process;

1 Ответ

0 голосов
/ 20 ноября 2018

Ваша проблема в том, что оператор 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 в обоих случаях.

...