Недопустимый вход в подпрограмму shift_left, ошибка типа рядом

Я пытаюсь использовать функцию shift_left() в своем проекте, но получаю 2 ошибки, которые не могу объяснить:

  1. Ошибка: введите ошибку возле «сдвиг влево»; ожидаемый тип 'std_logic_vector'

но temp ЯВЛЯЕТСЯ std_logic_vector!

  1. Ошибка: не найдено подходящей записи для подпрограммы 'shift_left'

сигналы, используемые в коде, определяются как:

signal shifted_pixel, temp : std_logic_vector(15 downto 0);
signal i_data : std_logic_vector(7 downto 0);

приведенный ниже фрагмент написан внутри процесса

temp <= "00000000" & i_data;
shifted_pixel <= shift_left(temp, 5);

полный код ниже:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;


entity project is
    port (
        i_clk     : in std_logic;
        i_rst     : in std_logic;
        i_start   : in std_logic;
        i_data    : in std_logic_vector(7 downto 0);
    );
end project;

architecture rtl of project is
    signal shifted_pixel, temp : std_logic_vector(15 downto 0);
    begin
        process(i_data)
        begin
            temp <= "00000000" & i_data;
            shifted_pixel <= shift_left(temp, 5);
        end process;
end rtl;

person Jack    schedule 27.03.2021    source источник
comment
Предоставьте минимально воспроизводимый пример. Где объявлена ​​функция SHIFT_LEFT, а ее параметры и типы возвращаемых значений зависят от версии стандарта. Вы можете найти его для типа unsigned, например, в пакете numeric_std, использование которого повлечет за собой преобразование типов.   -  person    schedule 27.03.2021
comment
@user1155120 user1155120 Я попытался преобразовать его в неподписанный, и это ничего не изменило. Я не уверен, как проверить, какую версию стандарта я использую, но она должна быть самой последней. Я использую библиотеки ieee.std_logic_1164.all и ieee.numeric_std.all;   -  person Jack    schedule 27.03.2021
comment
Вы не демонстрируете неудачные преобразования типов в своем коде. Ваша сущность не анализирует (компилирует), точка с запятой является разделителем в списке объявлений портов, а не терминатором - последний следует удалить. shifted_pixel <= std_logic_vector(shift_left(unsigned(temp), 5)); temp должен быть без знака, чтобы можно было использовать соответствующий SHIFT_LEFT в пакете numeric_std. Полученное значение должно быть совместимо со std_logic_vector, чтобы его можно было присвоить shifted_pixel.   -  person    schedule 27.03.2021
comment
Функция характеризуется типом (типами) параметров и типом возвращаемого значения, которые определяются контекстом. Здесь тип возвращаемого значения должен быть std_logic_vector для назначения смещенному пикселю. Типы параметра и возвращаемого значения для доступной функции SHIFT_LEFT имеют беззнаковый тип, и вам нужно ввести преобразование как параметра, так и результата, или найти SHIFT_LEFT, который работает для std_logic_vector (в -2008).   -  person    schedule 27.03.2021
comment
Хорошо, теперь я вижу, большое спасибо!   -  person Jack    schedule 28.03.2021


Ответы (1)


Функция shift_left в пакете numeric_std принимает беззнаковое значение в качестве первого аргумента и возвращает беззнаковое значение.

Итак, вы должны указать свои значения:

shifted_pixel <= std_logic_vector(shift_left(unsigned(temp), 5));

ХТН

person lukipedio    schedule 27.03.2021