OSDN Git Service

- exec cycle moved out from decoder.
[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                 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                 exec_cycle      : in std_logic_vector (4 downto 0);
54                 next_cycle      : out std_logic_vector (4 downto 0);
55                 status_reg      : inout std_logic_vector (dsize - 1 downto 0);
56                 inst_we_n       : out std_logic;
57                 ad_oe_n         : out std_logic;
58                 pcl_d_we_n      : out std_logic;
59                 pcl_a_we_n      : out std_logic;
60                 pcl_d_oe_n      : out std_logic;
61                 pcl_a_oe_n      : out std_logic;
62                 pch_d_we_n      : out std_logic;
63                 pch_a_we_n      : out std_logic;
64                 pch_d_oe_n      : out std_logic;
65                 pch_a_oe_n      : out std_logic;
66                 pc_inc_n        : out std_logic;
67                 dbuf_int_oe_n   : out std_logic;
68                 dl_al_we_n      : out std_logic;
69                 dl_ah_we_n      : out std_logic;
70                 dl_al_oe_n      : out std_logic;
71                 dl_ah_oe_n      : out std_logic;
72                 sp_we_n         : out std_logic;
73                 sp_push_n       : out std_logic;
74                 sp_pop_n        : out std_logic;
75                 sp_int_d_oe_n   : out std_logic;
76                 sp_int_a_oe_n   : out std_logic;
77                 acc_d_we_n      : out std_logic;
78                 acc_alu_we_n    : out std_logic;
79                 acc_d_oe_n      : out std_logic;
80                 acc_alu_oe_n    : out std_logic;
81                 x_we_n          : out std_logic;
82                 x_oe_n          : out std_logic;
83                 x_ea_oe_n       : out std_logic;
84                 y_we_n          : out std_logic;
85                 y_oe_n          : out std_logic;
86                 y_ea_oe_n       : out std_logic;
87                 ea_calc_n       : out std_logic;
88                 ea_zp_n         : out std_logic;
89                 ea_pg_next_n    : out std_logic;
90                 ea_carry        : in  std_logic;
91                 stat_dec_we_n   : out std_logic;
92                 stat_dec_oe_n   : out std_logic;
93                 stat_bus_we_n   : out std_logic;
94                 stat_bus_oe_n   : out std_logic;
95                 r_nw            : out std_logic
96             );
97     end component;
98
99     component dff
100         generic (
101                 dsize : integer := 8
102                 );
103         port (  
104                 clk     : in std_logic;
105                 we_n    : in std_logic;
106                 oe_n    : in std_logic;
107                 d       : in std_logic_vector (dsize - 1 downto 0);
108                 q       : out std_logic_vector (dsize - 1 downto 0)
109             );
110     end component;
111
112     component dbus_buf
113         generic (
114                 dsize : integer := 8
115                 );
116         port (  
117                 clk         : in std_logic;
118                 r_nw        : in std_logic;
119                 int_oe_n    : in std_logic;
120                 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
121                 ext_dbus : inout std_logic_vector (dsize - 1 downto 0)
122             );
123     end component;
124
125     component input_dl
126         generic (
127                 dsize : integer := 8
128                 );
129         port (  
130                 clk         : in std_logic;
131                 al_we_n     : in std_logic;
132                 ah_we_n     : in std_logic;
133                 al_oe_n     : in std_logic;
134                 ah_oe_n     : in std_logic;
135                 int_dbus    : in std_logic_vector (dsize - 1 downto 0);
136                 ea_al       : out std_logic_vector (dsize - 1 downto 0);
137                 ea_ah       : out std_logic_vector (dsize - 1 downto 0)
138             );
139     end component;
140
141     component sp
142         generic (
143                 dsize : integer := 8
144                 );
145         port (  
146                 clk         : in std_logic;
147                 we_n        : in std_logic;
148                 push_n      : in std_logic;
149                 pop_n       : in std_logic;
150                 int_d_oe_n  : in std_logic;
151                 int_a_oe_n  : in std_logic;
152                 int_dbus    : inout std_logic_vector (dsize - 1 downto 0);
153                 int_abus_l  : out std_logic_vector (dsize - 1 downto 0);
154                 int_abus_h  : out std_logic_vector (dsize - 1 downto 0)
155             );
156     end component;
157
158     component tsb
159         generic (
160                 dsize : integer := 8
161                 );
162         port (  
163                 oe_n    : in std_logic;
164                 d       : in std_logic_vector (dsize - 1 downto 0);
165                 q       : out std_logic_vector (dsize - 1 downto 0)
166             );
167     end component;
168
169     component processor_status 
170     generic (
171             dsize : integer := 8
172             );
173     port (  
174             clk         : in std_logic;
175             res_n       : in std_logic;
176             dec_we_n    : in std_logic;
177             bus_we_n    : in std_logic;
178             dec_oe_n    : in std_logic;
179             bus_oe_n    : in std_logic;
180             alu_c       : in std_logic;
181             alu_v       : in std_logic;
182             decoder     : inout std_logic_vector (dsize - 1 downto 0);
183             int_dbus    : inout std_logic_vector (dsize - 1 downto 0)
184         );
185     end component;
186
187     component accumulator
188     generic (
189             dsize : integer := 8
190             );
191     port (  
192             clk         : in std_logic;
193             d_we_n      : in std_logic;
194             alu_we_n    : in std_logic;
195             d_oe_n      : in std_logic;
196             alu_oe_n    : in std_logic;
197             int_dbus    : inout std_logic_vector (dsize - 1 downto 0);
198             alu_bus     : inout std_logic_vector (dsize - 1 downto 0)
199         );
200     end component;
201
202     component index_reg
203     generic (
204             dsize : integer := 8
205             );
206     port (  
207             clk         : in std_logic;
208             d_we_n      : in std_logic;
209             d_oe_n      : in std_logic;
210             ea_oe_n     : in std_logic;
211             int_dbus    : inout std_logic_vector (dsize - 1 downto 0);
212             ea_bus      : out std_logic_vector (dsize - 1 downto 0)
213         );
214     end component;
215
216     component effective_adder
217     generic (   dsize : integer := 8
218             );
219     port (  
220             ea_calc_n       : in std_logic;
221             zp_n            : in std_logic;
222             pg_next_n       : in std_logic;
223             base_l          : in std_logic_vector (dsize - 1 downto 0);
224             base_h          : in std_logic_vector (dsize - 1 downto 0);
225             index           : in std_logic_vector (dsize - 1 downto 0);
226             ah_bus          : out std_logic_vector (dsize - 1 downto 0);
227             al_bus          : out std_logic_vector (dsize - 1 downto 0);
228             carry           : out std_logic
229     );
230     end component;
231
232     signal set_clk : std_logic;
233     signal trigger_clk : std_logic;
234
235     signal pcl_d_we_n : std_logic;
236     signal pcl_a_we_n : std_logic;
237     signal pcl_d_oe_n : std_logic;
238     signal pcl_a_oe_n : std_logic;
239     signal pch_d_we_n : std_logic;
240     signal pch_a_we_n : std_logic;
241     signal pch_d_oe_n : std_logic;
242     signal pch_a_oe_n : std_logic;
243     signal pc_inc_n : std_logic;
244     signal pc_cry : std_logic;
245     signal pc_cry_n : std_logic;
246     signal dum_terminate : std_logic := 'Z';
247
248     signal inst_we_n : std_logic;
249     signal dbuf_r_nw : std_logic;
250     signal dbuf_int_oe_n : std_logic;
251     signal dl_al_we_n : std_logic;
252     signal dl_ah_we_n : std_logic;
253     signal dl_al_oe_n : std_logic;
254     signal dl_ah_oe_n : std_logic;
255
256     signal sp_we_n : std_logic;
257     signal sp_push_n : std_logic;
258     signal sp_pop_n : std_logic;
259     signal sp_int_d_oe_n : std_logic;
260     signal sp_int_a_oe_n : std_logic;
261
262     signal acc_d_we_n      : std_logic;
263     signal acc_alu_we_n    : std_logic;
264     signal acc_d_oe_n      : std_logic;
265     signal acc_alu_oe_n    : std_logic;
266     signal alu_bus         : std_logic_vector(dsize - 1 downto 0);
267
268     signal x_we_n : std_logic;
269     signal x_oe_n : std_logic;
270
271     signal y_we_n : std_logic;
272     signal y_oe_n : std_logic;
273
274     signal ea_base_l : std_logic_vector(dsize - 1 downto 0);
275     signal ea_base_h : std_logic_vector(dsize - 1 downto 0);
276     signal ea_calc_n : std_logic;
277     signal ea_zp_n : std_logic;
278     signal ea_pg_next_n : std_logic;
279     signal ea_carry : std_logic;
280
281     signal ea_index : std_logic_vector(dsize - 1 downto 0);
282     signal x_ea_oe_n : std_logic;
283     signal y_ea_oe_n : std_logic;
284
285     signal stat_dec_we_n : std_logic;
286     signal stat_dec_oe_n : std_logic;
287     signal stat_bus_we_n : std_logic;
288     signal stat_bus_oe_n : std_logic;
289     signal stat_alu_c : std_logic;
290     signal stat_alu_v : std_logic;
291
292     --internal bus (address hi/lo, data)
293     signal ad_oe_n : std_logic;
294     signal internal_abus_h : std_logic_vector (dsize - 1 downto 0);
295     signal internal_abus_l : std_logic_vector (dsize - 1 downto 0);
296     signal internal_dbus : std_logic_vector (dsize - 1 downto 0);
297
298     signal instruction : std_logic_vector (dsize - 1 downto 0);
299     signal exec_cycle  : std_logic_vector (4 downto 0);
300     signal next_cycle  : std_logic_vector (4 downto 0);
301     signal status_reg : std_logic_vector (dsize - 1 downto 0);
302
303 begin
304
305     ---instances....
306     dec_inst : decoder generic map (dsize) 
307             port map(set_clk, 
308                     trigger_clk, 
309                     rst_n, 
310                     irq_n, 
311                     nmi_n, 
312                     rdy, 
313                     instruction, 
314                     exec_cycle,
315                     next_cycle,
316                     status_reg, 
317                     inst_we_n, 
318                     ad_oe_n, 
319                     pcl_d_we_n, 
320                     pcl_a_we_n, 
321                     pcl_d_oe_n, 
322                     pcl_a_oe_n,
323                     pch_d_we_n, 
324                     pch_a_we_n, 
325                     pch_d_oe_n, 
326                     pch_a_oe_n,
327                     pc_inc_n, 
328                     dbuf_int_oe_n, 
329                     dl_al_we_n, 
330                     dl_ah_we_n, 
331                     dl_al_oe_n, 
332                     dl_ah_oe_n,
333                     sp_we_n, 
334                     sp_push_n, 
335                     sp_pop_n, 
336                     sp_int_d_oe_n, 
337                     sp_int_a_oe_n,
338                     acc_d_we_n,
339                     acc_alu_we_n,
340                     acc_d_oe_n,
341                     acc_alu_oe_n,
342                     x_we_n, 
343                     x_oe_n, 
344                     x_ea_oe_n,
345                     y_we_n, 
346                     y_oe_n, 
347                     y_ea_oe_n,
348                     ea_calc_n,
349                     ea_zp_n,
350                     ea_pg_next_n,
351                     ea_carry,
352                     stat_dec_we_n, 
353                     stat_dec_oe_n, 
354                     stat_bus_we_n, 
355                     stat_bus_oe_n,
356                     dbuf_r_nw
357                     );
358
359     --cpu execution cycle number
360     exec_cycle_inst : dff generic map (5) 
361             port map(trigger_clk, '0', '0', next_cycle, exec_cycle);
362
363     --io data buffer
364     data_bus_buffer : dbus_buf generic map (dsize) 
365             port map(set_clk, dbuf_r_nw, dbuf_int_oe_n, internal_dbus, d_io);
366
367     ---effective addres calcurator.
368     ea_calc: effective_adder generic map (dsize)
369             port map (ea_calc_n, ea_zp_n, ea_pg_next_n,
370                     ea_base_l, ea_base_h, ea_index, 
371                     internal_abus_h, internal_abus_l, ea_carry);
372
373     --address operand data buffer.
374     input_data_latch : input_dl generic map (dsize) 
375             port map(set_clk, dl_al_we_n, dl_ah_we_n, dl_al_oe_n, dl_ah_oe_n, 
376                     internal_dbus, ea_base_l, ea_base_h);
377
378     pc_l : pc generic map (dsize, 16#00#) 
379             port map(trigger_clk, rst_n, 
380                     pcl_d_we_n, pcl_a_we_n, pcl_d_oe_n, pcl_a_oe_n, 
381                     pc_inc_n, '0', pc_cry, internal_dbus, internal_abus_l);
382     pc_h : pc generic map (dsize, 16#80#) 
383             port map(trigger_clk, rst_n, 
384                     pch_d_we_n, pch_a_we_n, pch_d_oe_n, pch_a_oe_n, 
385                     pc_cry_n, pc_cry, dum_terminate, internal_dbus, internal_abus_h);
386
387     instruction_register : dff generic map (dsize) 
388             port map(trigger_clk, inst_we_n, '0', d_io, instruction);
389
390     stack_pointer : sp generic map (dsize) 
391             port map(trigger_clk, sp_we_n, sp_push_n, sp_pop_n, 
392                     sp_int_d_oe_n, sp_int_a_oe_n, 
393                     internal_dbus, internal_abus_l, internal_abus_h);
394
395     status_register : processor_status generic map (dsize) 
396             port map (trigger_clk, rst_n, stat_dec_we_n, stat_bus_we_n, 
397                     stat_dec_oe_n, stat_bus_oe_n, 
398                     stat_alu_c, stat_alu_v, 
399                     status_reg, internal_dbus);
400
401     --x/y output pin is connected to effective address calcurator
402     x_reg : index_reg generic map (dsize) 
403             port map(trigger_clk, x_we_n, x_oe_n, x_ea_oe_n, internal_dbus, ea_index);
404
405     y_reg : index_reg generic map (dsize) 
406             port map(trigger_clk, y_we_n, y_oe_n, y_ea_oe_n, internal_dbus, ea_index);
407
408     acc_reg : accumulator generic map (dsize) 
409             port map(trigger_clk, 
410                     acc_d_we_n, acc_alu_we_n, acc_d_oe_n, acc_alu_oe_n,
411                     internal_dbus, alu_bus);
412
413     -- clock generate.
414     phi1 <= input_clk;
415     phi2 <= not input_clk;
416     set_clk <= input_clk;
417     trigger_clk <= not input_clk;
418     pc_cry_n <= not pc_cry;
419     r_nw <= dbuf_r_nw;
420
421     --adh output is controlled by decoder.
422     adh_buffer : tsb generic map (dsize)
423             port map (ad_oe_n, internal_abus_h, addr(asize - 1 downto dsize));
424     adl_buffer : tsb generic map (dsize)
425             port map (ad_oe_n, internal_abus_l, addr(dsize - 1 downto 0));
426
427     reset_p : process (rst_n)
428     begin
429         if (rst_n'event and rst_n = '0') then
430
431         end if;
432     end process;
433
434     dbg_p : process (set_clk)
435 use std.textio.all;
436 use ieee.std_logic_textio.all;
437 use ieee.std_logic_unsigned.conv_integer;
438
439 procedure d_print(msg : string) is
440 variable out_l : line;
441 begin
442     write(out_l, msg);
443     writeline(output, out_l);
444 end  procedure;
445
446 function conv_hex8(ival : integer) return string is
447 variable tmp1, tmp2 : integer;
448 variable hex_chr: string (1 to 16) := "0123456789abcdef";
449 begin
450     tmp2 := (ival mod 16 ** 2) / 16 ** 1;
451     tmp1 := ival mod 16 ** 1;
452     return hex_chr(tmp2 + 1) & hex_chr(tmp1 + 1);
453 end;
454     begin
455         if (set_clk = '0' and exec_cycle = "00000") then
456             --show pc on the T0 (fetch) cycle.
457             d_print("pc : " & conv_hex8(conv_integer(internal_abus_h)) 
458                     & conv_hex8(conv_integer(internal_abus_l)));
459         end if;
460     end process;
461
462 end rtl;
463