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

Subversion Repositories tinycpu

[/] [tinycpu/] [trunk/] [src/] [alu.vhd] - Blame information for rev 14

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 14 earlz
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
use work.tinycpu.all;
5
 
6
entity alu is
7
 
8
  port(
9
    Op: in std_logic_vector(4 downto 0);
10
    DataIn1: in std_logic_vector(7 downto 0);
11
    DataIn2: in std_logic_vector(7 downto 0);
12
    DataOut: out std_logic_vector(7 downto 0);
13
    TR: out std_logic
14
   );
15
end alu;
16
 
17
architecture Behavioral of alu is
18
  signal TRData: std_logic;
19
begin
20
  TR <= TRData;
21
  process(DataIn1, DataIn2, Op)
22
  begin
23
    case Op is
24
--bitwise operations
25
      when "00000" => --and
26
        DataOut <= DataIn1 and DataIn2;
27
      when "00001" => --or
28
        DataOut <= DataIn1 or DataIn2;
29
      when "00010" => --xor
30
        DataOut <= DataIn1 xor DataIn2;
31
      when "00011" => --not
32
        DataOut <= not DataIn2; --ignore DataIn1 here so that mapping these operations is as simple as possible
33
      when "00100" => --left shift (logical)
34
        DataOut <= std_logic_vector(shift_left(unsigned(DataIn1),to_integer(unsigned(DataIn2(2 downto 0)))));
35
      when "00101" => --right shift(logical)
36
        DataOut <= std_logic_vector(shift_right(unsigned(DataIn1),to_integer(unsigned(DataIn2(2 downto 0)))));
37
      when "00110" => --left rotate
38
        DataOut <= std_logic_vector(rotate_left(unsigned(DataIn1),to_integer(unsigned(DataIn2(2 downto 0)))));
39
      when "00111" => --right rotate
40
        DataOut <= std_logic_vector(rotate_right(unsigned(DataIn1),to_integer(unsigned(DataIn2(2 downto 0)))));
41
--comparisons
42
      when "01000" => --greater than
43
        DataOut <= "00000000";
44
        if(to_integer(unsigned(DataIn1)) > to_integer(unsigned(DataIn2))) then
45
          TRData <= '1';
46
        else
47
          TRData <= '0';
48
        end if;
49
      when "01001" => --greater than or equal
50
        DataOut <= "00000000";
51
        if(to_integer(unsigned(DataIn1)) >= to_integer(unsigned(DataIn2))) then
52
          TRData <= '1';
53
        else
54
          TRData <= '0';
55
        end if;
56
      when "01010" => --less than
57
        DataOut <= "00000000";
58
        if(to_integer(unsigned(DataIn1)) < to_integer(unsigned(DataIn2))) then
59
          TRData <= '1';
60
        else
61
          TRData <= '0';
62
        end if;
63
      when "01011" => --less than or equal
64
        DataOut <= "00000000";
65
        if(to_integer(unsigned(DataIn1)) <= to_integer(unsigned(DataIn2))) then
66
          TRData <= '1';
67
        else
68
          TRData <= '0';
69
        end if;
70
      when "01100" => --equals to
71
        DataOut <= "00000000";
72
        if(to_integer(unsigned(DataIn1)) = to_integer(unsigned(DataIn2))) then
73
          TRData <= '1';
74
        else
75
          TRData <= '0';
76
        end if;
77
      when "01101" => --not equal
78
        DataOut <= "00000000";
79
        if(to_integer(unsigned(DataIn1)) /= to_integer(unsigned(DataIn2))) then
80
          TRData <= '1';
81
        else
82
          TRData <= '0';
83
        end if;
84
      when "01110" => --equal to 0
85
        DataOut <= "00000000";
86
        if(to_integer(unsigned(DataIn1)) = 0) then
87
          TRData <= '1';
88
        else
89
          TRData <= '0';
90
        end if;
91
      when "01111" => --not equal to 0
92
        DataOut <= "00000000";
93
        if(to_integer(unsigned(DataIn1)) /= 0) then
94
          TRData <= '1';
95
        else
96
          TRData <= '0';
97
        end if;
98
--other operations
99
      when "10000" => --set TR
100
        DataOut <= "00000000";
101
        TRData <= '1';
102
      when "10001" => --reset TR
103
        DataOut <= "00000000";
104
        TRData <= '0';
105
      when "10010" => --increment
106
        DataOut <= std_logic_vector(unsigned(DataIn1) + 1);
107
      when "10011" => --decrement
108
        DataOut <= std_logic_vector(unsigned(DataIn1) - 1);
109
      when "10100" => --add
110
        DataOut <= std_logic_vector(unsigned(DataIn1) + unsigned(DataIn2));
111
      when "10101" => --subtract
112
        DataOut <= std_logic_vector(unsigned(DataIn1) - unsigned(DataIn2));
113
 
114
      when others =>
115
        DataOut <= "00000000";
116
        TRData <= '1';
117
    end case;
118
  end process;
119
end Behavioral;

powered by: WebSVN 2.1.0

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