Код сумматора и вычитателя не работает VHDL - PullRequest
0 голосов
/ 31 января 2020

Этот код работает за исключением операций сложения и вычитания, обозначаемых кодами операций 010 и 110 соответственно. Когда я пытаюсь сложить числа, результат выглядит так, как будто a и b выполняются в виде XOR, а вычитание делает XNOR B. Я понятия не имею, почему это происходит, пожалуйста, помогите. Кроме того, мне не разрешено использовать арифметику c плюс или минус в моем коде, смысл в том, чтобы добавить логически.

USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
USE ieee.std_logic_unsigned.ALL;
USE ieee.numeric_std.ALL;

ENTITY Lab3ALU IS
PORT(
        opcode      :IN STD_LOGIC_VECTOR(2 DOWNTO 0);--INPUT
        a               :IN STD_LOGIC_VECTOR(31 DOWNTO 0);--INPUT
        b               :IN STD_LOGIC_VECTOR(31 DOWNTO 0);--INPUT
        Cout            :OUT STD_LOGIC;
        Zero            :OUT STD_LOGIC;
        q               :OUT STD_LOGIC_VECTOR(31 DOWNTO 0));--OUTPUT
END Lab3ALU;

ARCHITECTURE description of Lab3ALU IS
        SIGNAL Reg1, Reg2, Reg3, Result : STD_LOGIC_VECTOR(31 DOWNTO 0);
        SIGNAL Cin, Sum, Carry : STD_LOGIC;
BEGIN

-- Update the register output on the clock's rising edge
process (a,b, opcode)
begin
    Cin <= opcode(2);
    Reg1 <= a;--temporarirly store A in Reg1 local variable 
    Reg2 <= b;--temporarily store B in Reg2 local variable 
    Reg3 <= NOT b;
            case opcode is
                When "000" => Result <= Reg1 AND Reg2;--AND 
                When "001" => Result <= Reg1 OR Reg2;--OR

                When "010" => 
                                    addloop:    for i in 0 to 31 loop
                                                        Result(i) <= ((Reg1(i) XOR Reg2(i)) XOR Cin);
                                                        Cin <= (((Reg1(i) XOR Reg2(i))AND Cin)OR (Reg1(i) AND Reg2(i)));
                                                end loop    addloop;                                                
                When "110" => 
                                    subloop:    for i in 0 to 31 loop
                                                        Result(i) <= ((Reg1(i) XOR Reg3(i)) XOR Cin);
                                                        Cin <= (((Reg1(i) XOR Reg3(i))AND Cin)OR (Reg1(i) AND Reg3(i)));
                                                end loop subloop;
                When "100" => Result(31 downto 1) <= reg1(30 downto 0);
                                  Result(0) <= '0';
                                  Cin <= '0';
                When "101" => Result(30 downto 0) <= reg1(31 downto 1);
                                  Result(31) <= '0';
                                  Cin <= '0';
                When others => Result <= "00000000000000000000000000000000";
            end case;
            if Result =  "00000000000000000000000000000000" then 
                Zero <= '1';
            else 
                Zero <= '0';
            end if;
            q<= Result;
            Cout<= Cin; 

end process;


END description;```
...