OpenCores
URL https://opencores.org/ocsvn/tinycpu/tinycpu/trunk

Subversion Repositories tinycpu

[/] [tinycpu/] [trunk/] [src/] [alu.vhd] - Diff between revs 30 and 31

Show entire file | Details | Blame | View Log

Rev 30 Rev 31
Line 21... Line 21...
    TR: out std_logic
    TR: out std_logic
   );
   );
end alu;
end alu;
 
 
architecture Behavioral of alu is
architecture Behavioral of alu is
  signal TRData: std_logic;
 
begin
begin
  TR <= TRData;
 
  process(DataIn1, DataIn2, Op)
  process(DataIn1, DataIn2, Op)
  begin
  begin
    --TRData <='0'; --default
    TR <= '0';
    case Op is
    case Op is
--bitwise operations
--bitwise operations
      when "00000" => --and
      when "00000" => --and
        DataOut <= DataIn1 and DataIn2;
        DataOut <= DataIn1 and DataIn2;
      when "00001" => --or
      when "00001" => --or
Line 49... Line 47...
        DataOut <= std_logic_vector(rotate_right(unsigned(DataIn1),to_integer(unsigned(DataIn2(2 downto 0)))));
        DataOut <= std_logic_vector(rotate_right(unsigned(DataIn1),to_integer(unsigned(DataIn2(2 downto 0)))));
--comparisons
--comparisons
      when "01000" => --greater than
      when "01000" => --greater than
        DataOut <= "00000000";
        DataOut <= "00000000";
        if(to_integer(unsigned(DataIn1)) > to_integer(unsigned(DataIn2))) then
        if(to_integer(unsigned(DataIn1)) > to_integer(unsigned(DataIn2))) then
          TRData <= '1';
          TR <= '1';
        else
        else
          TRData <= '0';
          TR <= '0';
        end if;
        end if;
      when "01001" => --greater than or equal
      when "01001" => --greater than or equal
        DataOut <= "00000000";
        DataOut <= "00000000";
        if(to_integer(unsigned(DataIn1)) >= to_integer(unsigned(DataIn2))) then
        if(to_integer(unsigned(DataIn1)) >= to_integer(unsigned(DataIn2))) then
          TRData <= '1';
          TR <= '1';
        else
        else
          TRData <= '0';
          TR <= '0';
        end if;
        end if;
      when "01010" => --less than
      when "01010" => --less than
        DataOut <= "00000000";
        DataOut <= "00000000";
        if(to_integer(unsigned(DataIn1)) < to_integer(unsigned(DataIn2))) then
        if(to_integer(unsigned(DataIn1)) < to_integer(unsigned(DataIn2))) then
          TRData <= '1';
          TR <= '1';
        else
        else
          TRData <= '0';
          TR <= '0';
        end if;
        end if;
      when "01011" => --less than or equal
      when "01011" => --less than or equal
        DataOut <= "00000000";
        DataOut <= "00000000";
        if(to_integer(unsigned(DataIn1)) <= to_integer(unsigned(DataIn2))) then
        if(to_integer(unsigned(DataIn1)) <= to_integer(unsigned(DataIn2))) then
          TRData <= '1';
          TR <= '1';
        else
        else
          TRData <= '0';
          TR <= '0';
        end if;
        end if;
      when "01100" => --equals to
      when "01100" => --equals to
        DataOut <= "00000000";
        DataOut <= "00000000";
        if(to_integer(unsigned(DataIn1)) = to_integer(unsigned(DataIn2))) then
        if(to_integer(unsigned(DataIn1)) = to_integer(unsigned(DataIn2))) then
          TRData <= '1';
          TR <= '1';
        else
        else
          TRData <= '0';
          TR <= '0';
        end if;
        end if;
      when "01101" => --not equal
      when "01101" => --not equal
        DataOut <= "00000000";
        DataOut <= "00000000";
        if(to_integer(unsigned(DataIn1)) /= to_integer(unsigned(DataIn2))) then
        if(to_integer(unsigned(DataIn1)) /= to_integer(unsigned(DataIn2))) then
          TRData <= '1';
          TR <= '1';
        else
        else
          TRData <= '0';
          TR <= '0';
        end if;
        end if;
      when "01110" => --equal to 0
      when "01110" => --equal to 0
        DataOut <= "00000000";
        DataOut <= "00000000";
        if(to_integer(unsigned(DataIn1)) = 0) then
        if(to_integer(unsigned(DataIn1)) = 0) then
          TRData <= '1';
          TR <= '1';
        else
        else
          TRData <= '0';
          TR <= '0';
        end if;
        end if;
      when "01111" => --not equal to 0
      when "01111" => --not equal to 0
        DataOut <= "00000000";
        DataOut <= "00000000";
        if(to_integer(unsigned(DataIn1)) /= 0) then
        if(to_integer(unsigned(DataIn1)) /= 0) then
          TRData <= '1';
          TR <= '1';
        else
        else
          TRData <= '0';
          TR <= '0';
        end if;
        end if;
--other operations
--other operations
      when "10000" => --set TR
      when "10000" => --set TR
        DataOut <= "00000000";
        DataOut <= "00000000";
        TRData <= '1';
        TR <= '1';
      when "10001" => --reset TR
      when "10001" => --reset TR
        DataOut <= "00000000";
        DataOut <= "00000000";
        TRData <= '0';
        TR <= '0';
      when "10010" => --increment
      when "10010" => --increment
        DataOut <= std_logic_vector(unsigned(DataIn1) + 1);
        DataOut <= std_logic_vector(unsigned(DataIn1) + 1);
      when "10011" => --decrement
      when "10011" => --decrement
        DataOut <= std_logic_vector(unsigned(DataIn1) - 1);
        DataOut <= std_logic_vector(unsigned(DataIn1) - 1);
      when "10100" => --add
      when "10100" => --add
Line 120... Line 118...
      when "10101" => --subtract
      when "10101" => --subtract
        DataOut <= std_logic_vector(unsigned(DataIn1) - unsigned(DataIn2));
        DataOut <= std_logic_vector(unsigned(DataIn1) - unsigned(DataIn2));
 
 
      when others =>
      when others =>
        DataOut <= "00000000";
        DataOut <= "00000000";
        TRData <= '1';
        TR <= '1';
    end case;
    end case;
  end process;
  end process;
end Behavioral;
end Behavioral;
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.