OSDN Git Service

vga rendering start.
[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_ppu_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_rd_n       : out std_logic;\r
75                 po_v_wr_n       : out std_logic;\r
76                 po_v_addr       : out std_logic_vector (13 downto 0);\r
77                 pio_v_data      : inout std_logic_vector (7 downto 0);\r
78 \r
79                 po_spr_ce_n     : out std_logic;\r
80                 po_spr_rd_n     : out std_logic;\r
81                 po_spr_wr_n     : out std_logic;\r
82                 po_spr_addr     : out std_logic_vector (7 downto 0);\r
83                 po_spr_data     : out std_logic_vector (7 downto 0);\r
84 \r
85                 po_ppu_ctrl        : out std_logic_vector (7 downto 0);\r
86                 po_ppu_mask        : out std_logic_vector (7 downto 0);\r
87                 pi_ppu_status      : in std_logic_vector (7 downto 0);\r
88                 po_ppu_scroll_x    : out std_logic_vector (7 downto 0);\r
89                 po_ppu_scroll_y    : out std_logic_vector (7 downto 0)\r
90     );
91     end component;
92
93     component ram\r
94         generic (abus_size : integer := 16; dbus_size : integer := 8);\r
95         port (\r
96                 pi_base_clk     : in std_logic;\r
97                 pi_ce_n         : in std_logic;\r
98                 pi_oe_n         : in std_logic;\r
99                 pi_we_n         : in std_logic;\r
100                 pi_addr         : in std_logic_vector (abus_size - 1 downto 0);\r
101                 pio_d_io        : inout std_logic_vector (dbus_size - 1 downto 0)\r
102             );\r
103     end component;\r
104 \r
105     component palette_ram\r
106         port (\r
107                 pi_base_clk     : in std_logic;\r
108                 pi_ce_n         : in std_logic;\r
109                 pi_oe_n         : in std_logic;\r
110                 pi_we_n         : in std_logic;\r
111                 pi_addr         : in std_logic_vector (4 downto 0);\r
112                 pio_d_io        : inout std_logic_vector (7 downto 0)\r
113             );\r
114     end component;\r
115 \r
116     component chr_rom\r
117         port (  \r
118                 pi_base_clk     : in std_logic;\r
119                 pi_ce_n         : in std_logic;\r
120                 pi_addr         : in std_logic_vector (12 downto 0);\r
121                 po_data         : out std_logic_vector (7 downto 0)\r
122             );\r
123     end component;\r
124 \r
125     component v_chip_selector\r
126         port (\r
127                     pi_rst_n        : in std_logic;\r
128                     pi_base_clk     : in std_logic;\r
129                     pi_v_addr       : in std_logic_vector (13 downto 0);\r
130                     pi_nt_v_mirror  : in std_logic;\r
131                     po_pt_ce_n      : out std_logic;\r
132                     po_nt0_ce_n     : out std_logic;\r
133                     po_nt1_ce_n     : out std_logic;\r
134                     po_plt_ce_n     : out std_logic\r
135             );\r
136     end component;\r
137 \r
138     component render\r
139         port (\r
140             pi_rst_n       : in std_logic;\r
141             pi_base_clk    : in std_logic;\r
142 \r
143             --ppu i/f\r
144             pi_ppu_ctrl        : in std_logic_vector (7 downto 0);\r
145             pi_ppu_mask        : in std_logic_vector (7 downto 0);\r
146             po_ppu_status      : out std_logic_vector (7 downto 0);\r
147             pi_ppu_scroll_x    : in std_logic_vector (7 downto 0);\r
148             pi_ppu_scroll_y    : in std_logic_vector (7 downto 0);\r
149 \r
150             --vram i/f\r
151             po_rd_n         : out std_logic;\r
152             po_wr_n         : out std_logic;\r
153             po_v_addr       : out std_logic_vector (13 downto 0);\r
154             io_v_data       : in std_logic_vector (7 downto 0);\r
155 \r
156             --sprite i/f\r
157             po_spr_ce_n     : out std_logic;\r
158             po_spr_rd_n     : out std_logic;\r
159             po_spr_wr_n     : out std_logic;\r
160             po_spr_addr     : out std_logic_vector (7 downto 0);\r
161             pi_spr_data     : in std_logic_vector (7 downto 0);\r
162 \r
163             --vga output\r
164             po_h_sync_n    : out std_logic;\r
165             po_v_sync_n    : out std_logic;\r
166             po_r           : out std_logic_vector(3 downto 0);\r
167             po_g           : out std_logic_vector(3 downto 0);\r
168             po_b           : out std_logic_vector(3 downto 0)\r
169             );\r
170     end component;\r
171 \r
172 constant ram_2k     : integer := 11;    --2k = 11   bit width.\r
173 constant rom_32k    : integer := 15;    --32k = 15  bit width.\r
174 constant vram_1k    : integer := 10;    --1k = 10   bit width.\r
175 \r
176 signal wr_cpu_en       : std_logic_vector (7 downto 0);\r
177 signal wr_ppu_en       : std_logic_vector (3 downto 0);\r
178 \r
179 signal wr_rdy       : std_logic;\r
180 signal wr_irq_n     : std_logic;\r
181 signal wr_nmi_n     : std_logic;\r
182 signal wr_r_nw      : std_logic;\r
183 \r
184 signal wr_addr      : std_logic_vector ( 15 downto 0);\r
185 signal wr_d_io      : std_logic_vector ( 7 downto 0);\r
186 \r
187 signal wr_rom_ce_n     : std_logic;\r
188 signal wr_ram_ce_n     : std_logic;\r
189 signal wr_ppu_ce_n     : std_logic;\r
190 signal wr_apu_ce_n     : std_logic;\r
191 \r
192 signal wr_v_rd_n        : std_logic;\r
193 signal wr_v_wr_n        : std_logic;\r
194 signal wr_v_addr        : std_logic_vector (13 downto 0);\r
195 signal wr_v_data        : std_logic_vector (7 downto 0);\r
196 \r
197 signal wr_spr_ce_n      : std_logic;\r
198 signal wr_spr_rd_n      : std_logic;\r
199 signal wr_spr_wr_n      : std_logic;\r
200 signal wr_spr_addr      : std_logic_vector (7 downto 0);\r
201 signal wr_spr_data      : std_logic_vector (7 downto 0);\r
202 \r
203 signal wr_pt_ce_n       : std_logic;\r
204 signal wr_nt0_ce_n      : std_logic;\r
205 signal wr_nt1_ce_n      : std_logic;\r
206 signal wr_plt_ce_n      : std_logic;\r
207 \r
208 signal wr_ppu_ctrl          : std_logic_vector (7 downto 0);\r
209 signal wr_ppu_mask          : std_logic_vector (7 downto 0);\r
210 signal wr_ppu_status        : std_logic_vector (7 downto 0);\r
211 signal wr_ppu_scroll_x      : std_logic_vector (7 downto 0);\r
212 signal wr_ppu_scroll_y      : std_logic_vector (7 downto 0);\r
213 \r
214 begin
215 \r
216     dbg_base_clk <= pi_base_clk;\r
217 \r
218     --synchronized clock generator instance\r
219     clock_selector_inst : clock_selector port map (\r
220             pi_rst_n,\r
221             pi_base_clk,\r
222             wr_cpu_en,\r
223             wr_ppu_en\r
224             );\r
225 \r
226     --mos 6502 cpu instance\r
227     cpu_inst : mos6502 port map (\r
228             pi_rst_n, \r
229             pi_base_clk, \r
230             wr_cpu_en, \r
231             wr_rdy,\r
232             wr_irq_n, \r
233             wr_nmi_n, \r
234             wr_r_nw, \r
235             wr_addr, \r
236             wr_d_io\r
237             );\r
238 \r
239     --chip select (address decode)\r
240     cs_inst : chip_selector port map (\r
241             pi_rst_n,\r
242             pi_base_clk, \r
243             wr_addr,\r
244             wr_rom_ce_n,\r
245             wr_ram_ce_n,\r
246             wr_ppu_ce_n,\r
247             wr_apu_ce_n\r
248             );\r
249 \r
250     --ppu\r
251     ppu_inst : ppu port map (\r
252             pi_rst_n, \r
253             pi_base_clk, \r
254             wr_cpu_en,\r
255             wr_ppu_ce_n,\r
256             wr_r_nw, \r
257             wr_addr(2 downto 0), \r
258             wr_d_io,\r
259 \r
260             wr_v_rd_n,\r
261             wr_v_wr_n,\r
262             wr_v_addr,\r
263             wr_v_data,\r
264 \r
265             wr_spr_ce_n,\r
266             wr_spr_rd_n,\r
267             wr_spr_wr_n,\r
268             wr_spr_addr,\r
269             wr_spr_data,\r
270 \r
271             --render i/f\r
272             wr_ppu_ctrl,\r
273             wr_ppu_mask,\r
274             wr_ppu_status,\r
275             wr_ppu_scroll_x,\r
276             wr_ppu_scroll_y\r
277             );\r
278 \r
279     --vram chip select (address decode)\r
280     vcs_inst : v_chip_selector port map (\r
281             pi_rst_n,\r
282             pi_base_clk, \r
283             wr_v_addr,\r
284             pi_nt_v_mirror,\r
285             wr_pt_ce_n,\r
286             wr_nt0_ce_n,\r
287             wr_nt1_ce_n,\r
288             wr_plt_ce_n\r
289             );\r
290 \r
291     --name table/attr table #0\r
292     vram_nt0_inst : ram generic map\r
293         (vram_1k, 8) port map (\r
294             pi_base_clk,\r
295             wr_nt0_ce_n,\r
296             wr_v_rd_n,\r
297             wr_v_wr_n,\r
298             wr_v_addr(vram_1k - 1 downto 0),\r
299             wr_v_data\r
300             );\r
301 \r
302     --name table/attr table #1\r
303     vram_nt1_inst : ram generic map\r
304         (vram_1k, 8) port map (\r
305             pi_base_clk,\r
306             wr_nt1_ce_n,\r
307             wr_v_rd_n,\r
308             wr_v_wr_n,\r
309             wr_v_addr(vram_1k - 1 downto 0),\r
310             wr_v_data\r
311             );\r
312 \r
313     --palette table\r
314     vram_plt_inst : palette_ram port map (\r
315             pi_base_clk,\r
316             wr_plt_ce_n,\r
317             wr_v_rd_n,\r
318             wr_v_wr_n,\r
319             wr_v_addr(4 downto 0),\r
320             wr_v_data\r
321             );\r
322 \r
323     --pattern table\r
324     chr_rom_inst : chr_rom port map (\r
325             pi_base_clk,\r
326             wr_pt_ce_n,\r
327             wr_v_addr(12 downto 0),\r
328             wr_v_data\r
329             );\r
330 \r
331     --palette table\r
332     spr_ram_inst : ram generic map\r
333             (8, 8) port map (\r
334             pi_base_clk,\r
335             wr_spr_ce_n,\r
336             wr_spr_rd_n,\r
337             wr_spr_wr_n,\r
338             wr_spr_addr,\r
339             wr_spr_data\r
340             );\r
341 \r
342     --vga render instance\r
343     render_inst : render port map (\r
344             pi_rst_n, \r
345             pi_base_clk,\r
346 \r
347             --ppu i/f\r
348             wr_ppu_ctrl,\r
349             wr_ppu_mask,\r
350             wr_ppu_status,\r
351             wr_ppu_scroll_x,\r
352             wr_ppu_scroll_y,\r
353 \r
354             --vram i/f\r
355             wr_v_rd_n,\r
356             wr_v_wr_n,\r
357             wr_v_addr,\r
358             wr_v_data,\r
359 \r
360             --sprite i/f\r
361             wr_spr_ce_n,\r
362             wr_spr_rd_n,\r
363             wr_spr_wr_n,\r
364             wr_spr_addr,\r
365             wr_spr_data,\r
366 \r
367             --vga output\r
368             po_h_sync_n,\r
369             po_v_sync_n,\r
370             po_r,\r
371             po_g,\r
372             po_b\r
373             );\r
374 \r
375     wr_rdy <= '1';\r
376     wr_irq_n <= '1';\r
377     wr_nmi_n <= '1';\r
378 \r
379 end rtl;