OSDN Git Service

nmi instruction validated ok
[motonesfpga/motonesfpga.git] / de1_nes / de1_nes.vhd
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_unsigned.conv_integer;
4
5 --  
6 --   MOTO NES FPGA On GHDL Simulation Environment Virtual Cuicuit Board
7 --   All of the components are assembled and instanciated on this board.
8 --  
9
10 entity de1_nes is 
11     port (
12 --debug signal
13     signal dbg_cpu_clk  : out std_logic;
14     signal dbg_ppu_clk  : out std_logic;
15     signal dbg_mem_clk  : out std_logic;
16     signal dbg_r_nw     : out std_logic;
17     signal dbg_addr     : out std_logic_vector( 16 - 1 downto 0);
18     signal dbg_d_io     : out std_logic_vector( 8 - 1 downto 0);
19     signal dbg_vram_ad  : out std_logic_vector (7 downto 0);
20     signal dbg_vram_a   : out std_logic_vector (13 downto 8);
21
22 ---monitor inside cpu
23     signal dbg_instruction  : out std_logic_vector(7 downto 0);
24     signal dbg_int_d_bus    : out std_logic_vector(7 downto 0);
25     signal dbg_exec_cycle   : out std_logic_vector (5 downto 0);
26     signal dbg_ea_carry     : out std_logic;
27 --    signal dbg_index_bus    : out std_logic_vector(7 downto 0);
28 --    signal dbg_acc_bus      : out std_logic_vector(7 downto 0);
29     signal dbg_status       : out std_logic_vector(7 downto 0);
30 --    signal dbg_pcl, dbg_pch : out std_logic_vector(7 downto 0);
31     signal dbg_sp, dbg_x, dbg_y, dbg_acc       : out std_logic_vector(7 downto 0);
32     signal dbg_dec_oe_n    : out std_logic;
33     signal dbg_dec_val     : out std_logic_vector (7 downto 0);
34     signal dbg_int_dbus    : out std_logic_vector (7 downto 0);
35 --    signal dbg_status_val    : out std_logic_vector (7 downto 0);
36 --    signal dbg_stat_we_n    : out std_logic;
37 --    signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w    : out std_logic_vector (7 downto 0);
38
39 --ppu debug pins
40     signal dbg_ppu_ce_n    : out std_logic;
41     signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
42     signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
43     signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
44     signal dbg_disp_nt, dbg_disp_attr : out std_logic_vector (7 downto 0);
45     signal dbg_disp_ptn_h, dbg_disp_ptn_l : out std_logic_vector (15 downto 0);
46     signal dummy_nmi  : in std_logic;
47     
48     
49 --NES instance
50         base_clk        : in std_logic;
51         rst_n           : in std_logic;
52         joypad1     : in std_logic_vector(7 downto 0);
53         joypad2     : in std_logic_vector(7 downto 0);
54         h_sync_n    : out std_logic;
55         v_sync_n    : out std_logic;
56         r           : out std_logic_vector(3 downto 0);
57         g           : out std_logic_vector(3 downto 0);
58         b           : out std_logic_vector(3 downto 0)
59          );
60 end de1_nes;
61
62 architecture rtl of de1_nes is
63     component mos6502
64         generic (   dsize : integer := 8;
65                     asize : integer :=16
66                 );
67         port (  
68     signal dbg_instruction  : out std_logic_vector(7 downto 0);
69     signal dbg_int_d_bus  : out std_logic_vector(7 downto 0);
70     signal dbg_exec_cycle      : out std_logic_vector (5 downto 0);
71     signal dbg_ea_carry     : out std_logic;
72 --    signal dbg_index_bus    : out std_logic_vector(7 downto 0);
73 --    signal dbg_acc_bus      : out std_logic_vector(7 downto 0);
74     signal dbg_status       : out std_logic_vector(7 downto 0);
75     signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc       : out std_logic_vector(7 downto 0);
76     signal dbg_dec_oe_n    : out std_logic;
77     signal dbg_dec_val     : out std_logic_vector (7 downto 0);
78     signal dbg_int_dbus    : out std_logic_vector (7 downto 0);
79 --    signal dbg_status_val    : out std_logic_vector (7 downto 0);
80     signal dbg_stat_we_n    : out std_logic;
81     signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w    : out std_logic_vector (7 downto 0);
82     
83                 input_clk   : in std_logic; --phi0 input pin.
84                 rdy         : in std_logic;
85                 rst_n       : in std_logic;
86                 irq_n       : in std_logic;
87                 nmi_n       : in std_logic;
88                 dbe         : in std_logic;
89                 r_nw        : out std_logic;
90                 phi1        : out std_logic;
91                 phi2        : out std_logic;
92                 addr        : out std_logic_vector ( asize - 1 downto 0);
93                 d_io        : inout std_logic_vector ( dsize - 1 downto 0)
94         );
95     end component;
96
97     component clock_divider
98         port (  base_clk    : in std_logic;
99                 reset_n     : in std_logic;
100                 cpu_clk     : out std_logic;
101                 ppu_clk     : out std_logic;
102                 mem_clk     : out std_logic;
103                 vga_clk     : out std_logic
104             );
105     end component;
106
107     component address_decoder
108     generic (abus_size : integer := 16; dbus_size : integer := 8);
109         port (  phi2        : in std_logic;
110                 mem_clk     : in std_logic;
111                 R_nW        : in std_logic; 
112                 addr        : in std_logic_vector (abus_size - 1 downto 0);
113                 rom_ce_n    : out std_logic;
114                 ram_ce_n    : out std_logic;
115                 ppu_ce_n    : out std_logic;
116                 apu_ce_n    : out std_logic
117     );
118     end component;
119
120     component ram
121         generic (abus_size : integer := 16; dbus_size : integer := 8);
122         port (  
123                 clk               : in std_logic;
124                 ce_n, oe_n, we_n  : in std_logic;   --select pin active low.
125                 addr              : in std_logic_vector (abus_size - 1 downto 0);
126                 d_io              : inout std_logic_vector (dbus_size - 1 downto 0)
127         );
128     end component;
129
130     component prg_rom
131         generic (abus_size : integer := 15; dbus_size : integer := 8);
132         port (
133                 clk             : in std_logic;
134                 ce_n            : in std_logic;     --active low.
135                 addr            : in std_logic_vector (abus_size - 1 downto 0);
136                 data            : out std_logic_vector (dbus_size - 1 downto 0)
137         );
138     end component;
139
140     component ppu port (
141         signal dbg_ppu_ce_n    : out std_logic;
142         signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
143         signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
144         signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
145
146         signal dbg_ppu_clk                      : out std_logic;
147         signal dbg_nes_x                        : out std_logic_vector (8 downto 0);
148         signal dbg_vga_x                        : out std_logic_vector (9 downto 0);
149         signal dbg_disp_nt, dbg_disp_attr       : out std_logic_vector (7 downto 0);
150         signal dbg_disp_ptn_h, dbg_disp_ptn_l   : out std_logic_vector (15 downto 0);
151         signal dbg_plt_ce_rn_wn                 : out std_logic_vector (2 downto 0);
152         signal dbg_plt_addr                     : out std_logic_vector (4 downto 0);
153         signal dbg_plt_data                     : out std_logic_vector (7 downto 0);
154         signal dbg_p_oam_ce_rn_wn               : out std_logic_vector (2 downto 0);
155         signal dbg_p_oam_addr                   : out std_logic_vector (7 downto 0);
156         signal dbg_p_oam_data                   : out std_logic_vector (7 downto 0);
157         signal dbg_s_oam_ce_rn_wn               : out std_logic_vector (2 downto 0);
158         signal dbg_s_oam_addr                   : out std_logic_vector (4 downto 0);
159         signal dbg_s_oam_data                   : out std_logic_vector (7 downto 0);
160
161         signal dbg_ppu_addr_we_n                : out std_logic;
162         signal dbg_ppu_clk_cnt                  : out std_logic_vector(1 downto 0);
163
164                 ppu_clk     : in std_logic;
165                 mem_clk     : in std_logic;
166                 ce_n        : in std_logic;
167                 rst_n       : in std_logic;
168                 r_nw        : in std_logic;
169                 cpu_addr    : in std_logic_vector (2 downto 0);
170                 cpu_d       : inout std_logic_vector (7 downto 0);
171
172                 vblank_n    : out std_logic;
173                 rd_n        : out std_logic;
174                 wr_n        : out std_logic;
175                 ale         : out std_logic;
176                 vram_ad     : inout std_logic_vector (7 downto 0);
177                 vram_a      : out std_logic_vector (13 downto 8);
178
179                 vga_clk     : in std_logic;
180                 h_sync_n    : out std_logic;
181                 v_sync_n    : out std_logic;
182                 r           : out std_logic_vector(3 downto 0);
183                 g           : out std_logic_vector(3 downto 0);
184                 b           : out std_logic_vector(3 downto 0)
185     );
186     end component;
187
188     component v_address_decoder
189     generic (abus_size : integer := 14; dbus_size : integer := 8);
190         port (  clk         : in std_logic; 
191                 mem_clk     : in std_logic;
192                 rd_n        : in std_logic;
193                 wr_n        : in std_logic;
194                 ale         : in std_logic;
195                 v_addr      : in std_logic_vector (13 downto 0);
196                 v_data      : in std_logic_vector (7 downto 0);
197                 nt_v_mirror : in std_logic;
198                 pt_ce_n     : out std_logic;
199                 nt0_ce_n    : out std_logic;
200                 nt1_ce_n    : out std_logic
201             );
202     end component;
203
204     component chr_rom
205         generic (abus_size : integer := 13; dbus_size : integer := 8);
206         port (  
207                 clk             : in std_logic;
208                 ce_n            : in std_logic;     --active low.
209                 addr            : in std_logic_vector (abus_size - 1 downto 0);
210                 data            : out std_logic_vector (dbus_size - 1 downto 0);
211                 nt_v_mirror     : out std_logic
212         );
213     end component;
214
215     component ls373
216         generic (
217             dsize : integer := 8
218         );
219         port (  c         : in std_logic;
220                 we_n      : in std_logic;
221                 oc_n      : in std_logic;
222                 d         : in std_logic_vector(dsize - 1 downto 0);
223                 q         : out std_logic_vector(dsize - 1 downto 0)
224         );
225     end component;
226
227     component apu
228         port (  clk         : in std_logic;
229                 ce_n        : in std_logic;
230                 rst_n       : in std_logic;
231                 r_nw        : inout std_logic;
232                 cpu_addr    : inout std_logic_vector (15 downto 0);
233                 cpu_d       : inout std_logic_vector (7 downto 0);
234                 rdy         : out std_logic
235         );
236     end component;
237
238     constant data_size : integer := 8;
239     constant addr_size : integer := 16;
240     constant vram_size14    : integer := 14;
241
242     constant ram_2k : integer := 11;      --2k = 11 bit width.
243     constant rom_32k : integer := 15;     --32k = 15 bit width.
244     constant rom_8k : integer := 13;     --8k = 13 bit width. (for test use)
245     constant vram_1k : integer := 10;      --1k = 10 bit width.
246     constant chr_rom_8k : integer := 13;     --32k = 15 bit width.
247
248     signal cpu_clk  : std_logic;
249     signal ppu_clk  : std_logic;
250     signal mem_clk  : std_logic;
251     signal vga_clk   : std_logic;
252
253     signal rdy, irq_n, nmi_n, dbe, r_nw : std_logic;
254     signal phi1, phi2 : std_logic;
255     signal addr : std_logic_vector( addr_size - 1 downto 0);
256     signal d_io : std_logic_vector( data_size - 1 downto 0);
257
258     signal rom_ce_n : std_logic;
259     signal ram_ce_n : std_logic;
260     signal ram_oe_n : std_logic;
261     signal ppu_ce_n : std_logic;
262     signal apu_ce_n : std_logic;
263
264     signal rd_n     : std_logic;
265     signal wr_n     : std_logic;
266     signal ale      : std_logic;
267     signal vram_ad  : std_logic_vector (7 downto 0);
268     signal vram_a   : std_logic_vector (13 downto 8);
269     signal v_addr   : std_logic_vector (13 downto 0);
270     signal nt_v_mirror  : std_logic;
271     signal pt_ce_n  : std_logic;
272     signal nt0_ce_n : std_logic;
273     signal nt1_ce_n : std_logic;
274
275     signal ale_n       : std_logic;
276
277 --    signal dbg_disp_nt, dbg_disp_attr : std_logic_vector (7 downto 0);
278 --    signal dbg_disp_ptn_h, dbg_disp_ptn_l : std_logic_vector (15 downto 0);
279     signal dbg_pcl, dbg_pch : std_logic_vector(7 downto 0);
280     signal dbg_stat_we_n    : std_logic;
281     signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w    : std_logic_vector (7 downto 0);
282
283     signal dbg_ppu_addr_we_n                : std_logic;
284     signal dbg_ppu_clk_cnt                  : std_logic_vector(1 downto 0);
285     signal dbg_ppu_addr_dummy               : std_logic_vector (13 downto 0);
286     signal dbg_nes_x                        : std_logic_vector (8 downto 0);
287     signal dbg_vga_x                        : std_logic_vector (9 downto 0);
288     signal dbg_plt_ce_rn_wn                 : std_logic_vector (2 downto 0);
289     signal dbg_plt_addr                     : std_logic_vector (4 downto 0);
290     signal dbg_plt_data                     : std_logic_vector (7 downto 0);
291     signal dbg_p_oam_ce_rn_wn               : std_logic_vector (2 downto 0);
292     signal dbg_p_oam_addr                   : std_logic_vector (7 downto 0);
293     signal dbg_p_oam_data                   : std_logic_vector (7 downto 0);
294     signal dbg_s_oam_ce_rn_wn               : std_logic_vector (2 downto 0);
295     signal dbg_s_oam_addr                   : std_logic_vector (4 downto 0);
296     signal dbg_s_oam_data                   : std_logic_vector (7 downto 0);
297     signal dbg_ppu_data_dummy               : std_logic_vector (7 downto 0);
298     signal dbg_ppu_status_dummy             : std_logic_vector (7 downto 0);
299     signal dbg_ppu_scrl_x_dummy             : std_logic_vector (7 downto 0);
300     signal dbg_ppu_scrl_y_dummy             : std_logic_vector (7 downto 0);
301     signal dbg_disp_ptn_h_dummy, dbg_disp_ptn_l_dummy   : std_logic_vector (15 downto 0);
302
303 begin
304
305     irq_n <= '0';
306
307     --ppu/cpu clock generator
308     clock_inst : clock_divider port map 
309         (base_clk, rst_n, cpu_clk, ppu_clk, mem_clk, vga_clk);
310
311     --mos 6502 cpu instance
312     cpu_inst : mos6502 generic map (data_size, addr_size) 
313         port map (
314     dbg_instruction,
315     dbg_int_d_bus,
316     dbg_exec_cycle,
317     dbg_ea_carry,
318  --   dbg_index_bus,
319  --   dbg_acc_bus,
320     dbg_status,
321     dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc,
322     dbg_dec_oe_n,
323     dbg_dec_val,
324     dbg_int_dbus,
325 --    dbg_status_val    ,
326     dbg_stat_we_n    ,
327     dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w,
328
329                 cpu_clk, '1', --rdy, -----for testing...
330                 rst_n, irq_n, nmi_n, dbe, r_nw, 
331                 phi1, phi2, addr, d_io);
332
333     addr_dec_inst : address_decoder generic map (addr_size, data_size) 
334         port map (phi2, mem_clk, r_nw, addr, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
335
336     --main ROM/RAM instance
337 --    prg_rom_inst : prg_rom generic map (rom_32k, data_size)
338 --            port map (mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);
339
340     prg_rom_inst : prg_rom generic map (rom_8k, data_size)
341             port map (mem_clk, rom_ce_n, addr(rom_8k - 1 downto 0), d_io);
342
343     ram_oe_n <= not R_nW;
344     prg_ram_inst : ram generic map (ram_2k, data_size)
345             port map (mem_clk, ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
346
347 --    dbg_ppu_addr <= "00000" & dbg_nes_x;
348     dbg_ppu_scrl_x(0) <= ale;
349     dbg_ppu_scrl_x(1) <= rd_n;
350     dbg_ppu_scrl_x(2) <= wr_n;
351     dbg_ppu_scrl_x(3) <= nt0_ce_n;
352     dbg_ppu_scrl_x(4) <= vga_clk;
353     dbg_ppu_scrl_x(5) <= rom_ce_n;
354     dbg_ppu_scrl_x(6) <= ram_ce_n;
355     dbg_ppu_scrl_x(7) <= addr(15);
356     dbg_ppu_scrl_y(2 downto 0) <= dbg_p_oam_ce_rn_wn(2 downto 0);
357     dbg_ppu_scrl_y(5 downto 3) <= dbg_plt_ce_rn_wn(2 downto 0);
358 --    dbg_disp_ptn_l (7 downto 0) <= dbg_p_oam_addr;
359 --    dbg_disp_ptn_l (15 downto 8) <= dbg_p_oam_data;
360
361     dbg_cpu_clk <= cpu_clk;
362     dbg_mem_clk <= mem_clk;
363     dbg_r_nw <= r_nw;
364     dbg_addr <= addr;
365     dbg_d_io <= d_io;
366     dbg_vram_ad  <= vram_ad ;
367     dbg_disp_ptn_l <= "00" & v_addr ;
368     dbg_disp_ptn_h <= "000" & dbg_plt_addr & dbg_plt_data;
369 --    nmi_n <= dummy_nmi;
370 --    dbg_ppu_ctrl <= dbg_pcl;
371 --    dbg_ppu_mask <= dbg_pch;
372     --nes ppu instance
373     ppu_inst: ppu port map (  
374         dbg_ppu_ce_n                                        ,
375         dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status          ,
376         dbg_ppu_addr                                        ,
377         dbg_ppu_data, dbg_ppu_scrl_x_dummy, dbg_ppu_scrl_y_dummy        ,
378
379         dbg_ppu_clk                      ,
380         dbg_nes_x                        ,
381         dbg_vga_x                        ,
382         dbg_disp_nt, dbg_disp_attr                          ,
383         dbg_disp_ptn_h_dummy, dbg_disp_ptn_l_dummy                      ,
384         dbg_plt_ce_rn_wn                 ,
385         dbg_plt_addr                     ,
386         dbg_plt_data                     ,
387         dbg_p_oam_ce_rn_wn              ,
388         dbg_p_oam_addr                  ,
389         dbg_p_oam_data                  ,
390         dbg_s_oam_ce_rn_wn              ,
391         dbg_s_oam_addr                  ,
392         dbg_s_oam_data                  ,
393         dbg_ppu_addr_we_n                                   ,
394         dbg_ppu_clk_cnt                                     ,
395
396                 ppu_clk         ,
397                 mem_clk     ,
398                 ppu_ce_n        ,
399                 rst_n       ,
400                 r_nw        ,
401                 addr(2 downto 0)    ,
402                 d_io       ,
403
404                 nmi_n    ,
405                 rd_n        ,
406                 wr_n        ,
407                 ale         ,
408                 vram_ad     ,
409                 vram_a      ,
410
411                 vga_clk     ,
412                 h_sync_n    ,
413                 v_sync_n    ,
414                 r           ,
415                 g           ,
416                 b           
417
418         );
419
420     ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size) 
421         port map (ppu_clk, mem_clk, rd_n, wr_n, ale, v_addr, vram_ad, 
422                 nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);
423
424     ---VRAM/CHR ROM instances
425     v_addr (13 downto 8) <= vram_a;
426
427     --transparent d-latch
428         ale_n <= not ale;
429         vram_latch : ls373 generic map (data_size)
430                 port map(vga_clk, ale_n, ale, vram_ad, v_addr(7 downto 0));
431
432     vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
433             port map (mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), vram_ad, nt_v_mirror);
434
435     --name table/attr table
436     vram_nt0 : ram generic map (vram_1k, data_size)
437             port map (mem_clk, nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
438
439     vram_nt1 : ram generic map (vram_1k, data_size)
440             port map (mem_clk, nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
441
442 --    --APU/DMA instance
443 --    apu_inst : apu
444 --        port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
445
446 end rtl;
447