OSDN Git Service

render x, y reg set.
[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_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             pi_rnd_en      : in std_logic_vector (3 downto 0);\r
143 \r
144             --ppu i/f\r
145             pi_ppu_ctrl        : in std_logic_vector (7 downto 0);\r
146             pi_ppu_mask        : in std_logic_vector (7 downto 0);\r
147             po_ppu_status      : out std_logic_vector (7 downto 0);\r
148             pi_ppu_scroll_x    : in std_logic_vector (7 downto 0);\r
149             pi_ppu_scroll_y    : in std_logic_vector (7 downto 0);\r
150 \r
151             --vram i/f\r
152             po_rd_n         : out std_logic;\r
153             po_wr_n         : out std_logic;\r
154             po_v_addr       : out std_logic_vector (13 downto 0);\r
155             io_v_data       : in std_logic_vector (7 downto 0);\r
156 \r
157             --sprite i/f\r
158             po_spr_ce_n     : out std_logic;\r
159             po_spr_rd_n     : out std_logic;\r
160             po_spr_wr_n     : out std_logic;\r
161             po_spr_addr     : out std_logic_vector (7 downto 0);\r
162             pi_spr_data     : in std_logic_vector (7 downto 0);\r
163 \r
164             --vga output\r
165             po_h_sync_n    : out std_logic;\r
166             po_v_sync_n    : out std_logic;\r
167             po_r           : out std_logic_vector(3 downto 0);\r
168             po_g           : out std_logic_vector(3 downto 0);\r
169             po_b           : out std_logic_vector(3 downto 0)\r
170             );\r
171     end component;\r
172 \r
173 constant ram_2k     : integer := 11;    --2k = 11   bit width.\r
174 constant rom_32k    : integer := 15;    --32k = 15  bit width.\r
175 constant vram_1k    : integer := 10;    --1k = 10   bit width.\r
176 \r
177 signal wr_cpu_en       : std_logic_vector (7 downto 0);\r
178 signal wr_rnd_en       : std_logic_vector (3 downto 0);\r
179 \r
180 signal wr_rdy       : std_logic;\r
181 signal wr_irq_n     : std_logic;\r
182 signal wr_nmi_n     : std_logic;\r
183 signal wr_r_nw      : std_logic;\r
184 \r
185 signal wr_addr      : std_logic_vector ( 15 downto 0);\r
186 signal wr_d_io      : std_logic_vector ( 7 downto 0);\r
187 \r
188 signal wr_rom_ce_n     : std_logic;\r
189 signal wr_ram_ce_n     : std_logic;\r
190 signal wr_ppu_ce_n     : std_logic;\r
191 signal wr_apu_ce_n     : std_logic;\r
192 \r
193 signal wr_v_rd_n        : std_logic;\r
194 signal wr_v_wr_n        : std_logic;\r
195 signal wr_v_addr        : std_logic_vector (13 downto 0);\r
196 signal wr_v_data        : std_logic_vector (7 downto 0);\r
197 \r
198 signal wr_spr_ce_n      : std_logic;\r
199 signal wr_spr_rd_n      : std_logic;\r
200 signal wr_spr_wr_n      : std_logic;\r
201 signal wr_spr_addr      : std_logic_vector (7 downto 0);\r
202 signal wr_spr_data      : std_logic_vector (7 downto 0);\r
203 \r
204 signal wr_pt_ce_n       : std_logic;\r
205 signal wr_nt0_ce_n      : std_logic;\r
206 signal wr_nt1_ce_n      : std_logic;\r
207 signal wr_plt_ce_n      : std_logic;\r
208 \r
209 signal wr_ppu_ctrl          : std_logic_vector (7 downto 0);\r
210 signal wr_ppu_mask          : std_logic_vector (7 downto 0);\r
211 signal wr_ppu_status        : std_logic_vector (7 downto 0);\r
212 signal wr_ppu_scroll_x      : std_logic_vector (7 downto 0);\r
213 signal wr_ppu_scroll_y      : std_logic_vector (7 downto 0);\r
214 \r
215 begin
216 \r
217     dbg_base_clk <= pi_base_clk;\r
218 \r
219     --synchronized clock generator instance\r
220     clock_selector_inst : clock_selector port map (\r
221             pi_rst_n,\r
222             pi_base_clk,\r
223             wr_cpu_en,\r
224             wr_rnd_en\r
225             );\r
226 \r
227     --mos 6502 cpu instance\r
228     cpu_inst : mos6502 port map (\r
229             pi_rst_n, \r
230             pi_base_clk, \r
231             wr_cpu_en, \r
232             wr_rdy,\r
233             wr_irq_n, \r
234             wr_nmi_n, \r
235             wr_r_nw, \r
236             wr_addr, \r
237             wr_d_io\r
238             );\r
239 \r
240     --chip select (address decode)\r
241     cs_inst : chip_selector port map (\r
242             pi_rst_n,\r
243             pi_base_clk, \r
244             wr_addr,\r
245             wr_rom_ce_n,\r
246             wr_ram_ce_n,\r
247             wr_ppu_ce_n,\r
248             wr_apu_ce_n\r
249             );\r
250 \r
251     --ppu\r
252     ppu_inst : ppu port map (\r
253             pi_rst_n, \r
254             pi_base_clk, \r
255             wr_cpu_en,\r
256             wr_ppu_ce_n,\r
257             wr_r_nw, \r
258             wr_addr(2 downto 0), \r
259             wr_d_io,\r
260 \r
261             wr_v_rd_n,\r
262             wr_v_wr_n,\r
263             wr_v_addr,\r
264             wr_v_data,\r
265 \r
266             wr_spr_ce_n,\r
267             wr_spr_rd_n,\r
268             wr_spr_wr_n,\r
269             wr_spr_addr,\r
270             wr_spr_data,\r
271 \r
272             --render i/f\r
273             wr_ppu_ctrl,\r
274             wr_ppu_mask,\r
275             wr_ppu_status,\r
276             wr_ppu_scroll_x,\r
277             wr_ppu_scroll_y\r
278             );\r
279 \r
280     --vram chip select (address decode)\r
281     vcs_inst : v_chip_selector port map (\r
282             pi_rst_n,\r
283             pi_base_clk, \r
284             wr_v_addr,\r
285             pi_nt_v_mirror,\r
286             wr_pt_ce_n,\r
287             wr_nt0_ce_n,\r
288             wr_nt1_ce_n,\r
289             wr_plt_ce_n\r
290             );\r
291 \r
292     --name table/attr table #0\r
293     vram_nt0_inst : ram generic map\r
294         (vram_1k, 8) port map (\r
295             pi_base_clk,\r
296             wr_nt0_ce_n,\r
297             wr_v_rd_n,\r
298             wr_v_wr_n,\r
299             wr_v_addr(vram_1k - 1 downto 0),\r
300             wr_v_data\r
301             );\r
302 \r
303     --name table/attr table #1\r
304     vram_nt1_inst : ram generic map\r
305         (vram_1k, 8) port map (\r
306             pi_base_clk,\r
307             wr_nt1_ce_n,\r
308             wr_v_rd_n,\r
309             wr_v_wr_n,\r
310             wr_v_addr(vram_1k - 1 downto 0),\r
311             wr_v_data\r
312             );\r
313 \r
314     --palette table\r
315     vram_plt_inst : palette_ram port map (\r
316             pi_base_clk,\r
317             wr_plt_ce_n,\r
318             wr_v_rd_n,\r
319             wr_v_wr_n,\r
320             wr_v_addr(4 downto 0),\r
321             wr_v_data\r
322             );\r
323 \r
324     --pattern table\r
325     chr_rom_inst : chr_rom port map (\r
326             pi_base_clk,\r
327             wr_pt_ce_n,\r
328             wr_v_addr(12 downto 0),\r
329             wr_v_data\r
330             );\r
331 \r
332     --palette table\r
333     spr_ram_inst : ram generic map\r
334             (8, 8) port map (\r
335             pi_base_clk,\r
336             wr_spr_ce_n,\r
337             wr_spr_rd_n,\r
338             wr_spr_wr_n,\r
339             wr_spr_addr,\r
340             wr_spr_data\r
341             );\r
342 \r
343     --vga render instance\r
344     render_inst : render port map (\r
345             pi_rst_n, \r
346             pi_base_clk,\r
347             wr_rnd_en,\r
348 \r
349             --ppu i/f\r
350             wr_ppu_ctrl,\r
351             wr_ppu_mask,\r
352             wr_ppu_status,\r
353             wr_ppu_scroll_x,\r
354             wr_ppu_scroll_y,\r
355 \r
356             --vram i/f\r
357             wr_v_rd_n,\r
358             wr_v_wr_n,\r
359             wr_v_addr,\r
360             wr_v_data,\r
361 \r
362             --sprite i/f\r
363             wr_spr_ce_n,\r
364             wr_spr_rd_n,\r
365             wr_spr_wr_n,\r
366             wr_spr_addr,\r
367             wr_spr_data,\r
368 \r
369             --vga output\r
370             po_h_sync_n,\r
371             po_v_sync_n,\r
372             po_r,\r
373             po_g,\r
374             po_b\r
375             );\r
376 \r
377     wr_rdy <= '1';\r
378     wr_irq_n <= '1';\r
379     wr_nmi_n <= '1';\r
380 \r
381 end rtl;