OSDN Git Service

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