added de2-115 top
[calu.git] / cpu / src / core_top_c4de2_115.vhd
1 library IEEE;
2 use IEEE.std_logic_1164.all;
3 use IEEE.numeric_std.all;
4
5 use work.common_pkg.all;
6 use work.core_pkg.all;
7 use work.extension_pkg.all;
8
9 entity core_top_c4de2_115 is
10
11         port(
12                 --System input pins
13                 CLOCK_50        : in std_logic;
14                 --Reset buttons
15                 KEY : in std_logic_vector(0 to 3);
16
17                 -- uart
18                 UART_TXD : out std_logic;
19                 UART_RXD : in std_logic;
20                 -- bootrom led
21                 LEDR : out std_logic_vector(0 to 17);
22                 LEDG : out std_logic_vector(0 to 8);
23
24                 HEX0 : out std_logic_vector(0 to 6);
25                 HEX1 : out std_logic_vector(0 to 6);
26                 HEX2 : out std_logic_vector(0 to 6);
27                 HEX3 : out std_logic_vector(0 to 6);
28
29
30                 LCD_DATA_8 : out std_logic_vector(7 downto 0);
31                 LCD_BLON : out std_logic;
32                 LCD_RW : out std_logic;
33                 LCD_EN : out std_logic;
34                 LCD_RS : out std_logic;
35                 LCD_ON : out std_logic
36
37
38         );
39
40 end core_top_c4de2_115;
41
42 architecture behav of core_top_c4de2_115 is
43
44                 constant SYNC_STAGES : integer := 2;
45                 constant RESET_VALUE : std_logic := '0';
46
47                 signal sys_clk, sys_res, soft_res : std_logic;
48                 signal bus_tx, bus_rx : std_logic;
49                 signal led2 : std_logic;
50                 signal sseg0, sseg1, sseg2, sseg3 : std_logic_vector(0 to 6);
51
52                 signal jump_result : instruction_addr_t;
53                 signal jump_result_pin : instruction_addr_t;
54                 signal prediction_result_pin : instruction_addr_t;
55                 signal branch_prediction_bit_pin : std_logic;
56                 signal alu_jump_bit_pin : std_logic;
57                 signal instruction_pin : instruction_word_t;
58                 signal prog_cnt_pin : instruction_addr_t;
59
60                 signal reg_w_addr_pin : std_logic_vector(REG_ADDR_WIDTH-1 downto 0);
61                 signal reg_wr_data_pin : gp_register_t;
62                 signal reg_we_pin : std_logic;
63                 signal to_next_stage : dec_op;
64
65                 signal result_pin : gp_register_t;--reg
66                 signal result_addr_pin : gp_addr_t;--reg
67                 signal addr_pin : word_t; --memaddr
68                 signal data_pin : gp_register_t; --mem data --ureg
69                 signal alu_jump_pin : std_logic;--reg
70                 signal brpr_pin  : std_logic;  --reg
71                 signal wr_en_pin : std_logic;--regop --reg
72                 signal dmem_pin  : std_logic;--memop
73                 signal dmem_wr_en_pin : std_logic;
74                 signal hword_pin  : std_logic;
75                 signal byte_s_pin : std_logic;
76
77                 signal gpm_in_pin : extmod_rec;
78                 signal gpm_out_pin : gp_register_t;
79                 signal nop_pin : std_logic;
80
81                 signal sync : std_logic_vector(1 to SYNC_STAGES);
82                 signal sync2 : std_logic_vector(1 to SYNC_STAGES);
83                 signal sys_res_n, soft_res_n : std_logic;
84
85                 signal int_req : interrupt_t;
86
87                 signal new_im_data : std_logic;
88                 signal im_addr, im_data : gp_register_t;
89 --              signal led2 : std_logic;
90
91                 signal vers, vers_nxt : exec2wb_rec;
92 begin
93         sys_clk <= CLOCK_50;
94         sys_res <= KEY(0);
95         soft_res <= KEY(1);
96
97         UART_TXD <= bus_tx;
98         bus_rx <= UART_RXD;
99
100         --bootrom status
101         LEDR(0) <= led2;
102         LEDR(1 to 17) <= (others => '0');
103         LEDG <= (others => '0');
104
105         HEX0 <= sseg0;
106         HEX1 <= sseg1;
107         HEX2 <= sseg2;
108         HEX3 <= sseg3;
109
110         fetch_st : fetch_stage
111                 generic map (
112
113                         RESET_VALUE,
114                         '1'
115                 )
116
117                 port map (
118                 --System inputs
119                         clk => sys_clk, --: in std_logic;
120                         reset => sys_res_n, --: in std_logic;
121                         s_reset => soft_res_n,
122
123                 --Data inputs
124                         jump_result => jump_result_pin, --: in instruction_addr_t;
125                         prediction_result => prediction_result_pin, --: in instruction_addr_t;
126                         branch_prediction_bit => branch_prediction_bit_pin,  --: in std_logic;
127                         alu_jump_bit => alu_jump_bit_pin, --: in std_logic;
128                         int_req => int_req,
129                 -- instruction memory program port :D
130                         new_im_data_in => new_im_data,
131                         im_addr => im_addr,
132                         im_data => im_data,
133                 --Data outputs
134                         instruction => instruction_pin, --: out instruction_word_t
135                         prog_cnt => prog_cnt_pin,
136                         led2 => led2
137                 );
138
139         decode_st : decode_stage
140                 generic map (
141                         -- active reset value
142                         RESET_VALUE,
143                         -- active logic value
144                         '1'
145                         )
146                 port map (
147                 --System inputs
148                         clk => sys_clk, --: in std_logic;
149                         reset => sys_res_n and soft_res_n, -- : in std_logic;
150
151                 --Data inputs
152                         instruction => instruction_pin, --: in instruction_word_t;
153                         prog_cnt => prog_cnt_pin,
154                         reg_w_addr => reg_w_addr_pin, --: in std_logic_vector(REG_ADDR_WIDTH-1 downto 0);
155                         reg_wr_data => reg_wr_data_pin, --: in gp_register_t;
156                         reg_we => reg_we_pin, --: in std_logic;
157                         nop => nop_pin,
158
159                 --Data outputs
160                         branch_prediction_res => prediction_result_pin, --: instruction_word_t;
161                         branch_prediction_bit => branch_prediction_bit_pin, --: std_logic
162                         to_next_stage => to_next_stage
163                 );
164
165                 exec_st : execute_stage
166                         generic map(RESET_VALUE)
167                         port map(sys_clk, sys_res_n and soft_res_n,to_next_stage, reg_wr_data_pin, reg_we_pin, reg_w_addr_pin, gpm_in_pin, result_pin, result_addr_pin,addr_pin,
168                                  data_pin, alu_jump_pin,brpr_pin, wr_en_pin, dmem_pin,dmem_wr_en_pin,hword_pin,byte_s_pin, gpm_out_pin);
169
170                 writeback_st : writeback_stage
171                         generic map(RESET_VALUE, '1', "altera", 434)
172                         port map(sys_clk, sys_res_n and soft_res_n, result_pin, result_addr_pin, addr_pin, data_pin, alu_jump_pin, brpr_pin, 
173                                  wr_en_pin, dmem_pin, dmem_wr_en_pin, hword_pin, byte_s_pin,
174                                  reg_wr_data_pin, reg_we_pin, reg_w_addr_pin, jump_result_pin, alu_jump_bit_pin,bus_tx, bus_rx, 
175                                  new_im_data, im_addr, im_data, sseg0, sseg1, sseg2, sseg3, int_req);
176
177
178
179 syn: process(sys_clk, sys_res)
180
181 begin
182
183         if sys_res = RESET_VALUE then
184
185                 sync <= (others => RESET_VALUE);
186
187         elsif rising_edge(sys_clk) then
188                         sync(1) <= sys_res;
189                         for i in 2 to SYNC_STAGES loop
190                                 sync(i) <= sync(i - 1);
191                         end loop;
192
193                         sync2(1) <= soft_res;
194                         for i in 2 to SYNC_STAGES loop
195                                 sync2(i) <= sync2(i - 1);
196                         end loop;
197
198         end if;
199
200 end process;
201
202 sys_res_n <= sync(SYNC_STAGES);
203 soft_res_n <= sync2(SYNC_STAGES);
204 nop_pin <= (alu_jump_bit_pin); -- xor brpr_pin);
205 jump_result <= prog_cnt_pin; --jump_result_pin;
206
207 end behav;