Получение ошибки для операции shift_left VHDL

Я искал это некоторое время и не смог воспроизвести какие-либо опубликованные решения онлайн, поэтому я надеялся, что некоторые из вас, замечательные люди, могут мне помочь. Я создаю АЛУ. у меня есть два 32-битных входа и один 32-битный выход вместе с 5-битным шамтом и 4-битным управляющим сигналом. Мой код выглядит следующим образом с указанием места ошибки.

library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.numeric_std.all;

Entity mips_alu IS
    PORT(ALUControl : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    inputA, inputB      : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
    shamt                   : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
    Zero                    : OUT STD_LOGIC;
    ALU_Result          : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
    );
END mips_alu;

ARCHITECTURE behavior of mips_alu IS
BEGIN
    PROCESS(ALUControl)
    BEGIN
        CASE ALUControl is
        WHEN "0000" =>
            ALU_Result <= inputA AND inputB;
        WHEN "0001" =>
            ALU_Result <= inputA OR inputB;
        WHEN "0010" =>
            ALU_Result <= inputA + inputB;
        WHEN "0110" =>
            ALU_Result <= inputA - inputB;
        WHEN "0111" =>
            IF (inputA < inputB) THEN
                ALU_Result <= inputA;
            END IF;
        WHEN "1000" =>
            ALU_Result <= shift_left(inputB, to_integer(unsigned(shamt)));
            -- The line above is where i get my first error, The following lines will have the same issue
        WHEN "1001" =>
            ALU_Result <= shift_right(inputB, shamt);
        WHEN "1010" =>
            ALU_Result <= shift_left(inputB, inputA);
        WHEN "1011" =>
            ALU_Result <= shift_right(inputB, inputA);
        WHEN "1100" =>
            ALU_Result <= inputA NOR inputB;
        WHEN "1101" =>
            ALU_Result <= inputB(31 DOWNTO 16);
        WHEN OTHERS =>
            ALU_Result <= inputA;
        END CASE;
    END PROCESS;
END behavior;

Ошибка, которую я получаю, говорит:

10511 Ошибка квалифицированного выражения VHDL в mips_alu.vhd(33): тип shift_left, указанный в квалифицированном выражении, должен соответствовать типу std_logic_vector, который подразумевается для выражения в контексте

Я пробовал несколько вариантов этого, поэтому, если я что-то упустил, пожалуйста, дайте мне знать, вся помощь приветствуется, так как я немного новичок в VHDL

2 ответа

Решение

В документе numeric_std вы можете найти функцию shift_left или же shift_right, В обоих описаниях вы можете видеть, что function SHIFT_LEFT (ARG: UNSIGNED; COUNT: NATURAL) return UNSIGNED;, Так что вам нужно использовать кастинг вашего std_logic_vector в unsigned,
В вашем случае это будет выглядеть так:

ALU_Result <= std_logic_vector(shift_left(unsigned(inputB), to_integer(unsigned(shamt))));

конец и т. д. для других строк, где вы используете shift_left или же shift_right функция.

Что я обычно делаю, так это:

ALU_Result <= inputB(30 downto 0) & '0';

Это сохраняет ALU_Result вектор, равный InputB, сдвинутому один раз. Если вы хотите сдвинуть его больше, вы можете использовать цикл.

while (i<to_integer(unsigned(shamt))) loop
ALU_Result <= inputB(30 downto 0) & '0';
i:=i+1;
end loop;

Это не элегантное решение, но оно, вероятно, будет работать.

Для смещения вправо сделайте:

ALU_Result <= '0' & inputB(31 downto 1);
Другие вопросы по тегам