OSDN Git Service

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