OSDN Git Service

palette bus separated.
[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          );
27 end de0_cv_nes;
28
29 architecture rtl of de0_cv_nes is
30     component mos6502
31         port (
32                 pi_rst_n       : in std_logic;\r
33                 pi_base_clk    : in std_logic;\r
34                 pi_cpu_en      : in std_logic_vector (7 downto 0);\r
35                 pi_rdy         : in std_logic;\r
36                 pi_irq_n       : in std_logic;\r
37                 pi_nmi_n       : in std_logic;\r
38                 po_r_nw        : out std_logic;\r
39                 po_addr        : out std_logic_vector ( 15 downto 0);\r
40                 pio_d_io       : inout std_logic_vector ( 7 downto 0)\r
41         );
42     end component;
43
44     component clock_selector\r
45         port (\r
46                 pi_rst_n        : in std_logic;\r
47                 pi_base_clk     : in std_logic;\r
48                 po_cpu_en       : out std_logic_vector (7 downto 0);\r
49                 po_rnd_en       : out std_logic_vector (3 downto 0)\r
50             );\r
51     end component;\r
52 \r
53     component chip_selector\r
54         port (\r
55                 pi_rst_n        : in std_logic;\r
56                 pi_base_clk     : in std_logic;\r
57                 pi_addr         : in std_logic_vector (15 downto 0);\r
58                 po_rom_ce_n     : out std_logic;\r
59                 po_ram_ce_n     : out std_logic;\r
60                 po_ppu_ce_n     : out std_logic;\r
61                 po_apu_ce_n     : out std_logic\r
62             );\r
63     end component;\r
64 \r
65     component ppu port (
66                 pi_rst_n       : in std_logic;\r
67                 pi_base_clk    : in std_logic;
68                 pi_cpu_en      : in std_logic_vector (7 downto 0);\r
69                 pi_ce_n        : in std_logic;
70                 pi_r_nw        : in std_logic;
71                 pi_cpu_addr    : in std_logic_vector (2 downto 0);
72                 pio_cpu_d      : inout std_logic_vector (7 downto 0);
73
74                 po_v_ce_n       : out std_logic;\r
75                 po_v_rd_n       : out std_logic;\r
76                 po_v_wr_n       : out std_logic;\r
77                 po_v_addr       : out std_logic_vector (13 downto 0);\r
78                 pio_v_data      : inout std_logic_vector (7 downto 0);\r
79 \r
80                 po_plt_ce_n     : out std_logic;\r
81                 po_plt_rd_n     : out std_logic;\r
82                 po_plt_wr_n     : out std_logic;\r
83                 po_plt_addr     : out std_logic_vector (4 downto 0);\r
84                 pio_plt_data    : inout std_logic_vector (7 downto 0);\r
85 \r
86                 po_spr_ce_n     : out std_logic;\r
87                 po_spr_rd_n     : out std_logic;\r
88                 po_spr_wr_n     : out std_logic;\r
89                 po_spr_addr     : out std_logic_vector (7 downto 0);\r
90                 po_spr_data     : out std_logic_vector (7 downto 0);\r
91 \r
92                 po_ppu_ctrl        : out std_logic_vector (7 downto 0);\r
93                 po_ppu_mask        : out std_logic_vector (7 downto 0);\r
94                 pi_ppu_status      : in std_logic_vector (7 downto 0);\r
95                 po_ppu_scroll_x    : out std_logic_vector (7 downto 0);\r
96                 po_ppu_scroll_y    : out std_logic_vector (7 downto 0)\r
97     );
98     end component;
99
100     component ram\r
101         generic (abus_size : integer := 16; dbus_size : integer := 8);\r
102         port (\r
103                 pi_base_clk     : in std_logic;\r
104                 pi_ce_n         : in std_logic;\r
105                 pi_oe_n         : in std_logic;\r
106                 pi_we_n         : in std_logic;\r
107                 pi_addr         : in std_logic_vector (abus_size - 1 downto 0);\r
108                 pio_d_io        : inout std_logic_vector (dbus_size - 1 downto 0)\r
109             );\r
110     end component;\r
111 \r
112     component palette_ram\r
113         port (\r
114                 pi_base_clk     : in std_logic;\r
115                 pi_ce_n         : in std_logic;\r
116                 pi_oe_n         : in std_logic;\r
117                 pi_we_n         : in std_logic;\r
118                 pi_addr         : in std_logic_vector (4 downto 0);\r
119                 pio_d_io        : inout std_logic_vector (7 downto 0)\r
120             );\r
121     end component;\r
122 \r
123     component chr_rom\r
124         port (  \r
125                 pi_base_clk     : in std_logic;\r
126                 pi_ce_n         : in std_logic;\r
127                 pi_addr         : in std_logic_vector (12 downto 0);\r
128                 po_data         : out std_logic_vector (7 downto 0)\r
129             );\r
130     end component;\r
131 \r
132     component v_chip_selector\r
133         port (\r
134                     pi_rst_n        : in std_logic;\r
135                     pi_base_clk     : in std_logic;\r
136                     pi_v_ce_n       : in std_logic;\r
137                     pi_v_addr       : in std_logic_vector (13 downto 0);\r
138                     pi_nt_v_mirror  : in std_logic;\r
139                     po_pt_ce_n      : out std_logic;\r
140                     po_nt0_ce_n     : out std_logic;\r
141                     po_nt1_ce_n     : out std_logic\r
142             );\r
143     end component;\r
144 \r
145     component render\r
146         port (\r
147             pi_rst_n       : in std_logic;\r
148             pi_base_clk    : in std_logic;\r
149             pi_rnd_en      : in std_logic_vector (3 downto 0);\r
150 \r
151             --ppu i/f\r
152             pi_ppu_ctrl        : in std_logic_vector (7 downto 0);\r
153             pi_ppu_mask        : in std_logic_vector (7 downto 0);\r
154             po_ppu_status      : out std_logic_vector (7 downto 0);\r
155             pi_ppu_scroll_x    : in std_logic_vector (7 downto 0);\r
156             pi_ppu_scroll_y    : in std_logic_vector (7 downto 0);\r
157 \r
158             --vram i/f\r
159             po_v_ce_n       : out std_logic;\r
160             po_v_rd_n       : out std_logic;\r
161             po_v_wr_n       : out std_logic;\r
162             po_v_addr       : out std_logic_vector (13 downto 0);\r
163             pi_v_data       : in std_logic_vector (7 downto 0);\r
164 \r
165             --plt i/f\r
166             po_plt_ce_n     : out std_logic;\r
167             po_plt_rd_n     : out std_logic;\r
168             po_plt_wr_n     : out std_logic;\r
169             po_plt_addr     : out std_logic_vector (4 downto 0);\r
170             pi_plt_data     : in std_logic_vector (7 downto 0);\r
171 \r
172             --sprite i/f\r
173             po_spr_ce_n     : out std_logic;\r
174             po_spr_rd_n     : out std_logic;\r
175             po_spr_wr_n     : out std_logic;\r
176             po_spr_addr     : out std_logic_vector (7 downto 0);\r
177             pi_spr_data     : in std_logic_vector (7 downto 0);\r
178 \r
179             --vga output\r
180             po_h_sync_n    : out std_logic;\r
181             po_v_sync_n    : out std_logic;\r
182             po_r           : out std_logic_vector(3 downto 0);\r
183             po_g           : out std_logic_vector(3 downto 0);\r
184             po_b           : out std_logic_vector(3 downto 0)\r
185             );\r
186     end component;\r
187 \r
188 constant ram_2k     : integer := 11;    --2k = 11   bit width.\r
189 constant rom_32k    : integer := 15;    --32k = 15  bit width.\r
190 constant vram_1k    : integer := 10;    --1k = 10   bit width.\r
191 \r
192 signal wr_cpu_en       : std_logic_vector (7 downto 0);\r
193 signal wr_rnd_en       : std_logic_vector (3 downto 0);\r
194 \r
195 signal wr_rdy       : std_logic;\r
196 signal wr_irq_n     : std_logic;\r
197 signal wr_nmi_n     : std_logic;\r
198 signal wr_r_nw      : std_logic;\r
199 \r
200 signal wr_addr      : std_logic_vector ( 15 downto 0);\r
201 signal wr_d_io      : std_logic_vector ( 7 downto 0);\r
202 \r
203 signal wr_rom_ce_n     : std_logic;\r
204 signal wr_ram_ce_n     : std_logic;\r
205 signal wr_ppu_ce_n     : std_logic;\r
206 signal wr_apu_ce_n     : std_logic;\r
207 \r
208 signal wr_v_ce_n        : std_logic;\r
209 signal wr_v_rd_n        : std_logic;\r
210 signal wr_v_wr_n        : std_logic;\r
211 signal wr_v_addr        : std_logic_vector (13 downto 0);\r
212 signal wr_v_data        : std_logic_vector (7 downto 0);\r
213 \r
214 signal wr_plt_ce_n      : std_logic;\r
215 signal wr_plt_rd_n      : std_logic;\r
216 signal wr_plt_wr_n      : std_logic;\r
217 signal wr_plt_addr      : std_logic_vector (4 downto 0);\r
218 signal wr_plt_data      : std_logic_vector (7 downto 0);\r
219 \r
220 signal wr_spr_ce_n      : std_logic;\r
221 signal wr_spr_rd_n      : std_logic;\r
222 signal wr_spr_wr_n      : std_logic;\r
223 signal wr_spr_addr      : std_logic_vector (7 downto 0);\r
224 signal wr_spr_data      : std_logic_vector (7 downto 0);\r
225 \r
226 signal wr_pt_ce_n       : std_logic;\r
227 signal wr_nt0_ce_n      : std_logic;\r
228 signal wr_nt1_ce_n      : std_logic;\r
229 \r
230 signal wr_ppu_ctrl          : std_logic_vector (7 downto 0);\r
231 signal wr_ppu_mask          : std_logic_vector (7 downto 0);\r
232 signal wr_ppu_status        : std_logic_vector (7 downto 0);\r
233 signal wr_ppu_scroll_x      : std_logic_vector (7 downto 0);\r
234 signal wr_ppu_scroll_y      : std_logic_vector (7 downto 0);\r
235 \r
236 begin
237 \r
238     dbg_base_clk <= pi_base_clk;\r
239 \r
240     --synchronized clock generator instance\r
241     clock_selector_inst : clock_selector port map (\r
242             pi_rst_n,\r
243             pi_base_clk,\r
244             wr_cpu_en,\r
245             wr_rnd_en\r
246             );\r
247 \r
248     --mos 6502 cpu instance\r
249     cpu_inst : mos6502 port map (\r
250             pi_rst_n, \r
251             pi_base_clk, \r
252             wr_cpu_en, \r
253             wr_rdy,\r
254             wr_irq_n, \r
255             wr_nmi_n, \r
256             wr_r_nw, \r
257             wr_addr, \r
258             wr_d_io\r
259             );\r
260 \r
261     --chip select (address decode)\r
262     cs_inst : chip_selector port map (\r
263             pi_rst_n,\r
264             pi_base_clk, \r
265             wr_addr,\r
266             wr_rom_ce_n,\r
267             wr_ram_ce_n,\r
268             wr_ppu_ce_n,\r
269             wr_apu_ce_n\r
270             );\r
271 \r
272     --ppu\r
273     ppu_inst : ppu port map (\r
274             pi_rst_n, \r
275             pi_base_clk, \r
276             wr_cpu_en,\r
277             wr_ppu_ce_n,\r
278             wr_r_nw, \r
279             wr_addr(2 downto 0), \r
280             wr_d_io,\r
281 \r
282             wr_v_ce_n,\r
283             wr_v_rd_n,\r
284             wr_v_wr_n,\r
285             wr_v_addr,\r
286             wr_v_data,\r
287 \r
288             wr_plt_ce_n,\r
289             wr_plt_rd_n,\r
290             wr_plt_wr_n,\r
291             wr_plt_addr,\r
292             wr_plt_data,\r
293 \r
294             wr_spr_ce_n,\r
295             wr_spr_rd_n,\r
296             wr_spr_wr_n,\r
297             wr_spr_addr,\r
298             wr_spr_data,\r
299 \r
300             --render i/f\r
301             wr_ppu_ctrl,\r
302             wr_ppu_mask,\r
303             wr_ppu_status,\r
304             wr_ppu_scroll_x,\r
305             wr_ppu_scroll_y\r
306             );\r
307 \r
308     --vram chip select (address decode)\r
309     vcs_inst : v_chip_selector port map (\r
310             pi_rst_n,\r
311             pi_base_clk,\r
312             wr_v_ce_n,\r
313             wr_v_addr,\r
314             pi_nt_v_mirror,\r
315             wr_pt_ce_n,\r
316             wr_nt0_ce_n,\r
317             wr_nt1_ce_n\r
318             );\r
319 \r
320     --name table/attr table #0\r
321     vram_nt0_inst : ram generic map\r
322         (vram_1k, 8) port map (\r
323             pi_base_clk,\r
324             wr_nt0_ce_n,\r
325             wr_v_rd_n,\r
326             wr_v_wr_n,\r
327             wr_v_addr(vram_1k - 1 downto 0),\r
328             wr_v_data\r
329             );\r
330 \r
331     --name table/attr table #1\r
332     vram_nt1_inst : ram generic map\r
333         (vram_1k, 8) port map (\r
334             pi_base_clk,\r
335             wr_nt1_ce_n,\r
336             wr_v_rd_n,\r
337             wr_v_wr_n,\r
338             wr_v_addr(vram_1k - 1 downto 0),\r
339             wr_v_data\r
340             );\r
341 \r
342     --palette table\r
343     vram_plt_inst : palette_ram port map (\r
344             pi_base_clk,\r
345             wr_plt_ce_n,\r
346             wr_plt_rd_n,\r
347             wr_plt_wr_n,\r
348             wr_plt_addr,\r
349             wr_plt_data\r
350             );\r
351 \r
352     --pattern table\r
353     chr_rom_inst : chr_rom port map (\r
354             pi_base_clk,\r
355             wr_pt_ce_n,\r
356             wr_v_addr(12 downto 0),\r
357             wr_v_data\r
358             );\r
359 \r
360     --palette table\r
361     spr_ram_inst : ram generic map\r
362             (8, 8) port map (\r
363             pi_base_clk,\r
364             wr_spr_ce_n,\r
365             wr_spr_rd_n,\r
366             wr_spr_wr_n,\r
367             wr_spr_addr,\r
368             wr_spr_data\r
369             );\r
370 \r
371     --vga render instance\r
372     render_inst : render port map (\r
373             pi_rst_n, \r
374             pi_base_clk,\r
375             wr_rnd_en,\r
376 \r
377             --ppu i/f\r
378             wr_ppu_ctrl,\r
379             wr_ppu_mask,\r
380             wr_ppu_status,\r
381             wr_ppu_scroll_x,\r
382             wr_ppu_scroll_y,\r
383 \r
384             --vram i/f\r
385             wr_v_ce_n,\r
386             wr_v_rd_n,\r
387             wr_v_wr_n,\r
388             wr_v_addr,\r
389             wr_v_data,\r
390 \r
391             --plt i/f\r
392             wr_plt_ce_n,\r
393             wr_plt_rd_n,\r
394             wr_plt_wr_n,\r
395             wr_plt_addr,\r
396             wr_plt_data,\r
397 \r
398             --sprite i/f\r
399             wr_spr_ce_n,\r
400             wr_spr_rd_n,\r
401             wr_spr_wr_n,\r
402             wr_spr_addr,\r
403             wr_spr_data,\r
404 \r
405             --vga output\r
406             po_h_sync_n,\r
407             po_v_sync_n,\r
408             po_r,\r
409             po_g,\r
410             po_b\r
411             );\r
412 \r
413     wr_rdy <= '1';\r
414     wr_irq_n <= '1';\r
415     wr_nmi_n <= '1';\r
416 \r
417 end rtl;