OSDN Git Service

d84e4fb0daeb48be1cc90b2c3ffbe40065db461f
[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 DE0-CV 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 (\r
12 --logic analyzer reference clock
13     signal dbg_base_clk: out std_logic;\r
14     
15 --NES instance
16         pi_base_clk     : in std_logic;
17         pi_rst_n        : in std_logic;
18         pi_joypad1     : in std_logic_vector(7 downto 0);
19         pi_joypad2     : in std_logic_vector(7 downto 0);
20         po_h_sync_n    : out std_logic;
21         po_v_sync_n    : out std_logic;
22         po_r           : out std_logic_vector(3 downto 0);
23         po_g           : out std_logic_vector(3 downto 0);
24         po_b           : out std_logic_vector(3 downto 0);
25         pi_nt_v_mirror : in std_logic;\r
26         \r
27         --for debugging..\r
28         po_dbg_cnt     : out std_logic_vector (63 downto 0);\r
29         po_exc_cnt     : out std_logic_vector (63 downto 0)\r
30          );
31 end de0_cv_nes;
32
33 architecture rtl of de0_cv_nes is
34     component mos6502
35         port (
36                 pi_rst_n       : in std_logic;\r
37                 pi_base_clk    : in std_logic;\r
38                 pi_cpu_en      : in std_logic_vector (7 downto 0);\r
39                 pi_rdy         : in std_logic;\r
40                 pi_irq_n       : in std_logic;\r
41                 pi_nmi_n       : in std_logic;\r
42                 po_oe_n        : out std_logic;\r
43                 po_we_n        : out std_logic;\r
44                 po_addr        : out std_logic_vector (15 downto 0);\r
45                 pio_d_io       : inout std_logic_vector (7 downto 0);\r
46                 po_exc_cnt     : out std_logic_vector (63 downto 0)\r
47         );
48     end component;
49
50     component clock_selector\r
51         port (\r
52                 pi_rst_n        : in std_logic;\r
53                 pi_base_clk     : in std_logic;\r
54                 po_cpu_en       : out std_logic_vector (7 downto 0);\r
55                 po_rnd_en       : out std_logic_vector (3 downto 0)\r
56             );\r
57     end component;\r
58 \r
59     component chip_selector\r
60         port (\r
61                 pi_rst_n        : in std_logic;\r
62                 pi_base_clk     : in std_logic;\r
63                 pi_addr         : in std_logic_vector (15 downto 0);\r
64                 po_rom_ce_n     : out std_logic;\r
65                 po_ram_ce_n     : out std_logic;\r
66                 po_ppu_ce_n     : out std_logic;\r
67                 po_apu_ce_n     : out std_logic\r
68             );\r
69     end component;\r
70 \r
71     component prg_rom port (\r
72                 pi_base_clk     : in std_logic;\r
73                 pi_ce_n         : in std_logic;\r
74                 pi_oe_n         : in std_logic;\r
75                 pi_addr         : in std_logic_vector (14 downto 0);\r
76                 po_data         : out std_logic_vector (7 downto 0)\r
77             );\r
78     end component;\r
79 \r
80     component ppu port (
81                 pi_rst_n       : in std_logic;\r
82                 pi_base_clk    : in std_logic;
83                 pi_cpu_en      : in std_logic_vector (7 downto 0);\r
84                 pi_ce_n        : in std_logic;
85                 pi_oe_n        : in std_logic;\r
86                 pi_we_n        : in std_logic;\r
87                 pi_cpu_addr    : in std_logic_vector (2 downto 0);
88                 pio_cpu_d      : inout std_logic_vector (7 downto 0);\r
89                 po_vblank_n    : out std_logic;\r
90
91                 po_v_ce_n       : out std_logic;\r
92                 po_v_rd_n       : out std_logic;\r
93                 po_v_wr_n       : out std_logic;\r
94                 po_v_addr       : out std_logic_vector (13 downto 0);\r
95                 pio_v_data      : inout std_logic_vector (7 downto 0);\r
96 \r
97                 po_plt_ce_n     : out std_logic;\r
98                 po_plt_rd_n     : out std_logic;\r
99                 po_plt_wr_n     : out std_logic;\r
100                 po_plt_addr     : out std_logic_vector (4 downto 0);\r
101                 pio_plt_data    : inout std_logic_vector (7 downto 0);\r
102 \r
103                 po_spr_ce_n     : out std_logic;\r
104                 po_spr_rd_n     : out std_logic;\r
105                 po_spr_wr_n     : out std_logic;\r
106                 po_spr_addr     : out std_logic_vector (7 downto 0);\r
107                 po_spr_data     : out std_logic_vector (7 downto 0);\r
108 \r
109                 po_ppu_ctrl        : out std_logic_vector (7 downto 0);\r
110                 po_ppu_mask        : out std_logic_vector (7 downto 0);\r
111                 pi_ppu_status      : in std_logic_vector (7 downto 0);\r
112                 po_ppu_scroll_x    : out std_logic_vector (7 downto 0);\r
113                 po_ppu_scroll_y    : out std_logic_vector (7 downto 0)\r
114     );
115     end component;
116
117     component ram\r
118         generic (abus_size : integer := 16; dbus_size : integer := 8; debug_mem : string := "null-file.bin");\r
119         port (\r
120                 pi_base_clk     : in std_logic;\r
121                 pi_ce_n         : in std_logic;\r
122                 pi_oe_n         : in std_logic;\r
123                 pi_we_n         : in std_logic;\r
124                 pi_addr         : in std_logic_vector (abus_size - 1 downto 0);\r
125                 pio_d_io        : inout std_logic_vector (dbus_size - 1 downto 0)\r
126             );\r
127     end component;\r
128 \r
129     component palette_ram\r
130         port (\r
131                 pi_base_clk     : in std_logic;\r
132                 pi_ce_n         : in std_logic;\r
133                 pi_oe_n         : in std_logic;\r
134                 pi_we_n         : in std_logic;\r
135                 pi_addr         : in std_logic_vector (4 downto 0);\r
136                 pio_d_io        : inout std_logic_vector (7 downto 0)\r
137             );\r
138     end component;\r
139 \r
140     component chr_rom\r
141         port (  \r
142                 pi_base_clk     : in std_logic;\r
143                 pi_ce_n         : in std_logic;\r
144                 pi_oe_n         : in std_logic;\r
145                 pi_addr         : in std_logic_vector (12 downto 0);\r
146                 po_data         : out std_logic_vector (7 downto 0)\r
147             );\r
148     end component;\r
149 \r
150     component v_chip_selector\r
151         port (\r
152                     pi_rst_n        : in std_logic;\r
153                     pi_base_clk     : in std_logic;\r
154                     pi_v_ce_n       : in std_logic;\r
155                     pi_v_addr       : in std_logic_vector (13 downto 0);\r
156                     pi_nt_v_mirror  : in std_logic;\r
157                     po_pt_ce_n      : out std_logic;\r
158                     po_nt0_ce_n     : out std_logic;\r
159                     po_nt1_ce_n     : out std_logic\r
160             );\r
161     end component;\r
162 \r
163     component render\r
164         port (\r
165             pi_rst_n       : in std_logic;\r
166             pi_base_clk    : in std_logic;\r
167             pi_rnd_en      : in std_logic_vector (3 downto 0);\r
168 \r
169             --ppu i/f\r
170             pi_ppu_ctrl        : in std_logic_vector (7 downto 0);\r
171             pi_ppu_mask        : in std_logic_vector (7 downto 0);\r
172             po_ppu_status      : out std_logic_vector (7 downto 0);\r
173             pi_ppu_scroll_x    : in std_logic_vector (7 downto 0);\r
174             pi_ppu_scroll_y    : in std_logic_vector (7 downto 0);\r
175 \r
176             --vram i/f\r
177             po_v_ce_n       : out std_logic;\r
178             po_v_rd_n       : out std_logic;\r
179             po_v_wr_n       : out std_logic;\r
180             po_v_addr       : out std_logic_vector (13 downto 0);\r
181             pi_v_data       : in std_logic_vector (7 downto 0);\r
182 \r
183             --plt i/f\r
184             po_plt_ce_n     : out std_logic;\r
185             po_plt_rd_n     : out std_logic;\r
186             po_plt_wr_n     : out std_logic;\r
187             po_plt_addr     : out std_logic_vector (4 downto 0);\r
188             pi_plt_data     : in std_logic_vector (7 downto 0);\r
189 \r
190             --sprite i/f\r
191             po_spr_ce_n     : out std_logic;\r
192             po_spr_rd_n     : out std_logic;\r
193             po_spr_wr_n     : out std_logic;\r
194             po_spr_addr     : out std_logic_vector (7 downto 0);\r
195             pi_spr_data     : in std_logic_vector (7 downto 0);\r
196 \r
197             --vga output\r
198             po_h_sync_n    : out std_logic;\r
199             po_v_sync_n    : out std_logic;\r
200             po_r           : out std_logic_vector(3 downto 0);\r
201             po_g           : out std_logic_vector(3 downto 0);\r
202             po_b           : out std_logic_vector(3 downto 0)\r
203             );\r
204     end component;\r
205 \r
206     component apu\r
207         port (\r
208             pi_rst_n       : in std_logic;\r
209             pi_base_clk    : in std_logic;\r
210             pi_cpu_en      : in std_logic_vector (7 downto 0);\r
211             pi_rnd_en      : in std_logic_vector (3 downto 0);\r
212             pi_ce_n        : in std_logic;\r
213 \r
214             --cpu i/f\r
215             pio_oe_n       : inout std_logic;\r
216             pio_we_n       : inout std_logic;\r
217             pio_cpu_addr   : inout std_logic_vector (15 downto 0);\r
218             pio_cpu_d      : inout std_logic_vector (7 downto 0);\r
219             po_rdy         : out std_logic;\r
220 \r
221             --sprite i/f\r
222             po_spr_ce_n    : out std_logic;\r
223             po_spr_rd_n    : out std_logic;\r
224             po_spr_wr_n    : out std_logic;\r
225             po_spr_addr    : out std_logic_vector (7 downto 0);\r
226             po_spr_data    : out std_logic_vector (7 downto 0)\r
227         );\r
228     end component;\r
229 \r
230 constant ram_2k     : integer := 11;    --2k = 11   bit width.\r
231 constant rom_32k    : integer := 15;    --32k = 15  bit width.\r
232 constant vram_1k    : integer := 10;    --1k = 10   bit width.\r
233 \r
234 signal wr_cpu_en       : std_logic_vector (7 downto 0);\r
235 signal wr_rnd_en       : std_logic_vector (3 downto 0);\r
236 \r
237 signal wr_rdy       : std_logic;\r
238 signal wr_irq_n     : std_logic;\r
239 signal wr_nmi_n     : std_logic;\r
240 signal wr_oe_n      : std_logic;\r
241 signal wr_we_n      : std_logic;\r
242 \r
243 signal wr_addr      : std_logic_vector ( 15 downto 0);\r
244 signal wr_d_io      : std_logic_vector ( 7 downto 0);\r
245 \r
246 signal wr_rom_ce_n     : std_logic;\r
247 signal wr_ram_ce_n     : std_logic;\r
248 signal wr_ppu_ce_n     : std_logic;\r
249 signal wr_apu_ce_n     : std_logic;\r
250 \r
251 signal wr_v_ce_n        : std_logic;\r
252 signal wr_v_rd_n        : std_logic;\r
253 signal wr_v_wr_n        : std_logic;\r
254 signal wr_v_addr        : std_logic_vector (13 downto 0);\r
255 signal wr_v_data        : std_logic_vector (7 downto 0);\r
256 \r
257 signal wr_plt_ce_n      : std_logic;\r
258 signal wr_plt_rd_n      : std_logic;\r
259 signal wr_plt_wr_n      : std_logic;\r
260 signal wr_plt_addr      : std_logic_vector (4 downto 0);\r
261 signal wr_plt_data      : std_logic_vector (7 downto 0);\r
262 \r
263 signal wr_spr_ce_n      : std_logic;\r
264 signal wr_spr_rd_n      : std_logic;\r
265 signal wr_spr_wr_n      : std_logic;\r
266 signal wr_spr_addr      : std_logic_vector (7 downto 0);\r
267 signal wr_spr_data      : std_logic_vector (7 downto 0);\r
268 \r
269 signal wr_pt_ce_n       : std_logic;\r
270 signal wr_nt0_ce_n      : std_logic;\r
271 signal wr_nt1_ce_n      : std_logic;\r
272 \r
273 signal wr_ppu_ctrl          : std_logic_vector (7 downto 0);\r
274 signal wr_ppu_mask          : std_logic_vector (7 downto 0);\r
275 signal wr_ppu_status        : std_logic_vector (7 downto 0);\r
276 signal wr_ppu_scroll_x      : std_logic_vector (7 downto 0);\r
277 signal wr_ppu_scroll_y      : std_logic_vector (7 downto 0);\r
278 \r
279 signal reg_dbg_cnt          : std_logic_vector (63 downto 0);\r
280 \r
281 begin
282 \r
283     dbg_base_clk <= pi_base_clk;\r
284 \r
285     --synchronized clock generator instance\r
286     clock_selector_inst : clock_selector port map (\r
287             pi_rst_n,\r
288             pi_base_clk,\r
289             wr_cpu_en,\r
290             wr_rnd_en\r
291             );\r
292 \r
293     --mos 6502 cpu instance\r
294     cpu_inst : mos6502 port map (\r
295             pi_rst_n, \r
296             pi_base_clk, \r
297             wr_cpu_en, \r
298             wr_rdy,\r
299             wr_irq_n, \r
300             wr_nmi_n, \r
301             wr_oe_n, \r
302             wr_we_n, \r
303             wr_addr, \r
304             wr_d_io,\r
305             po_exc_cnt\r
306             );\r
307 \r
308     --chip select (address decode)\r
309     cs_inst : chip_selector port map (\r
310             pi_rst_n,\r
311             pi_base_clk, \r
312             wr_addr,\r
313             wr_rom_ce_n,\r
314             wr_ram_ce_n,\r
315             wr_ppu_ce_n,\r
316             wr_apu_ce_n\r
317             );\r
318 \r
319     --program rom\r
320     prom_inst : prg_rom port map (\r
321             pi_base_clk, \r
322             wr_rom_ce_n,\r
323             wr_oe_n,\r
324             wr_addr(14 downto 0), \r
325             wr_d_io\r
326             );\r
327 \r
328     --cpu ram inst.\r
329     cpu_ram_inst : ram generic map\r
330         (ram_2k, 8\r
331         , "mem-before-02bd000000000000.bin"\r
332         ) port map (\r
333             pi_base_clk,\r
334             wr_ram_ce_n,\r
335             wr_oe_n,\r
336             wr_we_n,\r
337             wr_addr(10 downto 0), \r
338             wr_d_io\r
339             );\r
340 \r
341     --ppu\r
342     ppu_inst : ppu port map (\r
343             pi_rst_n, \r
344             pi_base_clk, \r
345             wr_cpu_en,\r
346             wr_ppu_ce_n,\r
347             wr_oe_n,\r
348             wr_we_n,\r
349             wr_addr(2 downto 0), \r
350             wr_d_io,\r
351             wr_nmi_n,\r
352 \r
353             wr_v_ce_n,\r
354             wr_v_rd_n,\r
355             wr_v_wr_n,\r
356             wr_v_addr,\r
357             wr_v_data,\r
358 \r
359             wr_plt_ce_n,\r
360             wr_plt_rd_n,\r
361             wr_plt_wr_n,\r
362             wr_plt_addr,\r
363             wr_plt_data,\r
364 \r
365             wr_spr_ce_n,\r
366             wr_spr_rd_n,\r
367             wr_spr_wr_n,\r
368             wr_spr_addr,\r
369             wr_spr_data,\r
370 \r
371             --render i/f\r
372             wr_ppu_ctrl,\r
373             wr_ppu_mask,\r
374             wr_ppu_status,\r
375             wr_ppu_scroll_x,\r
376             wr_ppu_scroll_y\r
377             );\r
378 \r
379     --vram chip select (address decode)\r
380     vcs_inst : v_chip_selector port map (\r
381             pi_rst_n,\r
382             pi_base_clk,\r
383             wr_v_ce_n,\r
384             wr_v_addr,\r
385             pi_nt_v_mirror,\r
386             wr_pt_ce_n,\r
387             wr_nt0_ce_n,\r
388             wr_nt1_ce_n\r
389             );\r
390 \r
391     --name table/attr table #0\r
392     vram_nt0_inst : ram generic map\r
393         (vram_1k, 8) port map (\r
394             pi_base_clk,\r
395             wr_nt0_ce_n,\r
396             wr_v_rd_n,\r
397             wr_v_wr_n,\r
398             wr_v_addr(vram_1k - 1 downto 0),\r
399             wr_v_data\r
400             );\r
401 \r
402     --name table/attr table #1\r
403     vram_nt1_inst : ram generic map\r
404         (vram_1k, 8) port map (\r
405             pi_base_clk,\r
406             wr_nt1_ce_n,\r
407             wr_v_rd_n,\r
408             wr_v_wr_n,\r
409             wr_v_addr(vram_1k - 1 downto 0),\r
410             wr_v_data\r
411             );\r
412 \r
413     --palette table\r
414     vram_plt_inst : palette_ram port map (\r
415             pi_base_clk,\r
416             wr_plt_ce_n,\r
417             wr_plt_rd_n,\r
418             wr_plt_wr_n,\r
419             wr_plt_addr,\r
420             wr_plt_data\r
421             );\r
422 \r
423     --pattern table\r
424     chr_rom_inst : chr_rom port map (\r
425             pi_base_clk,\r
426             wr_pt_ce_n,\r
427             wr_v_rd_n,\r
428             wr_v_addr(12 downto 0),\r
429             wr_v_data\r
430             );\r
431 \r
432     --palette table\r
433     spr_ram_inst : ram generic map\r
434             (8, 8) port map (\r
435             pi_base_clk,\r
436             wr_spr_ce_n,\r
437             wr_spr_rd_n,\r
438             wr_spr_wr_n,\r
439             wr_spr_addr,\r
440             wr_spr_data\r
441             );\r
442 \r
443     --vga render instance\r
444     render_inst : render port map (\r
445             pi_rst_n, \r
446             pi_base_clk,\r
447             wr_rnd_en,\r
448 \r
449             --ppu i/f\r
450             wr_ppu_ctrl,\r
451             wr_ppu_mask,\r
452             wr_ppu_status,\r
453             wr_ppu_scroll_x,\r
454             wr_ppu_scroll_y,\r
455 \r
456             --vram i/f\r
457             wr_v_ce_n,\r
458             wr_v_rd_n,\r
459             wr_v_wr_n,\r
460             wr_v_addr,\r
461             wr_v_data,\r
462 \r
463             --plt i/f\r
464             wr_plt_ce_n,\r
465             wr_plt_rd_n,\r
466             wr_plt_wr_n,\r
467             wr_plt_addr,\r
468             wr_plt_data,\r
469 \r
470             --sprite i/f\r
471             wr_spr_ce_n,\r
472             wr_spr_rd_n,\r
473             wr_spr_wr_n,\r
474             wr_spr_addr,\r
475             wr_spr_data,\r
476 \r
477             --vga output\r
478             po_h_sync_n,\r
479             po_v_sync_n,\r
480             po_r,\r
481             po_g,\r
482             po_b\r
483             );\r
484 \r
485     apu_inst : apu port map (\r
486             pi_rst_n, \r
487             pi_base_clk,\r
488             wr_cpu_en, \r
489             wr_rnd_en,\r
490             wr_apu_ce_n,\r
491 \r
492             --cpu i/f\r
493             wr_oe_n,\r
494             wr_we_n,\r
495             wr_addr,\r
496             wr_d_io,\r
497             wr_rdy,\r
498 \r
499             --sprite i/f\r
500             wr_spr_ce_n,\r
501             wr_spr_rd_n,\r
502             wr_spr_wr_n,\r
503             wr_spr_addr,\r
504             wr_spr_data\r
505         );\r
506 \r
507     wr_irq_n <= '1';\r
508 \r
509     po_dbg_cnt <= reg_dbg_cnt;\r
510     deb_cnt_p : process (pi_rst_n, pi_base_clk)\r
511 use ieee.std_logic_unsigned.all;\r
512     variable cnt : integer;\r
513     begin\r
514         if (pi_rst_n = '0') then\r
515             reg_dbg_cnt <= (others => '0');\r
516             cnt := 0;\r
517         else\r
518             if (rising_edge(pi_base_clk)) then\r
519                 if (cnt = 0) then\r
520                     --debug count is half cycle because too fast to capture in st ii.\r
521                     reg_dbg_cnt <= reg_dbg_cnt + 1;\r
522                     cnt := 1;\r
523                 else\r
524                     cnt := 0;\r
525                 end if;\r
526             end if;\r
527         end if;\r
528     end process;\r
529 end rtl;