-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathID_Stage.vhdl
106 lines (93 loc) · 2.83 KB
/
ID_Stage.vhdl
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
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY ID_Stage IS
PORT (
CLK, RST : IN STD_LOGIC;
PC_IF : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
OP_IF : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
SEPC_ID, SE_ID, LS_ID : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
A1_ID, A2_ID, A3_ID, ALU_CS_ID, RF_D3MUX_ID : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
ALU_FM_ID, CWB_ID : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
RF_WREN_ID, SEPC_CS_ID, ALUY_B_CS_ID, MEM_WREN_ID : OUT STD_LOGIC
);
END ID_Stage;
ARCHITECTURE behav OF ID_Stage IS
component LShifter7 is
port (
inp : in std_logic_vector (8 downto 0);
outp : out std_logic_vector (15 downto 0)
);
end component;
component SignExt6 is
port (
inp : in std_logic_vector (5 downto 0);
outp : out std_logic_vector (15 downto 0)
);
end component;
signal se_sig: std_logic_vector(15 downto 0);
BEGIN
ls7: LShifter7 port map(inp => OP_IF(8 downto 0), outp => LS_ID);
se6: SignExt6 port map(inp => OP_IF(5 downto 0), outp => se_sig);
PROCESS (CLK, RST, PC_IF, OP_IF)
BEGIN
CASE(OP_IF (15 DOWNTO 12)) IS
WHEN "0001" =>
A1_ID <= OP_IF(11 DOWNTO 9);
A2_ID <= OP_IF(8 DOWNTO 6);
A3_ID <= OP_IF(5 DOWNTO 3);
ALU_CS_ID <= "000";
ALU_FM_ID <= "11";
CWB_ID <= "00";
RF_D3MUX_ID <= "000";
RF_WREN_ID <= '1';
MEM_WREN_ID <= '0';
SEPC_ID <= (others => '0');
SE_ID <= (others => '0');
SEPC_CS_ID <= '0';
ALUY_B_CS_ID <= '0';
WHEN "0000" =>
A1_ID <= (others => '0');
A2_ID <= (others => '0');
A3_ID <= OP_IF(11 DOWNTO 9);
ALU_CS_ID <= "100";
ALU_FM_ID <= "00";
CWB_ID <= "00";
RF_D3MUX_ID <= "000";
RF_WREN_ID <= '1';
MEM_WREN_ID <= '0';
SEPC_ID <= (others => '0');
SE_ID <= (others => '0');
SEPC_CS_ID <= '0';
ALUY_B_CS_ID <= '0';
WHEN "0111" =>
A3_ID <= OP_IF(11 downto 9);
A1_ID <= OP_IF(8 downto 6);
A2_ID <= (others => '0');
ALU_CS_ID <= "000";
ALU_FM_ID <= "00";
CWB_ID <= "00";
RF_D3MUX_ID <= "010";
RF_WREN_ID <= '1';
MEM_WREN_ID <= '0';
SEPC_ID <= (others => '0');
SE_ID <= se_sig;
SEPC_CS_ID <= '1';
ALUY_B_CS_ID <= '1';
WHEN OTHERS =>
SEPC_ID <= (others => '0');
SE_ID <= (others => '0');
SEPC_CS_ID <= '0';
ALUY_B_CS_ID <= '0';
A1_ID <= (others => '0');
A2_ID <= (others => '0');
A3_ID <= (others => '0');
ALU_CS_ID <= (others => '0');
ALU_FM_ID <= (others => '0');
CWB_ID <= "00";
RF_D3MUX_ID <= "000";
RF_WREN_ID <= '0';
MEM_WREN_ID <= '0';
END CASE;
END PROCESS; --
END ARCHITECTURE; -- arch