2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_unsigned.conv_integer;
6 -- MOTO NES FPGA On GHDL Simulation Environment Virtual Cuicuit Board
7 -- All of the components are assembled and instanciated on this board.
13 signal dbg_cpu_clk : out std_logic;
14 signal dbg_ppu_clk : out std_logic;
15 signal dbg_mem_clk : out std_logic;
16 signal dbg_r_nw : out std_logic;
17 signal dbg_addr : out std_logic_vector( 16 - 1 downto 0);
18 signal dbg_d_io : out std_logic_vector( 8 - 1 downto 0);
19 signal dbg_vram_ad : out std_logic_vector (7 downto 0);
20 signal dbg_vram_a : out std_logic_vector (13 downto 8);
23 signal dbg_instruction : out std_logic_vector(7 downto 0);
24 signal dbg_int_d_bus : 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 signal dbg_sp, dbg_x, dbg_y, dbg_acc : out std_logic_vector(7 downto 0);
29 signal dbg_dec_oe_n : out std_logic;
32 signal dbg_ppu_ce_n : out std_logic;
33 signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
34 signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
35 signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
36 signal dbg_disp_nt, dbg_disp_attr : out std_logic_vector (7 downto 0);
37 signal dbg_nmi : out std_logic;
41 base_clk : in std_logic;
43 joypad1 : in std_logic_vector(7 downto 0);
44 joypad2 : in std_logic_vector(7 downto 0);
45 h_sync_n : out std_logic;
46 v_sync_n : out std_logic;
47 r : out std_logic_vector(3 downto 0);
48 g : out std_logic_vector(3 downto 0);
49 b : out std_logic_vector(3 downto 0)
53 architecture rtl of de0_cv_nes is
55 generic ( dsize : integer := 8;
59 signal dbg_instruction : out std_logic_vector(7 downto 0);
60 signal dbg_int_d_bus : out std_logic_vector(7 downto 0);
61 signal dbg_exec_cycle : out std_logic_vector (5 downto 0);
62 signal dbg_ea_carry : out std_logic;
63 -- signal dbg_index_bus : out std_logic_vector(7 downto 0);
64 -- signal dbg_acc_bus : out std_logic_vector(7 downto 0);
65 signal dbg_status : out std_logic_vector(7 downto 0);
66 signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc : out std_logic_vector(7 downto 0);
67 signal dbg_dec_oe_n : out std_logic;
68 signal dbg_dec_val : out std_logic_vector (7 downto 0);
69 signal dbg_int_dbus : out std_logic_vector (7 downto 0);
70 -- signal dbg_status_val : out std_logic_vector (7 downto 0);
71 signal dbg_stat_we_n : out std_logic;
72 signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w : out std_logic_vector (7 downto 0);
74 input_clk : in std_logic; --phi0 input pin.
83 addr : out std_logic_vector ( asize - 1 downto 0);
84 d_io : inout std_logic_vector ( dsize - 1 downto 0)
88 component clock_divider
89 port ( base_clk : in std_logic;
90 reset_n : in std_logic;
91 cpu_clk : out std_logic;
92 ppu_clk : out std_logic;
93 mem_clk : out std_logic;
94 vga_clk : out std_logic
98 component address_decoder
99 generic (abus_size : integer := 16; dbus_size : integer := 8);
100 port ( phi2 : in std_logic;
101 mem_clk : in std_logic;
103 addr : in std_logic_vector (abus_size - 1 downto 0);
104 rom_ce_n : out std_logic;
105 ram_ce_n : out std_logic;
106 ppu_ce_n : out std_logic;
107 apu_ce_n : out std_logic
112 generic (abus_size : integer := 16; dbus_size : integer := 8);
115 ce_n, oe_n, we_n : in std_logic; --select pin active low.
116 addr : in std_logic_vector (abus_size - 1 downto 0);
117 d_io : inout std_logic_vector (dbus_size - 1 downto 0)
122 generic (abus_size : integer := 15; dbus_size : integer := 8);
125 ce_n : in std_logic; --active low.
126 addr : in std_logic_vector (abus_size - 1 downto 0);
127 data : out std_logic_vector (dbus_size - 1 downto 0)
132 signal dbg_ppu_ce_n : out std_logic;
133 signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
134 signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
135 signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
137 signal dbg_ppu_clk : out std_logic;
138 signal dbg_vga_clk : out std_logic;
139 signal dbg_nes_x : out std_logic_vector (8 downto 0);
140 signal dbg_vga_x : out std_logic_vector (9 downto 0);
141 signal dbg_nes_y : out std_logic_vector (8 downto 0);
142 signal dbg_vga_y : out std_logic_vector (9 downto 0);
143 signal dbg_disp_nt, dbg_disp_attr : out std_logic_vector (7 downto 0);
144 signal dbg_disp_ptn_h, dbg_disp_ptn_l : out std_logic_vector (15 downto 0);
145 signal dbg_plt_ce_rn_wn : out std_logic_vector (2 downto 0);
146 signal dbg_plt_addr : out std_logic_vector (4 downto 0);
147 signal dbg_plt_data : out std_logic_vector (7 downto 0);
148 signal dbg_p_oam_ce_rn_wn : out std_logic_vector (2 downto 0);
149 signal dbg_p_oam_addr : out std_logic_vector (7 downto 0);
150 signal dbg_p_oam_data : out std_logic_vector (7 downto 0);
151 signal dbg_s_oam_ce_rn_wn : out std_logic_vector (2 downto 0);
152 signal dbg_s_oam_addr : out std_logic_vector (4 downto 0);
153 signal dbg_s_oam_data : out std_logic_vector (7 downto 0);
154 signal dbg_emu_ppu_clk : out std_logic;
156 signal dbg_ppu_addr_we_n : out std_logic;
157 signal dbg_ppu_clk_cnt : out std_logic_vector(1 downto 0);
159 ppu_clk : in std_logic;
160 mem_clk : in std_logic;
162 rst_n : in std_logic;
164 cpu_addr : in std_logic_vector (2 downto 0);
165 cpu_d : inout std_logic_vector (7 downto 0);
167 vblank_n : out std_logic;
168 rd_n : out std_logic;
169 wr_n : out std_logic;
171 vram_ad : inout std_logic_vector (7 downto 0);
172 vram_a : out std_logic_vector (13 downto 8);
174 vga_clk : in std_logic;
175 h_sync_n : out std_logic;
176 v_sync_n : out std_logic;
177 r : out std_logic_vector(3 downto 0);
178 g : out std_logic_vector(3 downto 0);
179 b : out std_logic_vector(3 downto 0)
183 component v_address_decoder
184 generic (abus_size : integer := 14; dbus_size : integer := 8);
185 port ( clk : in std_logic;
186 mem_clk : in std_logic;
190 v_addr : in std_logic_vector (13 downto 0);
191 v_data : in std_logic_vector (7 downto 0);
192 nt_v_mirror : in std_logic;
193 pt_ce_n : out std_logic;
194 nt0_ce_n : out std_logic;
195 nt1_ce_n : out std_logic
200 generic (abus_size : integer := 13; dbus_size : integer := 8);
203 ce_n : in std_logic; --active low.
204 addr : in std_logic_vector (abus_size - 1 downto 0);
205 data : out std_logic_vector (dbus_size - 1 downto 0);
206 nt_v_mirror : out std_logic
214 port ( c : in std_logic;
217 d : in std_logic_vector(dsize - 1 downto 0);
218 q : out std_logic_vector(dsize - 1 downto 0)
223 port ( clk : in std_logic;
225 rst_n : in std_logic;
226 r_nw : inout std_logic;
227 cpu_addr : inout std_logic_vector (15 downto 0);
228 cpu_d : inout std_logic_vector (7 downto 0);
233 constant data_size : integer := 8;
234 constant addr_size : integer := 16;
235 constant vram_size14 : integer := 14;
237 constant ram_2k : integer := 11; --2k = 11 bit width.
238 constant rom_32k : integer := 15; --32k = 15 bit width.
239 constant rom_8k : integer := 13; --8k = 13 bit width. (for test use)
240 constant vram_1k : integer := 10; --1k = 10 bit width.
241 constant chr_rom_8k : integer := 13; --32k = 15 bit width.
243 signal cpu_clk : std_logic;
244 signal ppu_clk : std_logic;
245 signal mem_clk : std_logic;
246 signal vga_clk : std_logic;
248 signal rdy, irq_n, nmi_n, dbe, r_nw : std_logic;
249 signal phi1, phi2 : std_logic;
250 signal addr : std_logic_vector( addr_size - 1 downto 0);
251 signal d_io : std_logic_vector( data_size - 1 downto 0);
253 signal rom_ce_n : std_logic;
254 signal ram_ce_n : std_logic;
255 signal ram_oe_n : std_logic;
256 signal ppu_ce_n : std_logic;
257 signal apu_ce_n : std_logic;
259 signal rd_n : std_logic;
260 signal wr_n : std_logic;
261 signal ale : std_logic;
262 signal vram_ad : std_logic_vector (7 downto 0);
263 signal vram_a : std_logic_vector (13 downto 8);
264 signal v_addr : std_logic_vector (13 downto 0);
265 signal nt_v_mirror : std_logic;
266 signal pt_ce_n : std_logic;
267 signal nt0_ce_n : std_logic;
268 signal nt1_ce_n : std_logic;
270 signal ale_n : std_logic;
272 signal dbg_disp_ptn_h, dbg_disp_ptn_l : std_logic_vector (15 downto 0);
273 signal dbg_pcl, dbg_pch : std_logic_vector(7 downto 0);
274 signal dbg_stat_we_n : std_logic;
275 signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w : std_logic_vector (7 downto 0);
277 signal dbg_vga_clk : std_logic;
278 signal dbg_ppu_addr_we_n : std_logic;
279 signal dbg_ppu_clk_cnt : std_logic_vector(1 downto 0);
280 signal dbg_ppu_addr_dummy : std_logic_vector (13 downto 0);
281 signal dbg_nes_x : std_logic_vector (8 downto 0);
282 signal dbg_vga_x : std_logic_vector (9 downto 0);
283 signal dbg_nes_y : std_logic_vector (8 downto 0);
284 signal dbg_vga_y : std_logic_vector (9 downto 0);
285 signal dbg_plt_ce_rn_wn : std_logic_vector (2 downto 0);
286 signal dbg_plt_addr : std_logic_vector (4 downto 0);
287 signal dbg_plt_data : std_logic_vector (7 downto 0);
288 signal dbg_p_oam_ce_rn_wn : std_logic_vector (2 downto 0);
289 signal dbg_p_oam_addr : std_logic_vector (7 downto 0);
290 signal dbg_p_oam_data : std_logic_vector (7 downto 0);
291 signal dbg_s_oam_ce_rn_wn : std_logic_vector (2 downto 0);
292 signal dbg_s_oam_addr : std_logic_vector (4 downto 0);
293 signal dbg_s_oam_data : std_logic_vector (7 downto 0);
294 signal dbg_emu_ppu_clk : std_logic;
295 signal dbg_ppu_data_dummy : std_logic_vector (7 downto 0);
296 signal dbg_ppu_status_dummy : std_logic_vector (7 downto 0);
297 signal dbg_ppu_scrl_x_dummy : std_logic_vector (7 downto 0);
298 signal dbg_ppu_scrl_y_dummy : std_logic_vector (7 downto 0);
299 signal dbg_disp_ptn_h_dummy, dbg_disp_ptn_l_dummy : std_logic_vector (15 downto 0);
301 signal dbg_dec_val : std_logic_vector (7 downto 0);
\r
302 signal dbg_int_dbus : std_logic_vector (7 downto 0);
\r
303 signal dbg_instruction_dummy : std_logic_vector(7 downto 0);
304 signal dbg_int_d_bus_dummy : std_logic_vector(7 downto 0);
305 signal dbg_exec_cycle_dummy : std_logic_vector (5 downto 0);
306 signal dbg_ea_carry_dummy : std_logic;
307 signal dbg_status_dummy : std_logic_vector(7 downto 0);
308 signal dbg_sp_dummy, dbg_x_dummy, dbg_y_dummy, dbg_acc_dummy : std_logic_vector(7 downto 0);
\r
311 component counter_register
\r
313 dsize : integer := 8;
\r
316 port ( clk : in std_logic;
\r
317 rst_n : in std_logic;
\r
318 ce_n : in std_logic;
\r
319 we_n : in std_logic;
\r
320 d : in std_logic_vector(dsize - 1 downto 0);
\r
321 q : out std_logic_vector(dsize - 1 downto 0)
\r
324 signal loop24 : std_logic_vector (23 downto 0);
\r
330 --ppu/cpu clock generator
331 clock_inst : clock_divider port map
332 (base_clk, rst_n, cpu_clk, ppu_clk, mem_clk, vga_clk);
334 addr_dec_inst : address_decoder generic map (addr_size, data_size)
\r
335 port map (phi2, mem_clk, r_nw, addr, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
\r
337 --mos 6502 cpu instance
338 cpu_inst : mos6502 generic map (data_size, addr_size)
347 dbg_pcl, dbg_pch, dbg_sp_dummy, dbg_x_dummy, dbg_y, dbg_acc,
353 dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w,
356 rst_n, irq_n, nmi_n, dbe, r_nw,
357 phi1, phi2, addr, d_io);
359 --main ROM/RAM instance
360 -- prg_rom_inst : prg_rom generic map (rom_32k, data_size)
361 -- port map (mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);
363 prg_rom_inst : prg_rom generic map (rom_8k, data_size)
364 port map (mem_clk, rom_ce_n, addr(rom_8k - 1 downto 0), d_io);
366 ram_oe_n <= not R_nW;
367 prg_ram_inst : ram generic map (ram_2k, data_size)
368 port map (mem_clk, ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
370 -- dbg_exec_cycle(2 downto 1) <= dbg_vga_x(9 downto 8);
371 -- dbg_int_d_bus <= dbg_vga_x(7 downto 0);
372 -- dbg_exec_cycle(0) <= dbg_nes_x(8);
373 -- dbg_instruction <= dbg_nes_x(7 downto 0);
374 -- dbg_exec_cycle(3) <= dbg_emu_ppu_clk;
376 -- dbg_exec_cycle(4) <= dbg_nes_y(8);
377 -- dbg_status <= dbg_nes_y(7 downto 0);
380 -- dbg_ppu_scrl_x(0) <= ale;
381 -- dbg_ppu_scrl_x(1) <= rd_n;
382 -- dbg_ppu_scrl_x(2) <= wr_n;
383 -- dbg_ppu_scrl_x(3) <= nt0_ce_n;
384 -- dbg_ppu_scrl_x(4) <= vga_clk;
385 -- dbg_ppu_scrl_x(5) <= rom_ce_n;
386 -- dbg_ppu_scrl_x(6) <= ram_ce_n;
387 -- dbg_ppu_scrl_x(7) <= addr(15);
388 -- dbg_ppu_scrl_y(2 downto 0) <= dbg_p_oam_ce_rn_wn(2 downto 0);
389 -- dbg_ppu_scrl_y(5 downto 3) <= dbg_plt_ce_rn_wn(2 downto 0);
390 dbg_disp_ptn_l (7 downto 0) <= dbg_p_oam_addr;
391 dbg_disp_ptn_l (15 downto 8) <= dbg_p_oam_data;
393 dbg_cpu_clk <= cpu_clk;
394 dbg_mem_clk <= mem_clk;
398 dbg_vram_ad <= vram_ad ;
\r
399 dbg_vram_a <= vram_a ;
\r
401 dbg_sp(7 downto 6) <= dbg_ppu_clk_cnt;
\r
402 dbg_sp(5 downto 0) <= v_addr (13 downto 8);
\r
403 dbg_x <= v_addr (7 downto 0);
\r
406 -- nmi_n <= dummy_nmi;
407 -- dbg_ppu_ctrl <= dbg_pcl;
408 -- dbg_ppu_mask <= dbg_pch;
410 ppu_inst: ppu port map (
412 dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status ,
414 dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y ,
422 dbg_disp_nt, dbg_disp_attr ,
423 dbg_disp_ptn_h, dbg_disp_ptn_l_dummy ,
461 ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size)
462 port map (ppu_clk, mem_clk, rd_n, wr_n, ale, v_addr, vram_ad,
463 nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);
465 ---VRAM/CHR ROM instances
466 v_addr (13 downto 8) <= vram_a;
468 --transparent d-latch
469 --ale=1 >> addr latch
\r
470 --ale=0 >> addr output.
\r
472 vram_latch : ls373 generic map (data_size)
473 port map(vga_clk, ale_n, ale, vram_ad, v_addr(7 downto 0));
475 vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
476 port map (mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), vram_ad, nt_v_mirror);
478 --name table/attr table
479 vram_nt0 : ram generic map (vram_1k, data_size)
480 port map (mem_clk, nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
482 vram_nt1 : ram generic map (vram_1k, data_size)
483 port map (mem_clk, nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
487 port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
490 -- led_test : counter_register generic map (24) port map
\r
491 -- (base_clk, rst_n, '0', '1', (others=>'0'), loop24);
\r
492 -- dbg_cpu_clk <= loop24(23);
\r
493 -- dbg_ppu_clk <= loop24(22);
\r
494 -- dbg_mem_clk <= loop24(21);
\r