OSDN Git Service

abs, x working.
[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                 dl_al_we_n      : out std_logic;
67                 dl_ah_we_n      : out std_logic;
68                 dl_dl_oe_n      : out std_logic;
69                 dl_dh_oe_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_calc_n        : out std_logic;
84                 y_we_n          : out std_logic;
85                 y_oe_n          : out std_logic;
86                 y_calc_n        : out std_logic;
87                 ea_ah_oe_n      : out std_logic;
88                 ea_al_oe_n      : out std_logic;
89                 ea_carry        : in  std_logic;
90                 stat_dec_we_n   : out std_logic;
91                 stat_dec_oe_n   : out std_logic;
92                 stat_bus_we_n   : out std_logic;
93                 stat_bus_oe_n   : out std_logic;
94                 r_nw            : out std_logic;
95                 dbg_show_pc     : 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                 int_al_we_n : in std_logic;
131                 int_ah_we_n : in std_logic;
132                 int_dl_oe_n : in std_logic;
133                 int_dh_oe_n : in std_logic;
134                 int_al_oe_n : in std_logic;
135                 int_ah_oe_n : in std_logic;
136                 int_dbus    : inout std_logic_vector (dsize - 1 downto 0);
137                 int_abus_l  : out std_logic_vector (dsize - 1 downto 0);
138                 int_abus_h  : out std_logic_vector (dsize - 1 downto 0)
139             );
140     end component;
141
142     component sp
143         generic (
144                 dsize : integer := 8
145                 );
146         port (  
147                 clk         : in std_logic;
148                 we_n        : in std_logic;
149                 push_n      : in std_logic;
150                 pop_n       : in std_logic;
151                 int_d_oe_n  : in std_logic;
152                 int_a_oe_n  : in std_logic;
153                 int_dbus    : inout std_logic_vector (dsize - 1 downto 0);
154                 int_abus_l  : out std_logic_vector (dsize - 1 downto 0);
155                 int_abus_h  : out std_logic_vector (dsize - 1 downto 0)
156             );
157     end component;
158
159     component tsb
160         generic (
161                 dsize : integer := 8
162                 );
163         port (  
164                 oe_n    : in std_logic;
165                 d       : in std_logic_vector (dsize - 1 downto 0);
166                 q       : out std_logic_vector (dsize - 1 downto 0)
167             );
168     end component;
169
170     component processor_status 
171     generic (
172             dsize : integer := 8
173             );
174     port (  
175             clk         : in std_logic;
176             res_n       : in std_logic;
177             dec_we_n    : in std_logic;
178             bus_we_n    : in std_logic;
179             dec_oe_n    : in std_logic;
180             bus_oe_n    : in std_logic;
181             alu_c       : in std_logic;
182             alu_v       : in std_logic;
183             decoder     : inout std_logic_vector (dsize - 1 downto 0);
184             int_dbus    : inout std_logic_vector (dsize - 1 downto 0)
185         );
186     end component;
187
188     component accumulator
189     generic (
190             dsize : integer := 8
191             );
192     port (  
193             clk         : in std_logic;
194             d_we_n      : in std_logic;
195             alu_we_n    : in std_logic;
196             d_oe_n      : in std_logic;
197             alu_oe_n    : in std_logic;
198             int_dbus    : inout std_logic_vector (dsize - 1 downto 0);
199             alu_bus     : inout std_logic_vector (dsize - 1 downto 0)
200         );
201     end component;
202
203     component effective_adder
204     generic (   dsize : integer := 8
205             );
206     port (  
207             clk         : in std_logic;
208             ah_oe_n         : in std_logic;
209             al_oe_n         : in std_logic;
210             base            : in std_logic_vector (dsize - 1 downto 0);
211             index           : in std_logic_vector (dsize - 1 downto 0);
212             ah_bus          : out std_logic_vector (dsize - 1 downto 0);
213             al_bus          : out std_logic_vector (dsize - 1 downto 0);
214             carry           : out std_logic
215     );
216     end component;
217
218     signal set_clk : std_logic;
219     signal trigger_clk : std_logic;
220
221     signal pcl_d_we_n : std_logic;
222     signal pcl_a_we_n : std_logic;
223     signal pcl_d_oe_n : std_logic;
224     signal pcl_a_oe_n : std_logic;
225     signal pch_d_we_n : std_logic;
226     signal pch_a_we_n : std_logic;
227     signal pch_d_oe_n : std_logic;
228     signal pch_a_oe_n : std_logic;
229     signal pc_inc_n : std_logic;
230     signal pc_cry : std_logic;
231     signal pc_cry_n : std_logic;
232     signal dum_terminate : std_logic := 'Z';
233
234     signal inst_we_n : std_logic;
235     signal dbuf_r_nw : std_logic;
236     signal dbuf_int_oe_n : std_logic;
237     signal dl_al_we_n : std_logic;
238     signal dl_ah_we_n : std_logic;
239     signal dl_dl_oe_n : std_logic;
240     signal dl_dh_oe_n : std_logic;
241     signal dl_al_oe_n : std_logic;
242     signal dl_ah_oe_n : std_logic;
243
244     signal sp_we_n : std_logic;
245     signal sp_push_n : std_logic;
246     signal sp_pop_n : std_logic;
247     signal sp_int_d_oe_n : std_logic;
248     signal sp_int_a_oe_n : std_logic;
249
250     signal acc_d_we_n      : std_logic;
251     signal acc_alu_we_n    : std_logic;
252     signal acc_d_oe_n      : std_logic;
253     signal acc_alu_oe_n    : std_logic;
254     signal alu_bus         : std_logic_vector(dsize - 1 downto 0);
255
256     signal x_we_n : std_logic;
257     signal x_oe_n : std_logic;
258     signal x_out : std_logic_vector(dsize - 1 downto 0);
259
260     signal y_we_n : std_logic;
261     signal y_oe_n : std_logic;
262     signal y_out : std_logic_vector(dsize - 1 downto 0);
263
264     signal ea_ah_oe_n : std_logic;
265     signal ea_al_oe_n : std_logic;
266     signal ea_carry : std_logic;
267     signal x_calc_n : std_logic;
268     signal y_calc_n : std_logic;
269
270     signal addr_index : std_logic_vector(dsize - 1 downto 0);
271
272     signal stat_dec_we_n : std_logic;
273     signal stat_dec_oe_n : std_logic;
274     signal stat_bus_we_n : std_logic;
275     signal stat_bus_oe_n : std_logic;
276     signal stat_alu_c : std_logic;
277     signal stat_alu_v : std_logic;
278
279     --internal bus (address hi/lo, data)
280     signal ad_oe_n : std_logic;
281     signal internal_abus_h : std_logic_vector (dsize - 1 downto 0);
282     signal internal_abus_l : std_logic_vector (dsize - 1 downto 0);
283     signal internal_dbus : std_logic_vector (dsize - 1 downto 0);
284
285     signal instruction : std_logic_vector (dsize - 1 downto 0);
286     signal status_reg : std_logic_vector (dsize - 1 downto 0);
287
288     signal dbg_show_pc : std_logic;
289 begin
290
291     ---instances....
292     pc_l : pc generic map (dsize, 16#00#) 
293             port map(trigger_clk, rst_n, 
294                     pcl_d_we_n, pcl_a_we_n, pcl_d_oe_n, pcl_a_oe_n, 
295                     pc_inc_n, '0', pc_cry, internal_dbus, internal_abus_l);
296     pc_h : pc generic map (dsize, 16#80#) 
297             port map(trigger_clk, rst_n, 
298                     pch_d_we_n, pch_a_we_n, pch_d_oe_n, pch_a_oe_n, 
299                     pc_cry_n, pc_cry, dum_terminate, internal_dbus, internal_abus_h);
300
301     dec_inst : decoder generic map (dsize) 
302             port map(set_clk, 
303                     trigger_clk, 
304                     rst_n, 
305                     irq_n, 
306                     nmi_n, 
307                     rdy, 
308                     instruction, 
309                     status_reg, 
310                     ad_oe_n, 
311                     pcl_d_we_n, 
312                     pcl_a_we_n, 
313                     pcl_d_oe_n, 
314                     pcl_a_oe_n,
315                     pch_d_we_n, 
316                     pch_a_we_n, 
317                     pch_d_oe_n, 
318                     pch_a_oe_n,
319                     pc_inc_n, 
320                     inst_we_n, 
321                     dbuf_int_oe_n, 
322                     dl_al_we_n, 
323                     dl_ah_we_n, 
324                     dl_dl_oe_n, 
325                     dl_dh_oe_n, 
326                     dl_al_oe_n, 
327                     dl_ah_oe_n,
328                     sp_we_n, 
329                     sp_push_n, 
330                     sp_pop_n, 
331                     sp_int_d_oe_n, 
332                     sp_int_a_oe_n,
333                     acc_d_we_n,
334                     acc_alu_we_n,
335                     acc_d_oe_n,
336                     acc_alu_oe_n,
337                     x_we_n, 
338                     x_oe_n, 
339                     x_calc_n,
340                     y_we_n, 
341                     y_oe_n, 
342                     y_calc_n,
343                     ea_ah_oe_n,
344                     ea_al_oe_n,
345                     ea_carry,
346                     stat_dec_we_n, 
347                     stat_dec_oe_n, 
348                     stat_bus_we_n, 
349                     stat_bus_oe_n,
350                     dbuf_r_nw,
351                     dbg_show_pc
352                     );
353
354     instruction_register : dff generic map (dsize) 
355             port map(trigger_clk, inst_we_n, '0', d_io, instruction);
356
357     data_bus_buffer : dbus_buf generic map (dsize) 
358             port map(set_clk, dbuf_r_nw, dbuf_int_oe_n, internal_dbus, d_io);
359
360     input_data_latch : input_dl generic map (dsize) 
361             port map(dl_al_we_n, dl_ah_we_n, dl_dl_oe_n, dl_dh_oe_n, 
362                     dl_al_oe_n, dl_ah_oe_n, 
363                     internal_dbus, internal_abus_l, internal_abus_h);
364
365     stack_pointer : sp generic map (dsize) 
366             port map(trigger_clk, sp_we_n, sp_push_n, sp_pop_n, 
367                     sp_int_d_oe_n, sp_int_a_oe_n, 
368                     internal_dbus, internal_abus_l, internal_abus_h);
369
370     status_reg_component : processor_status generic map (dsize) 
371             port map (trigger_clk, rst_n, stat_dec_we_n, stat_bus_we_n, 
372                     stat_dec_oe_n, stat_bus_oe_n, 
373                     stat_alu_c, stat_alu_v, 
374                     status_reg, internal_dbus);
375
376     --x/y output pin is connected to address calcurator
377     x_reg : dff generic map (dsize) 
378             port map(trigger_clk, x_we_n, '0', internal_dbus, x_out);
379     x_buf : tsb generic map (dsize)
380             port map (x_oe_n, x_out, internal_dbus);
381     x_buf_addr : tsb generic map (dsize)
382             port map (x_calc_n, x_out, addr_index);
383
384     y_reg : dff generic map (dsize) 
385             port map(trigger_clk, y_we_n, '0', internal_dbus, y_out);
386     y_buf : tsb generic map (dsize)
387             port map (y_oe_n, y_out, internal_dbus);
388     y_buf_addr : tsb generic map (dsize)
389             port map (y_calc_n, y_out, addr_index);
390
391     ---effective addres calcurator.
392     addr_calc: effective_adder generic map (dsize)
393             port map (trigger_clk, ea_ah_oe_n, ea_al_oe_n,
394                     internal_dbus, addr_index, 
395                     internal_abus_h, internal_abus_l, ea_carry);
396
397     acc_reg : accumulator generic map (dsize) 
398             port map(trigger_clk, 
399                     acc_d_we_n, acc_alu_we_n, acc_d_oe_n, acc_alu_oe_n,
400                     internal_dbus, alu_bus);
401
402     -- clock generate.
403     phi1 <= input_clk;
404     phi2 <= not input_clk;
405     set_clk <= input_clk;
406     trigger_clk <= not input_clk;
407     pc_cry_n <= not pc_cry;
408     r_nw <= dbuf_r_nw;
409
410     --adh output is controlled by decoder.
411     adh_buffer : tsb generic map (dsize)
412             port map (ad_oe_n, internal_abus_h, addr(asize - 1 downto dsize));
413     adl_buffer : tsb generic map (dsize)
414             port map (ad_oe_n, internal_abus_l, addr(dsize - 1 downto 0));
415
416     reset_p : process (rst_n)
417     begin
418         if (rst_n'event and rst_n = '0') then
419
420         end if;
421     end process;
422
423     dbg_p : process (dbg_show_pc)
424 use std.textio.all;
425 use ieee.std_logic_textio.all;
426 use ieee.std_logic_unsigned.conv_integer;
427
428 procedure d_print(msg : string) is
429 variable out_l : line;
430 begin
431     write(out_l, msg);
432     writeline(output, out_l);
433 end  procedure;
434
435 function conv_hex8(ival : integer) return string is
436 variable tmp1, tmp2 : integer;
437 variable hex_chr: string (1 to 16) := "0123456789abcdef";
438 begin
439     tmp2 := (ival mod 16 ** 2) / 16 ** 1;
440     tmp1 := ival mod 16 ** 1;
441     return hex_chr(tmp2 + 1) & hex_chr(tmp1 + 1);
442 end;
443     begin
444         if (dbg_show_pc = '1') then
445             d_print("pc : " & conv_hex8(conv_integer(internal_abus_h)) 
446                     & conv_hex8(conv_integer(internal_abus_l)));
447         end if;
448     end process;
449
450 end rtl;
451