OSDN Git Service

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