Почему я получаю "Найдено" 0 определений оператора "+" "при добавлении битовых векторов?Являются ли задержки Delta фактором? - PullRequest
0 голосов
/ 01 декабря 2018

Я нахожусь в процессе кодирования 3-битного ALU.Проблема, с которой я сталкиваюсь, заключается в множителе, когда Opcode = "001".Я пытаюсь добавить 3 bit_vectors (от 5 до 0), и он выдает ошибку "Найдено '0' определений оператора" + "".Я осмотрелся и нашел несколько ссылок нашел '0' определения оператора "+" в VHDL , но добавление каких-либо пакетов, похоже, не исправляет ошибку для меня.

Кроме того, я где-то читал, что, поскольку вы кодируете оборудование на VHDL, разумно учитывать дельта-задержки.Поскольку я назначаю значения сигналу в процессе, будет ли он работать для вывода конечного продукта?Или из-за задержек дельта сигналы не будут обновляться до тех пор, пока процесс не будет приостановлен.

Ошибка возникает в строке 67, "Z <= t4 + t5 + t6", в блоке, где Opcode = "001».Спасибо всем, кто может дать небольшой совет. </p>

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity ALU is
    PORT(
        X,Y   : IN BIT_VECTOR(2 downto 0);
        Opcode : IN BIT_VECTOR(2 downto 0);
        Z      : OUT BIT_VECTOR(5 downto 0);
        CLK   : IN BIT
        );
end ALU;

architecture Behavioral of ALU is
   COMPONENT adder3 is
     PORT (
       A1 ,A2, A3, B1, B2, B3, Cin : IN BIT ;
       Sum1 ,Sum2,  Sum3, Cout : OUT BIT );
    END COMPONENT;

        SIGNAL adder_output: BIT_VECTOR(3 downto 0);
        SIGNAL temp: BIT_VECTOR(2 downto 0);
        SIGNAL t1,t2,t3: BIT_VECTOR(2 downto 0);
        SIGNAL t4,t5,t6: BIT_VECTOR(5 downto 0);
begin

    ADD3: adder3 PORT MAP(
        A1 => X(0),
        B1 => Y(0),
        A2 => X(1),
        B2 => Y(1),
        A3 => X(2),
        B3 => Y(2),
        Cin => '0',
        Sum1 => adder_output(0),
        Sum2 => adder_output(1),
        Sum3 => adder_output(2),
        Cout => adder_output(3)
        );

    PROCESS(X, Y, CLK, Opcode)
        BEGIN
            IF(CLK'EVENT AND CLK='1')THEN
                IF Opcode = "000" THEN
                    Z <= adder_output;
                ELSIF Opcode = "001" THEN
                    IF Y(0) = '1' THEN
                        t1 <= X;
                    ELSE
                        t1 <= "000";
                    END IF;
                    IF Y(1) = '1' THEN
                        t2 <= X;
                    ELSE
                        t2 <= "000";
                    END IF;
                    IF Y(2) = '1' THEN
                        t3 <= X;
                    ELSE
                        t3 <= "000";
                    END IF;
                     t4 <= "000"&t1;
                     t5 <= "00"&t2&"0";
                     t6 <= "0"&t3&"00";
                     Z <= t4+t5+t6;
                ELSIF Opcode = "010" THEN
                    Z <= X AND Y;
                ELSIF Opcode = "011" THEN
                    Z <= X OR Y;
                ELSIF Opcode = "100" THEN
                    Z <= X XOR Y;
                ELSIF Opcode = "101" THEN
                    temp <= NOT X;
                    Z <= "000"&temp;
                ELSIF Opcode = "110" THEN
                    IF Y = "000" THEN
                        Z <= "000"&X(2 downto 0);
                    ELSIF Y = "001" THEN
                        Z <= "00"&X(2 downto 0)&"0";
                    ELSIF Y = "010" THEN
                        Z <= "0"&X(2 downto 0)&"00";
                    ELSIF Y = "011" THEN
                        Z <= X(2 downto 0)&"000";
                    ELSIF Y = "100" THEN
                         Z <= X(1 downto 0)&"0000";
                    ELSIF Y = "101" THEN
                         Z <= X(0)&"00000";
                    ELSE
                         Z <= "000000";
                    END IF;
                ELSE
                    IF Y = "000" THEN
                        Z <= "000"&X(2 downto 0);
                    ELSIF Y = "001" THEN
                        Z <= "0000"&X(2 downto 1);
                    ELSIF Y = "010" THEN
                        Z <= "00000"&X(2);
                    ELSE
                        Z <= "000000";
                    END IF;
                END IF;
           END IF;            
       END PROCESS;
end Behavioral;

1 Ответ

0 голосов
/ 01 декабря 2018

Если вы хотите выполнить арифметику без знака с помощью bit_vector, вам необходимо использовать библиотеку numeric_bit_unsigned, которая является частью спецификации VHDL 2008.Для арифметики со знаком вам нужно использовать типы без знака или со знаком из numeric_std или numeric_bit (единственное отличие - базовый тип).

...