-
Notifications
You must be signed in to change notification settings - Fork 0
/
alu.vhd
125 lines (101 loc) · 2.78 KB
/
alu.vhd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
LIBRARY ieee;
USE ieee.numeric_std.all;
USE ieee.std_logic_1164.all;
LIBRARY work;
ENTITY alu IS
PORT (
opcode : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
Ain : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
Bin : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
Zout : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
zeroOut : OUT STD_LOGIC);
END alu;
ARCHITECTURE bdf_type OF alu IS
BEGIN
PROCESS (opcode, Ain, Bin)
BEGIN
CASE opcode IS
WHEN "0000" =>
Zout <= STD_LOGIC_VECTOR(SIGNED(Ain) + SIGNED(Bin));
zeroOut <= '0';
WHEN "0001" =>
Zout <= STD_LOGIC_VECTOR(SIGNED(Ain) - SIGNED(Bin));
zeroOut <= '0';
WHEN "0010" =>
Zout <= Ain AND Bin;
zeroOut <= '0';
WHEN "0011" =>
Zout <= Ain OR Bin;
zeroOut <= '0';
WHEN "0100" =>
Zout <= Ain XOR Bin;
zeroOut <= '0';
WHEN "0101" =>
Zout <= STD_LOGIC_VECTOR(UNSIGNED(Ain) SLL TO_INTEGER(UNSIGNED(Bin)));
zeroOut <= '0';
WHEN "0110" =>
Zout <= STD_LOGIC_VECTOR(UNSIGNED(Ain) SRL TO_INTEGER(UNSIGNED(Bin)));
zeroOut <= '0';
WHEN "0111" =>
Zout <= STD_LOGIC_VECTOR(SHIFT_RIGHT(SIGNED(Ain), TO_INTEGER(UNSIGNED(Bin))));
zeroOut <= '0';
WHEN "1000" =>
IF SIGNED(Ain) < SIGNED(Bin) THEN
Zout <= x"00000001";
zeroOut <= '1';
ELSE
Zout <= x"00000000";
zeroOut <= '0';
END IF;
WHEN "1001" =>
IF UNSIGNED(Ain) < UNSIGNED(Bin) THEN
Zout <= x"00000001";
zeroOut <= '1';
ELSE
Zout <= x"00000000";
zeroOut <= '0';
END IF;
WHEN "1010" =>
IF SIGNED(Ain) < SIGNED(Bin) THEN
Zout <= x"00000000";
zeroOut <= '0';
ELSE
Zout <= x"00000001";
zeroOut <= '1';
END IF;
WHEN "1011" =>
IF UNSIGNED(Ain) < UNSIGNED(Bin) THEN
Zout <= x"00000000";
zeroOut <= '0';
ELSE
Zout <= x"00000001";
zeroOut <= '1';
END IF;
WHEN "1100" =>
IF UNSIGNED(Ain) = UNSIGNED(Bin) THEN
Zout <= x"00000001";
zeroOut <= '1';
ELSE
Zout <= x"00000000";
zeroOut <= '0';
END IF;
WHEN "1101" =>
IF UNSIGNED(Ain) = UNSIGNED(Bin) THEN
Zout <= x"00000000";
zeroOut <= '0';
ELSE
Zout <= x"00000001";
zeroOut <= '1';
END IF;
WHEN "1110" =>
Zout <= STD_LOGIC_VECTOR(UNSIGNED(Bin));
zeroOut <= '0';
WHEN "1111" =>
Zout <= STD_LOGIC_VECTOR(SIGNED(Ain) + SIGNED(Bin));
zeroOut <= '0';
WHEN OTHERS =>
Zout <= "00000000000000000000000000000000";
zeroOut <= '0';
END CASE;
END PROCESS;
END bdf_type;