-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDecode_Stage.vhd
More file actions
119 lines (109 loc) · 3.91 KB
/
Decode_Stage.vhd
File metadata and controls
119 lines (109 loc) · 3.91 KB
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
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY Decode_Stage IS
PORT (
Clk : IN STD_LOGIC;
Instruction : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
WB1_Address : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
WB2_Address : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
WB1_data : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
WB2_data : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
WB1_Signal : IN STD_LOGIC;
WB2_Signal : IN STD_LOGIC;
Data_R1 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) := (OTHERS => '0');
Data_R2 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) := (OTHERS => '0');
jmp_Flag : OUT STD_LOGIC := '0';
Zero_Flag : OUT STD_LOGIC := '0';
Neg_Flag : OUT STD_LOGIC := '0';
Carry_Flag : OUT STD_LOGIC := '0';
SPout : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) := (OTHERS => '0');
CCRin : IN STD_LOGIC_VECTOR(2 DOWNTO 0)
);
END ENTITY Decode_Stage;
ARCHITECTURE Decode_Stage_Arch OF Decode_Stage IS
-- COMPONENT RegisterFile
-- PORT (
-- Clk : IN STD_LOGIC;
-- Rsrc1 : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
-- Rsrc2 : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
-- Rout1 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
-- Rout2 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
-- Rin1 : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
-- Rin2 : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
-- CCRin : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
-- CCRout : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
-- WB1_Address : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
-- WB2_Address : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
-- WB1_Signal : IN STD_LOGIC;
-- WB2_Signal : IN STD_LOGIC
-- );
-- END COMPONENT;
-- COMPONENT mux_2_1
-- GENERIC (
-- N : INTEGER := 8
-- );
-- PORT (
-- a, b : IN STD_LOGIC_VECTOR(N - 1 DOWNTO 0);
-- sel : IN STD_LOGIC;
-- y : OUT STD_LOGIC_VECTOR(N - 1 DOWNTO 0)
-- );
-- END COMPONENT;
SIGNAL opCode : STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL Rdst : STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL Rsrc1 : STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL Rsrc2 : STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL CCR_Temp : STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL Mux1_in : STD_LOGIC;
SIGNAL Mux2_in : STD_LOGIC;
SIGNAL Mux1_Out : STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL Mux2_Out : STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL temp1 : STD_LOGIC;
SIGNAL temp2 : STD_LOGIC;
SIGNAL ORING : STD_LOGIC;
BEGIN
opCode <= Instruction(15 DOWNTO 11);
Rdst <= Instruction(10 DOWNTO 8);
Rsrc1 <= Instruction(7 DOWNTO 5);
Rsrc2 <= Instruction(4 DOWNTO 2);
ORING <= '1' WHEN ((opCode(4 DOWNTO 3) = "11") OR (opCode(4) = '0')) ELSE
'0';
Mux2_in <= '1' WHEN ((opCode = "10101") OR (opCode = "10110")) ELSE
'0';
Mux1_in <= Mux2_in or ORING;
Mux1 : ENTITY work.Mux_2_1 GENERIC MAP(3) PORT MAP(
a => Rsrc1,
b => Rdst,
sel => Mux1_in,
y => Mux1_Out
);
Mux2 : ENTITY work.Mux_2_1 GENERIC MAP(3) PORT MAP(
a => Rsrc2,
b => Rsrc1,
sel => Mux2_in,
y => Mux2_Out
);
RF : ENTITY work.RegisterFile PORT MAP(
Clk => CLk,
Rsrc1 => Mux1_Out,
Rsrc2 => Mux2_Out,
Rout1 => Data_R1,
Rout2 => Data_R2,
Rin1 => WB1_data,
Rin2 => WB2_data,
CCRin => CCRin,
CCRout => CCR_Temp,
WB1_Address => WB1_Address,
WB2_Address => WB2_Address,
WB1_Signal => WB1_Signal,
WB2_Signal => WB2_Signal
);
Zero_Flag <= CCR_Temp(0);
Neg_Flag <= CCR_Temp(1);
Carry_Flag <= CCR_Temp(2);
temp1 <= '1' WHEN ((opCode = "01101") AND (CCR_Temp(0) = '1')) ELSE
'0';
temp2 <= '1' WHEN (opCode(4 DOWNTO 1) = "0111") ELSE
'0';
jmp_Flag <= (temp1) OR (temp2);
END ARCHITECTURE Decode_Stage_Arch;