OSDN Git Service

cpu to memory write ok.
[motonesfpga/motonesfpga.git] / simulation / cpu / mos6502.vhd
1 library ieee;
2 use ieee.std_logic_1164.all;
3
4 entity mos6502 is 
5     generic (   dsize : integer := 8;
6                 asize : integer :=16
7             );
8     port (  input_clk   : in std_logic; --phi0 input pin.
9             rdy         : in std_logic;
10             rst_n       : in std_logic;
11             irq_n       : in std_logic;
12             nmi_n       : in std_logic;
13             dbe         : in std_logic;
14             r_nw        : out std_logic;
15             phi1        : out std_logic;
16             phi2        : out std_logic;
17             addr        : out std_logic_vector ( asize - 1 downto 0);
18             d_io        : inout std_logic_vector ( dsize - 1 downto 0)
19     );
20 end mos6502;
21
22 architecture rtl of mos6502 is
23
24     component pc
25         generic (
26                 dsize : integer := 8;
27                 reset_addr : integer := 0
28                 );
29         port (  
30                 trig_clk        : in std_logic;
31                 res_n           : in std_logic;
32                 dbus_we_n       : in std_logic;
33                 abus_we_n       : in std_logic;
34                 dbus_oe_n       : in std_logic;
35                 abus_oe_n       : in std_logic;
36                 addr_inc_n      : in std_logic;
37                 add_carry       : in std_logic;
38                 inc_carry       : out std_logic;
39                 int_d_bus       : inout std_logic_vector (dsize - 1 downto 0);
40                 int_a_bus       : inout std_logic_vector (dsize - 1 downto 0)
41             );
42     end component;
43
44     component decoder
45         generic (dsize : integer := 8);
46         port (  set_clk         : in std_logic;
47                 trig_clk        : in std_logic;
48                 res_n           : in std_logic;
49                 irq_n           : in std_logic;
50                 nmi_n           : in std_logic;
51                 rdy             : in std_logic;
52                 instruction     : in std_logic_vector (dsize - 1 downto 0);
53                 status_reg      : inout std_logic_vector (dsize - 1 downto 0);
54                 ad_oe_n         : out std_logic;
55                 pcl_d_we_n      : out std_logic;
56                 pcl_a_we_n      : out std_logic;
57                 pcl_d_oe_n      : out std_logic;
58                 pcl_a_oe_n      : out std_logic;
59                 pch_d_we_n      : out std_logic;
60                 pch_a_we_n      : out std_logic;
61                 pch_d_oe_n      : out std_logic;
62                 pch_a_oe_n      : out std_logic;
63                 pc_inc_n        : out std_logic;
64                 inst_we_n       : out std_logic;
65                 dbuf_int_oe_n   : out std_logic;
66                 dbuf_ext_oe_n   : out std_logic;
67                 dbuf_int_we_n   : out std_logic;
68                 dbuf_ext_we_n   : out std_logic;
69                 dl_we_n         : out std_logic;
70                 dl_int_d_oe_n   : out std_logic;
71                 dl_int_al_oe_n  : out std_logic;
72                 dl_int_ah_oe_n  : out std_logic;
73                 sp_we_n         : out std_logic;
74                 sp_push_n       : out std_logic;
75                 sp_pop_n        : out std_logic;
76                 sp_int_d_oe_n   : out std_logic;
77                 sp_int_a_oe_n   : out std_logic;
78                 x_we_n          : out std_logic;
79                 x_oe_n          : out std_logic;
80                 y_we_n          : out std_logic;
81                 y_oe_n          : out std_logic;
82                 stat_dec_we_n   : out std_logic;
83                 stat_dec_oe_n   : out std_logic;
84                 stat_bus_we_n   : out std_logic;
85                 stat_bus_oe_n   : out std_logic;
86                 r_nw            : out std_logic
87             );
88     end component;
89
90     component dff
91         generic (
92                 dsize : integer := 8
93                 );
94         port (  
95                 clk     : in std_logic;
96                 we_n    : in std_logic;
97                 oe_n    : in std_logic;
98                 d       : in std_logic_vector (dsize - 1 downto 0);
99                 q       : out std_logic_vector (dsize - 1 downto 0)
100             );
101     end component;
102
103     component dbus_buf
104         generic (
105                 dsize : integer := 8
106                 );
107         port (  
108                 clk         : in std_logic;
109                 r_nw        : in std_logic;
110                 int_we_n    : in std_logic;
111                 ext_we_n    : in std_logic;
112                 int_oe_n    : in std_logic;
113                 ext_oe_n    : in std_logic;
114                 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
115                 ext_dbus : inout std_logic_vector (dsize - 1 downto 0)
116             );
117     end component;
118
119     component input_dl
120         generic (
121                 dsize : integer := 8
122                 );
123         port (  
124                 we_n        : in std_logic;
125                 int_d_oe_n  : in std_logic;
126                 int_al_oe_n : in std_logic;
127                 int_ah_oe_n : in std_logic;
128                 int_dbus    : inout std_logic_vector (dsize - 1 downto 0);
129                 int_abus_l  : out std_logic_vector (dsize - 1 downto 0);
130                 int_abus_h  : out std_logic_vector (dsize - 1 downto 0)
131             );
132     end component;
133
134     component sp
135         generic (
136                 dsize : integer := 8
137                 );
138         port (  
139                 clk         : in std_logic;
140                 we_n        : in std_logic;
141                 push_n      : in std_logic;
142                 pop_n       : in std_logic;
143                 int_d_oe_n  : in std_logic;
144                 int_a_oe_n  : in std_logic;
145                 int_dbus    : inout std_logic_vector (dsize - 1 downto 0);
146                 int_abus_l  : out std_logic_vector (dsize - 1 downto 0);
147                 int_abus_h  : out std_logic_vector (dsize - 1 downto 0)
148             );
149     end component;
150
151     component tsb
152         generic (
153                 dsize : integer := 8
154                 );
155         port (  
156                 oe_n    : in std_logic;
157                 d       : in std_logic_vector (dsize - 1 downto 0);
158                 q       : out std_logic_vector (dsize - 1 downto 0)
159             );
160     end component;
161
162     component processor_status 
163     generic (
164             dsize : integer := 8
165             );
166     port (  
167             clk         : in std_logic;
168             res_n       : in std_logic;
169             dec_we_n    : in std_logic;
170             bus_we_n    : in std_logic;
171             dec_oe_n    : in std_logic;
172             bus_oe_n    : in std_logic;
173             alu_c       : in std_logic;
174             alu_v       : in std_logic;
175             decoder     : inout std_logic_vector (dsize - 1 downto 0);
176             int_dbus    : inout std_logic_vector (dsize - 1 downto 0)
177         );
178     end component;
179
180     signal set_clk : std_logic;
181     signal trigger_clk : std_logic;
182
183     signal pcl_d_we_n : std_logic;
184     signal pcl_a_we_n : std_logic;
185     signal pcl_d_oe_n : std_logic;
186     signal pcl_a_oe_n : std_logic;
187     signal pch_d_we_n : std_logic;
188     signal pch_a_we_n : std_logic;
189     signal pch_d_oe_n : std_logic;
190     signal pch_a_oe_n : std_logic;
191     signal pc_inc_n : std_logic;
192     signal pc_cry : std_logic;
193     signal pc_cry_n : std_logic;
194     signal dum_terminate : std_logic := 'Z';
195
196     signal inst_we_n : std_logic;
197     signal dbuf_r_nw : std_logic;
198     signal dbuf_int_oe_n : std_logic;
199     signal dbuf_ext_oe_n : std_logic;
200     signal dbuf_int_we_n : std_logic;
201     signal dbuf_ext_we_n : std_logic;
202     signal dl_we_n : std_logic;
203     signal dl_int_d_oe_n : std_logic;
204     signal dl_int_al_oe_n : std_logic;
205     signal dl_int_ah_oe_n : std_logic;
206
207     signal sp_we_n : std_logic;
208     signal sp_push_n : std_logic;
209     signal sp_pop_n : std_logic;
210     signal sp_int_d_oe_n : std_logic;
211     signal sp_int_a_oe_n : std_logic;
212
213     signal x_we_n : std_logic;
214     signal x_oe_n : std_logic;
215     signal y_we_n : std_logic;
216     signal y_oe_n : std_logic;
217
218     signal stat_dec_we_n : std_logic;
219     signal stat_dec_oe_n : std_logic;
220     signal stat_bus_we_n : std_logic;
221     signal stat_bus_oe_n : std_logic;
222     signal stat_alu_c : std_logic;
223     signal stat_alu_v : std_logic;
224
225     --internal bus (address hi/lo, data)
226     signal ad_oe_n : std_logic;
227     signal internal_abus_h : std_logic_vector (dsize - 1 downto 0);
228     signal internal_abus_l : std_logic_vector (dsize - 1 downto 0);
229     signal internal_dbus : std_logic_vector (dsize - 1 downto 0);
230
231     signal instruction : std_logic_vector (dsize - 1 downto 0);
232     signal status_reg : std_logic_vector (dsize - 1 downto 0);
233
234 begin
235
236     ---instances....
237     pc_l : pc generic map (dsize, 16#00#) 
238             port map(trigger_clk, rst_n, 
239                     pcl_d_we_n, pcl_a_we_n, pcl_d_oe_n, pcl_a_oe_n, 
240                     pc_inc_n, '0', pc_cry, internal_dbus, internal_abus_l);
241     pc_h : pc generic map (dsize, 16#80#) 
242             port map(trigger_clk, rst_n, 
243                     pch_d_we_n, pch_a_we_n, pch_d_oe_n, pch_a_oe_n, 
244                     pc_cry_n, pc_cry, dum_terminate, internal_dbus, internal_abus_h);
245
246     dec_inst : decoder generic map (dsize) 
247             port map(set_clk, trigger_clk, rst_n, irq_n, nmi_n, 
248                     rdy, instruction, status_reg, ad_oe_n, 
249                     pcl_d_we_n, pcl_a_we_n, pcl_d_oe_n, pcl_a_oe_n,
250                     pch_d_we_n, pch_a_we_n, pch_d_oe_n, pch_a_oe_n,
251                     pc_inc_n, 
252                     inst_we_n, 
253                     dbuf_int_oe_n, dbuf_ext_oe_n, dbuf_int_we_n, dbuf_ext_we_n, 
254                     dl_we_n, dl_int_d_oe_n, dl_int_al_oe_n, dl_int_ah_oe_n,
255                     sp_we_n, sp_push_n, sp_pop_n, sp_int_d_oe_n, sp_int_a_oe_n,
256                     x_we_n, x_oe_n, y_we_n, y_oe_n, 
257                     stat_dec_we_n, stat_dec_oe_n, stat_bus_we_n, stat_bus_oe_n,
258                     dbuf_r_nw);
259
260     instruction_register : dff generic map (dsize) 
261             port map(trigger_clk, inst_we_n, '0', d_io, instruction);
262
263     data_bus_buffer : dbus_buf generic map (dsize) 
264             port map(set_clk, dbuf_r_nw, dbuf_int_we_n, dbuf_ext_we_n, 
265                     dbuf_int_oe_n, dbuf_ext_oe_n, internal_dbus, d_io);
266
267     input_data_latch : input_dl generic map (dsize) 
268             port map(dl_we_n, dl_int_d_oe_n, dl_int_al_oe_n, dl_int_ah_oe_n, 
269                     internal_dbus, internal_abus_l, internal_abus_h);
270
271     stack_pointer : sp generic map (dsize) 
272             port map(trigger_clk, sp_we_n, sp_push_n, sp_pop_n, 
273                     sp_int_d_oe_n, sp_int_a_oe_n, 
274                     internal_dbus, internal_abus_l, internal_abus_h);
275
276     status_reg_component : processor_status generic map (dsize) 
277             port map (trigger_clk, rst_n, stat_dec_we_n, stat_bus_we_n, 
278                     stat_dec_oe_n, stat_bus_oe_n, 
279                     stat_alu_c, stat_alu_v, 
280                     status_reg, internal_dbus);
281
282     x_reg : dff generic map (dsize) 
283             port map(trigger_clk, x_we_n, x_oe_n, internal_dbus, internal_dbus);
284
285     y_reg : dff generic map (dsize) 
286             port map(trigger_clk, y_we_n, y_oe_n, internal_dbus, internal_dbus);
287
288     -- clock generate.
289     phi1 <= input_clk;
290     phi2 <= not input_clk;
291     set_clk <= input_clk;
292     trigger_clk <= not input_clk;
293     pc_cry_n <= not pc_cry;
294     r_nw <= dbuf_r_nw;
295
296     --adh output is controlled by decoder.
297     adh_buffer : tsb generic map (dsize)
298             port map (ad_oe_n, internal_abus_h, addr(asize - 1 downto dsize));
299     adl_buffer : tsb generic map (dsize)
300             port map (ad_oe_n, internal_abus_l, addr(dsize - 1 downto 0));
301
302     reset_p : process (rst_n)
303     begin
304         if (rst_n'event and rst_n = '0') then
305
306         end if;
307     end process;
308
309 end rtl;
310