OSDN Git Service

code re-write 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     ----------------------------------------------
25     ------------ decoder declaration -------------
26     ----------------------------------------------
27 component decoder
28     generic (dsize : integer := 8);
29     port (  set_clk         : in std_logic;
30             trig_clk        : in std_logic;
31             res_n           : in std_logic;
32             irq_n           : in std_logic;
33             nmi_n           : in std_logic;
34             rdy             : in std_logic;
35             instruction     : in std_logic_vector (dsize - 1 downto 0);
36             exec_cycle      : in std_logic_vector (5 downto 0);
37             next_cycle      : out std_logic_vector (5 downto 0);
38             status_reg      : inout std_logic_vector (dsize - 1 downto 0);
39             inst_we_n       : out std_logic;
40             ad_oe_n         : out std_logic;
41             dbuf_int_oe_n   : out std_logic;
42             pc_inc_n        : out std_logic;
43             pcl_cmd         : out std_logic_vector(3 downto 0);
44             pch_cmd         : out std_logic_vector(3 downto 0);
45             sp_cmd          : out std_logic_vector(3 downto 0);
46             acc_cmd         : out std_logic_vector(3 downto 0);
47             x_cmd           : out std_logic_vector(3 downto 0);
48             y_cmd           : out std_logic_vector(3 downto 0);
49             r_nw            : out std_logic
50             ;---for parameter check purpose!!!
51             check_bit     : out std_logic_vector(1 to 5)
52         );
53 end component;
54
55 component alu
56     generic (   dsize : integer := 8
57             );
58     port (  clk             : in std_logic;
59             pc_inc_n        : in std_logic;
60             abs_ea_n        : in std_logic;
61             zp_ea_n         : in std_logic;
62             arith_en_n      : in std_logic;
63             instruction     : in std_logic_vector (dsize - 1 downto 0);
64             int_d_bus       : inout std_logic_vector (dsize - 1 downto 0);
65             acc_out         : in std_logic_vector (dsize - 1 downto 0);
66             acc_in          : out std_logic_vector (dsize - 1 downto 0);
67             index_bus       : in std_logic_vector (dsize - 1 downto 0);
68             bal             : in std_logic_vector (dsize - 1 downto 0);
69             bah             : in std_logic_vector (dsize - 1 downto 0);
70             abl             : out std_logic_vector (dsize - 1 downto 0);
71             abh             : out std_logic_vector (dsize - 1 downto 0);
72             pcl             : out std_logic_vector (dsize - 1 downto 0);
73             pch             : out std_logic_vector (dsize - 1 downto 0);
74             carry_in        : in std_logic;
75             negative        : out std_logic;
76             zero            : out std_logic;
77             carry_out       : out std_logic;
78             overflow        : out std_logic
79     );
80 end component;
81
82     ----------------------------------------------
83     ------------ register declaration ------------
84     ----------------------------------------------
85 component d_flip_flop
86     generic (
87             dsize : integer := 8
88             );
89     port (  
90             clk     : in std_logic;
91             res_n   : in std_logic;
92             set_n   : in std_logic;
93             we_n    : in std_logic;
94             d       : in std_logic_vector (dsize - 1 downto 0);
95             q       : out std_logic_vector (dsize - 1 downto 0)
96         );
97 end component;
98
99 component dual_dff
100     generic (
101             dsize : integer := 8
102             );
103     port (  
104             clk             : in std_logic;
105             res_n           : in std_logic;
106             set_n           : in std_logic;
107             gate_cmd        : in std_logic_vector (3 downto 0);
108             front_port      : inout std_logic_vector (dsize - 1 downto 0);
109             back_in_port    : in std_logic_vector (dsize - 1 downto 0);
110             back_out_port   : out std_logic_vector (dsize - 1 downto 0)
111         );
112 end component;
113
114 component data_bus_buffer
115     generic (
116             dsize : integer := 8
117             );
118     port (  
119             clk         : in std_logic;
120             r_nw        : in std_logic;
121             int_oe_n    : in std_logic;
122             int_dbus : inout std_logic_vector (dsize - 1 downto 0);
123             ext_dbus : inout std_logic_vector (dsize - 1 downto 0)
124         );
125 end component;
126
127 component input_data_latch
128     generic (
129             dsize : integer := 8
130             );
131     port (  
132             clk         : in std_logic;
133             oe_n        : in std_logic;
134             we_n        : in std_logic;
135             int_dbus    : in std_logic_vector (dsize - 1 downto 0);
136             alu_bus     : out std_logic_vector (dsize - 1 downto 0)
137         );
138 end component;
139
140 component tri_state_buffer
141     generic (
142             dsize : integer := 8
143             );
144     port (  
145             oe_n    : in std_logic;
146             d       : in std_logic_vector (dsize - 1 downto 0);
147             q       : out std_logic_vector (dsize - 1 downto 0)
148         );
149 end component;
150
151     ----------------------------------------------
152     ------------ signal declareration ------------
153     ----------------------------------------------
154     signal set_clk : std_logic;
155     signal trigger_clk : std_logic;
156
157     signal exec_cycle : std_logic_vector(5 downto 0);
158     signal next_cycle : std_logic_vector(5 downto 0);
159     signal status_reg : std_logic_vector (dsize - 1 downto 0);
160
161     -------------------------------
162     -------- control lines --------
163     -------------------------------
164     signal inst_we_n : std_logic;
165     signal ad_oe_n : std_logic;
166
167     signal dbuf_r_nw : std_logic;
168     signal dbuf_int_oe_n : std_logic;
169
170     signal dl_al_we_n : std_logic;
171     signal dl_ah_we_n : std_logic;
172     signal dl_al_oe_n : std_logic;
173     signal dl_ah_oe_n : std_logic;
174
175     signal pc_inc_n : std_logic;
176     signal abs_ea_n : std_logic;
177     signal zp_ea_n : std_logic;
178     signal arith_en_n : std_logic;
179                     
180     signal alu_n : std_logic;
181     signal alu_z : std_logic;
182     signal alu_c_in : std_logic;
183     signal alu_c : std_logic;
184     signal alu_v : std_logic;
185
186     ----control line for dual port registers.
187     signal pcl_cmd : std_logic_vector(3 downto 0);
188     signal pch_cmd : std_logic_vector(3 downto 0);
189     signal sp_cmd : std_logic_vector(3 downto 0);
190     signal acc_cmd : std_logic_vector(3 downto 0);
191     signal x_cmd : std_logic_vector(3 downto 0);
192     signal y_cmd : std_logic_vector(3 downto 0);
193
194     -------------------------------
195     ------------ buses ------------
196     -------------------------------
197     signal instruction : std_logic_vector(dsize - 1 downto 0);
198     
199     signal bah : std_logic_vector(dsize - 1 downto 0);
200     signal bal : std_logic_vector(dsize - 1 downto 0);
201     signal index_bus : std_logic_vector(dsize - 1 downto 0);
202
203     signal acc_in : std_logic_vector(dsize - 1 downto 0);
204     signal acc_out : std_logic_vector(dsize - 1 downto 0);
205
206     signal pcl_in : std_logic_vector(dsize - 1 downto 0);
207     signal pch_in : std_logic_vector(dsize - 1 downto 0);
208     signal pcl_back : std_logic_vector(dsize - 1 downto 0);
209     signal pch_back : std_logic_vector(dsize - 1 downto 0);
210
211     --not used bus.
212     signal null_bus : std_logic_vector(dsize - 1 downto 0);
213
214     --address bus
215     signal abh : std_logic_vector(dsize - 1 downto 0);
216     signal abl : std_logic_vector(dsize - 1 downto 0);
217
218     ---internal data bus
219     signal d_bus : std_logic_vector(dsize - 1 downto 0);
220
221     ---reset vectors---
222     signal reset_l : std_logic_vector(dsize - 1 downto 0);
223     signal reset_h : std_logic_vector(dsize - 1 downto 0);
224     signal nmi_l : std_logic_vector(dsize - 1 downto 0);
225     signal nmi_h : std_logic_vector(dsize - 1 downto 0);
226     signal irq_l : std_logic_vector(dsize - 1 downto 0);
227     signal irq_h : std_logic_vector(dsize - 1 downto 0);
228
229     signal check_bit     : std_logic_vector(1 to 5);
230
231 begin
232
233
234     -- clock generate.
235     phi1 <= input_clk;
236     phi2 <= not input_clk;
237     set_clk <= input_clk;
238     trigger_clk <= not input_clk;
239
240     r_nw <= dbuf_r_nw;
241     reset_l <= "00000000";
242     reset_h <= "10000000";
243
244
245     --------------------------------------------------
246     ------------------- instances --------------------
247     --------------------------------------------------
248
249     dec_inst : decoder generic map (dsize) 
250             port map(set_clk, 
251                     trigger_clk, 
252                     rst_n, 
253                     irq_n, 
254                     nmi_n, 
255                     rdy, 
256                     instruction, 
257                     exec_cycle,
258                     next_cycle,
259                     status_reg, 
260                     inst_we_n, 
261                     ad_oe_n, 
262                     dbuf_int_oe_n,
263                     pc_inc_n,
264                     pcl_cmd,
265                     pch_cmd,
266                     sp_cmd,
267                     acc_cmd,
268                     x_cmd,
269                     y_cmd,
270                     dbuf_r_nw
271                     , check_bit --check bit.
272                     );
273
274     alu_inst : alu generic map (dsize) 
275             port map (trigger_clk, 
276                     pc_inc_n,
277                     abs_ea_n,
278                     zp_ea_n,
279                     arith_en_n,
280                     instruction,
281                     d_bus,
282                     acc_out,
283                     acc_in,
284                     index_bus,
285                     bal,
286                     bah,
287                     abl,
288                     abh,
289                     pcl_back,
290                     pch_back,
291                     alu_c_in,
292                     alu_n,
293                     alu_z,
294                     alu_c,
295                     alu_v 
296                     );
297
298     --cpu execution cycle number
299     exec_cycle_inst : d_flip_flop generic map (6) 
300             port map(trigger_clk, '1', '1', '0', next_cycle, exec_cycle);
301
302     --io data buffer
303     dbus_buf : data_bus_buffer generic map (dsize) 
304             port map(set_clk, dbuf_r_nw, dbuf_int_oe_n, d_bus, d_io);
305
306     --address operand data buffer.
307     idl_l : input_data_latch generic map (dsize) 
308             port map(set_clk, dl_al_oe_n, dl_al_we_n, bal, d_bus);
309     idl_h : input_data_latch generic map (dsize) 
310             port map(set_clk, dl_ah_oe_n, dl_ah_we_n, bah, d_bus);
311
312     -------- registers --------
313     ir : d_flip_flop generic map (dsize) 
314             port map(trigger_clk, '1', '1', inst_we_n, d_io, instruction);
315
316     pc_l : dual_dff generic map (dsize) 
317             port map(trigger_clk, '1', rst_n, pcl_cmd, pcl_in, pcl_back, bal);
318     pc_h : dual_dff generic map (dsize) 
319             port map(trigger_clk, '1', rst_n, pch_cmd, pch_in, pch_back, bah);
320
321     sp : dual_dff generic map (dsize) 
322             port map(trigger_clk, rst_n, '1', sp_cmd, d_bus, abl, bal);
323
324     x : dual_dff generic map (dsize) 
325             port map(trigger_clk, rst_n, '1', x_cmd, d_bus, null_bus, index_bus);
326     y : dual_dff generic map (dsize) 
327             port map(trigger_clk, rst_n, '1', y_cmd, d_bus, null_bus, index_bus);
328
329     acc : dual_dff generic map (dsize) 
330             port map(trigger_clk, rst_n, '1', acc_cmd, d_bus, acc_in, acc_out);
331
332     --adh output is controlled by decoder.
333     adh_buf : tri_state_buffer generic map (dsize)
334             port map (ad_oe_n, abh, addr(asize - 1 downto dsize));
335     adl_buf : tri_state_buffer generic map (dsize)
336             port map (ad_oe_n, abl, addr(dsize - 1 downto 0));
337
338     null_bus <= (others => 'Z');
339
340
341     reset_p : process (rst_n)
342     begin
343         if (rst_n = '0') then
344             --reset vector set to pc.
345             pcl_in <= reset_l ;
346             pch_in <= reset_h ;
347         else
348             pcl_in <= d_bus;
349             pch_in <= d_bus;
350         end if;
351     end process;
352
353
354 ------------------------------------------------------------
355 ------------------------ for debug... ----------------------
356 ------------------------------------------------------------
357
358     dbg_p : process (set_clk)
359 use std.textio.all;
360 use ieee.std_logic_textio.all;
361 use ieee.std_logic_unsigned.conv_integer;
362
363 procedure d_print(msg : string) is
364 variable out_l : line;
365 begin
366     write(out_l, msg);
367     writeline(output, out_l);
368 end  procedure;
369
370 function conv_hex8(ival : integer) return string is
371 variable tmp1, tmp2 : integer;
372 variable hex_chr: string (1 to 16) := "0123456789abcdef";
373 begin
374     tmp2 := (ival mod 16 ** 2) / 16 ** 1;
375     tmp1 := ival mod 16 ** 1;
376     return hex_chr(tmp2 + 1) & hex_chr(tmp1 + 1);
377 end;
378     begin
379         if (set_clk = '0' and exec_cycle = "000000") then
380             --show pc on the T0 (fetch) cycle.
381             d_print("pc : " & conv_hex8(conv_integer(abh)) 
382                     & conv_hex8(conv_integer(abl)));
383         end if;
384     end process;
385
386 end rtl;
387