1 -- `Deep Thought', a softcore CPU implemented on a FPGA
3 -- Copyright (C) 2010 Markus Hofstaetter <markus.manrow@gmx.at>
4 -- Copyright (C) 2010 Martin Perner <e0725782@student.tuwien.ac.at>
5 -- Copyright (C) 2010 Stefan Rebernig <stefan.rebernig@gmail.com>
6 -- Copyright (C) 2010 Manfred Schwarz <e0725898@student.tuwien.ac.at>
7 -- Copyright (C) 2010 Bernhard Urban <lewurm@gmail.com>
9 -- This program is free software: you can redistribute it and/or modify
10 -- it under the terms of the GNU General Public License as published by
11 -- the Free Software Foundation, either version 3 of the License, or
12 -- (at your option) any later version.
14 -- This program is distributed in the hope that it will be useful,
15 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
16 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 -- GNU General Public License for more details.
19 -- You should have received a copy of the GNU General Public License
20 -- along with this program. If not, see <http://www.gnu.org/licenses/>.
23 use IEEE.std_logic_1164.all;
24 use IEEE.numeric_std.all;
25 use IEEE.STD_LOGIC_ARITH.ALL;
26 use IEEE.STD_LOGIC_UNSIGNED.ALL;
28 use work.common_pkg.all;
29 use work.core_pkg.all;
33 use work.extension_pkg.all;
34 use work.extension_imp_pkg.all;
36 architecture behav of extension_imp is
38 signal w1_st_co, w1_st_co_nxt, w2_im_addr, w2_im_addr_nxt, w3_im_data, w3_im_data_nxt, w4_im_notused, w4_im_notused_nxt : gp_register_t;
39 signal new_im_data, new_im_data_nxt: std_logic;
44 syn : process (clk, reset)
46 if (reset = RESET_VALUE) then
47 w1_st_co <= (others=>'0');
48 w2_im_addr(31 downto 16) <= (others=>'0');
49 -- todo mit einer konstante versehen
50 w2_im_addr(15 downto 0) <= x"0003";
51 w3_im_data <= (others=>'0');
52 w4_im_notused <= (others=>'0');
57 elsif rising_edge(clk) then
58 w1_st_co <= w1_st_co_nxt;
59 w2_im_addr <= w2_im_addr_nxt;
60 w3_im_data <= w3_im_data_nxt;
61 w4_im_notused <= w4_im_notused_nxt;
63 new_im_data <= new_im_data_nxt;
68 -------------------------- LESEN UND SCHREIBEN ANFANG ------------------------------------------------------------
70 gwriten : process (ext_reg,w1_st_co,w2_im_addr,w3_im_data,w4_im_notused)
72 variable tmp_data : gp_register_t;
76 w1_st_co_nxt <= w1_st_co;
77 w2_im_addr_nxt <= w2_im_addr;
78 w3_im_data_nxt <= w3_im_data;
79 w4_im_notused_nxt <= w4_im_notused;
81 if ext_reg.sel = '1' and ext_reg.wr_en = '1' then
82 tmp_data := (others =>'0');
83 if ext_reg.byte_en(0) = '1' then
84 tmp_data(byte_t'range) :=ext_reg.data(byte_t'range);
86 if ext_reg.byte_en(1) = '1' then
87 tmp_data((2*byte_t'length-1) downto byte_t'length) := ext_reg.data((2*byte_t'length-1) downto byte_t'length);
89 if ext_reg.byte_en(2) = '1' then
90 tmp_data((3*byte_t'length-1) downto 2*byte_t'length) := ext_reg.data((3*byte_t'length-1) downto 2*byte_t'length);
92 if ext_reg.byte_en(3) = '1' then
93 tmp_data((4*byte_t'length-1) downto 3*byte_t'length) := ext_reg.data((4*byte_t'length-1) downto 3*byte_t'length);
96 case ext_reg.addr(1 downto 0) is
98 w1_st_co_nxt <= tmp_data;
100 -- -1 wegen increment des addr registers
101 tmp_data := tmp_data - '1';
102 w2_im_addr_nxt <= tmp_data;
104 w1_st_co_nxt(0) <= '1'; -- busy flag set
105 w2_im_addr_nxt <= w2_im_addr + '1';
106 w3_im_data_nxt <= tmp_data;
108 --w4_im_notused_nxt <= tmp_data; sollte nur gelesen werden
115 gread : process (clk,ext_reg,w1_st_co,w2_im_addr,w3_im_data,w4_im_notused)
117 variable tmp_data : gp_register_t;
120 if ext_reg.sel = '1' and ext_reg.wr_en = '0' then
121 case ext_reg.addr(1 downto 0) is
123 tmp_data := (others =>'0');
124 if ext_reg.byte_en(0) = '1' then
125 tmp_data(byte_t'range) := w1_st_co(byte_t'range);
127 if ext_reg.byte_en(1) = '1' then
128 tmp_data((2*byte_t'length-1) downto byte_t'length) := w1_st_co((2*byte_t'length-1) downto byte_t'length);
130 if ext_reg.byte_en(2) = '1' then
131 tmp_data((3*byte_t'length-1) downto 2*byte_t'length) := w1_st_co((3*byte_t'length-1) downto 2*byte_t'length);
133 if ext_reg.byte_en(3) = '1' then
134 tmp_data((4*byte_t'length-1) downto 3*byte_t'length) := w1_st_co((4*byte_t'length-1) downto 3*byte_t'length);
136 data_out <= tmp_data;
138 tmp_data := (others =>'0');
139 if ext_reg.byte_en(0) = '1' then
140 tmp_data(byte_t'range) := w2_im_addr(byte_t'range);
142 if ext_reg.byte_en(1) = '1' then
143 tmp_data((2*byte_t'length-1) downto byte_t'length) := w2_im_addr((2*byte_t'length-1) downto byte_t'length);
145 if ext_reg.byte_en(2) = '1' then
146 tmp_data((3*byte_t'length-1) downto 2*byte_t'length) := w2_im_addr((3*byte_t'length-1) downto 2*byte_t'length);
148 if ext_reg.byte_en(3) = '1' then
149 tmp_data((4*byte_t'length-1) downto 3*byte_t'length) := w2_im_addr((4*byte_t'length-1) downto 3*byte_t'length);
151 data_out <= tmp_data;
153 tmp_data := (others =>'0');
154 if ext_reg.byte_en(0) = '1' then
155 tmp_data(byte_t'range) := w3_im_data(byte_t'range);
157 if ext_reg.byte_en(1) = '1' then
158 tmp_data((2*byte_t'length-1) downto byte_t'length) := w3_im_data((2*byte_t'length-1) downto byte_t'length);
160 if ext_reg.byte_en(2) = '1' then
161 tmp_data((3*byte_t'length-1) downto 2*byte_t'length) := w3_im_data((3*byte_t'length-1) downto 2*byte_t'length);
163 if ext_reg.byte_en(3) = '1' then
164 tmp_data((4*byte_t'length-1) downto 3*byte_t'length) := w3_im_data((4*byte_t'length-1) downto 3*byte_t'length);
166 data_out <= tmp_data;
168 tmp_data := (others =>'0');
169 if ext_reg.byte_en(0) = '1' then
170 tmp_data(byte_t'range) := w4_im_notused(byte_t'range);
172 if ext_reg.byte_en(1) = '1' then
173 tmp_data((2*byte_t'length-1) downto byte_t'length) := w4_im_notused((2*byte_t'length-1) downto byte_t'length);
175 if ext_reg.byte_en(2) = '1' then
176 tmp_data((3*byte_t'length-1) downto 2*byte_t'length) := w4_im_notused((3*byte_t'length-1) downto 2*byte_t'length);
178 if ext_reg.byte_en(3) = '1' then
179 tmp_data((4*byte_t'length-1) downto 3*byte_t'length) := w4_im_notused((4*byte_t'length-1) downto 3*byte_t'length);
181 data_out <= tmp_data;
185 data_out <= (others=>'0');
190 -------------------------- LESEN UND SCHREIBEN ENDE ---------------------------------------------------------------
192 -------------------------- INTERNE VERARBEITUNG ANFANG ------------------------------------------------------------
194 dataprocess : process (ext_reg)
198 new_im_data_nxt <= '0';
199 if ext_reg.sel = '1' and ext_reg.wr_en = '1' then
200 case ext_reg.addr(1 downto 0) is
206 new_im_data_nxt <= '1';
213 end process dataprocess;
214 -- asyncrone verarbeitung
215 im_addr <= w2_im_addr;
216 im_data <= w3_im_data;
217 new_im_data_out <= new_im_data;
222 -------------------------- INTERNE VERARBEITUNG ENDE --------------------------------------------------------------