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_emu_ppu_clk : out std_logic;
16 signal dbg_cpu_mem_clk : out std_logic;
17 signal dbg_r_nw : out std_logic;
18 signal dbg_addr : out std_logic_vector( 16 - 1 downto 0);
19 signal dbg_d_io : out std_logic_vector( 8 - 1 downto 0);
20 signal dbg_v_addr : out std_logic_vector (13 downto 0);
21 signal dbg_v_data : out std_logic_vector (7 downto 0);
24 signal dbg_instruction : 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);
30 signal dbg_ppu_ce_n : out std_logic;
31 signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
32 signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
33 signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
34 signal dbg_nmi : out std_logic;
36 --logic analyzer reference clock
37 signal dbg_base_clk: out std_logic;
\r
40 base_clk : in std_logic;
42 joypad1 : in std_logic_vector(7 downto 0);
43 joypad2 : in std_logic_vector(7 downto 0);
44 h_sync_n : out std_logic;
45 v_sync_n : out std_logic;
46 r : out std_logic_vector(3 downto 0);
47 g : out std_logic_vector(3 downto 0);
48 b : out std_logic_vector(3 downto 0);
49 nt_v_mirror : in std_logic
\r
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);
\r
61 signal dbg_exec_cycle : out std_logic_vector (5 downto 0);
62 signal dbg_ea_carry : out std_logic;
63 signal dbg_status : out std_logic_vector(7 downto 0);
64 signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc : out std_logic_vector(7 downto 0);
65 signal dbg_dec_oe_n : out std_logic;
66 signal dbg_dec_val : out std_logic_vector (7 downto 0);
67 signal dbg_stat_we_n : out std_logic;
68 signal dbg_idl_h, dbg_idl_l : out std_logic_vector (7 downto 0);
70 cpu_clk : in std_logic; --phi0 input pin.
71 dl_cpu_clk : in std_logic; --phi1 delayed clock.
77 addr : out std_logic_vector ( asize - 1 downto 0);
78 d_io : inout std_logic_vector ( dsize - 1 downto 0)
82 component clock_divider
83 port ( base_clk : in std_logic;
84 reset_n : in std_logic;
85 cpu_clk : out std_logic;
86 ppu_clk : out std_logic;
87 emu_ppu_clk : out std_logic;
88 vga_clk : out std_logic;
89 cpu_mem_clk : out std_logic;
90 cpu_recv_clk : out std_logic;
91 emu_ppu_mem_clk : out std_logic
95 component address_decoder
96 generic (abus_size : integer := 16; dbus_size : integer := 8);
98 addr : in std_logic_vector (abus_size - 1 downto 0);
99 rom_ce_n : out std_logic;
100 ram_ce_n : out std_logic;
101 ppu_ce_n : out std_logic;
102 apu_ce_n : out std_logic
107 generic (abus_size : integer := 16; dbus_size : integer := 8);
110 ce_n, oe_n, we_n : in std_logic; --select pin active low.
111 addr : in std_logic_vector (abus_size - 1 downto 0);
112 d_io : inout std_logic_vector (dbus_size - 1 downto 0)
117 generic (abus_size : integer := 15; dbus_size : integer := 8);
120 ce_n : in std_logic; --active low.
121 addr : in std_logic_vector (abus_size - 1 downto 0);
122 data : out std_logic_vector (dbus_size - 1 downto 0)
127 signal dbg_ppu_ce_n : out std_logic;
128 signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
129 signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
130 signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
132 signal dbg_nes_x : out std_logic_vector (8 downto 0);
133 signal dbg_vga_x : out std_logic_vector (9 downto 0);
134 signal dbg_nes_y : out std_logic_vector (8 downto 0);
135 signal dbg_vga_y : out std_logic_vector (9 downto 0);
136 signal dbg_disp_nt, dbg_disp_attr : out std_logic_vector (7 downto 0);
137 signal dbg_disp_ptn_h, dbg_disp_ptn_l : out std_logic_vector (15 downto 0);
138 signal dbg_plt_ce_rn_wn : out std_logic_vector (2 downto 0);
139 signal dbg_plt_addr : out std_logic_vector (4 downto 0);
140 signal dbg_plt_data : out std_logic_vector (7 downto 0);
141 signal dbg_p_oam_ce_rn_wn : out std_logic_vector (2 downto 0);
142 signal dbg_p_oam_addr : out std_logic_vector (7 downto 0);
143 signal dbg_p_oam_data : out std_logic_vector (7 downto 0);
144 signal dbg_s_oam_ce_rn_wn : out std_logic_vector (2 downto 0);
145 signal dbg_s_oam_addr : out std_logic_vector (4 downto 0);
146 signal dbg_s_oam_data : out std_logic_vector (7 downto 0);
148 dl_cpu_clk : in std_logic;
149 ppu_clk : in std_logic;
150 vga_clk : in std_logic;
151 emu_ppu_clk : in std_logic;
153 rst_n : in std_logic;
155 cpu_addr : in std_logic_vector (2 downto 0);
156 cpu_d : inout std_logic_vector (7 downto 0);
158 vblank_n : out std_logic;
159 rd_n : out std_logic;
160 wr_n : out std_logic;
161 ale_n : out std_logic;
162 vram_addr : out std_logic_vector (13 downto 0);
163 vram_data : inout std_logic_vector (7 downto 0);
165 h_sync_n : out std_logic;
166 v_sync_n : out std_logic;
167 r : out std_logic_vector(3 downto 0);
168 g : out std_logic_vector(3 downto 0);
169 b : out std_logic_vector(3 downto 0)
173 component v_address_decoder
174 generic (abus_size : integer := 14; dbus_size : integer := 8);
176 v_addr : in std_logic_vector (13 downto 0);
177 nt_v_mirror : in std_logic;
178 pt_ce_n : out std_logic;
179 nt0_ce_n : out std_logic;
180 nt1_ce_n : out std_logic
185 generic (abus_size : integer := 13; dbus_size : integer := 8);
188 ce_n : in std_logic; --active low.
189 addr : in std_logic_vector (abus_size - 1 downto 0);
190 data : out std_logic_vector (dbus_size - 1 downto 0)
\r
194 component d_flip_flop
198 port ( clk : in std_logic;
199 res_n : in std_logic;
200 set_n : in std_logic;
202 d : in std_logic_vector (dsize - 1 downto 0);
203 q : out std_logic_vector (dsize - 1 downto 0)
208 port ( clk : in std_logic;
210 rst_n : in std_logic;
211 r_nw : inout std_logic;
212 cpu_addr : inout std_logic_vector (15 downto 0);
213 cpu_d : inout std_logic_vector (7 downto 0);
218 constant data_size : integer := 8;
219 constant addr_size : integer := 16;
220 constant vram_size14 : integer := 14;
222 constant ram_2k : integer := 11; --2k = 11 bit width.
223 constant rom_32k : integer := 15; --32k = 15 bit width.
224 constant rom_8k : integer := 13; --8k = 13 bit width. (for test use)
225 constant vram_1k : integer := 10; --1k = 10 bit width.
226 constant chr_rom_8k : integer := 13; --32k = 15 bit width.
228 signal cpu_clk : std_logic;
229 signal ppu_clk : std_logic;
230 signal vga_clk : std_logic;
231 signal emu_ppu_clk : std_logic;
232 signal cpu_mem_clk : std_logic;
233 signal cpu_recv_clk : std_logic;
234 signal emu_ppu_mem_clk : std_logic;
236 signal rdy, irq_n, nmi_n, r_nw : std_logic;
237 signal addr : std_logic_vector( addr_size - 1 downto 0);
238 signal d_io : std_logic_vector( data_size - 1 downto 0);
240 signal rom_ce_n : std_logic;
241 signal ram_ce_n : std_logic;
242 signal ram_oe_n : std_logic;
243 signal ppu_ce_n : std_logic;
244 signal apu_ce_n : std_logic;
246 signal rd_n : std_logic;
247 signal wr_n : std_logic;
248 signal ale_n : std_logic;
249 signal v_addr : std_logic_vector (13 downto 0);
250 signal v_addr_ppu : std_logic_vector (13 downto 0);
251 signal v_data : std_logic_vector (7 downto 0);
252 signal pt_ce_n : std_logic;
253 signal nt0_ce_n : std_logic;
254 signal nt1_ce_n : std_logic;
256 -- signal dbg_disp_nt, dbg_disp_attr : std_logic_vector (7 downto 0);
\r
257 -- signal dbg_disp_ptn_h, dbg_disp_ptn_l : std_logic_vector (15 downto 0);
258 signal dbg_pcl, dbg_pch : std_logic_vector(7 downto 0);
259 signal dbg_stat_we_n : std_logic;
260 signal dbg_idl_h, dbg_idl_l : std_logic_vector (7 downto 0);
262 signal dbg_vga_clk : std_logic;
263 signal dbg_ppu_addr_dummy : std_logic_vector (13 downto 0);
264 signal dbg_nes_x : std_logic_vector (8 downto 0);
265 signal dbg_vga_x : std_logic_vector (9 downto 0);
266 signal dbg_nes_y : std_logic_vector (8 downto 0);
267 signal dbg_vga_y : std_logic_vector (9 downto 0);
268 signal dbg_plt_ce_rn_wn : std_logic_vector (2 downto 0);
269 signal dbg_plt_addr : std_logic_vector (4 downto 0);
270 signal dbg_plt_data : std_logic_vector (7 downto 0);
271 signal dbg_p_oam_ce_rn_wn : std_logic_vector (2 downto 0);
272 signal dbg_p_oam_addr : std_logic_vector (7 downto 0);
273 signal dbg_p_oam_data : std_logic_vector (7 downto 0);
274 signal dbg_s_oam_ce_rn_wn : std_logic_vector (2 downto 0);
275 signal dbg_s_oam_addr : std_logic_vector (4 downto 0);
276 signal dbg_s_oam_data : std_logic_vector (7 downto 0);
277 signal dbg_ppu_data_dummy : std_logic_vector (7 downto 0);
278 signal dbg_ppu_status_dummy : std_logic_vector (7 downto 0);
279 signal dbg_ppu_scrl_x_dummy : std_logic_vector (7 downto 0);
280 signal dbg_ppu_scrl_y_dummy : std_logic_vector (7 downto 0);
281 signal dbg_disp_ptn_h_dummy, dbg_disp_ptn_l_dummy : std_logic_vector (15 downto 0);
283 signal dbg_instruction_dummy : std_logic_vector(7 downto 0);
284 signal dbg_int_d_bus_dummy : std_logic_vector(7 downto 0);
\r
285 signal dbg_exec_cycle_dummy : std_logic_vector (5 downto 0);
286 signal dbg_ea_carry_dummy : std_logic;
287 signal dbg_status_dummy : std_logic_vector(7 downto 0);
288 signal dbg_sp_dummy, dbg_x_dummy, dbg_y_dummy, dbg_acc_dummy : std_logic_vector(7 downto 0);
\r
289 signal dbg_dec_oe_n : std_logic;
\r
290 signal dbg_dec_val : std_logic_vector (7 downto 0);
\r
291 signal dbg_int_d_bus : std_logic_vector(7 downto 0);
\r
292 signal dbg_sp, dbg_x, dbg_y, dbg_acc : std_logic_vector(7 downto 0);
\r
293 signal dbg_disp_nt, dbg_disp_attr : std_logic_vector (7 downto 0);
\r
294 signal dbg_disp_ptn_h, dbg_disp_ptn_l : std_logic_vector (15 downto 0);
\r
297 component counter_register
\r
299 dsize : integer := 8;
\r
302 port ( clk : in std_logic;
\r
303 rst_n : in std_logic;
\r
304 ce_n : in std_logic;
\r
305 we_n : in std_logic;
\r
306 d : in std_logic_vector(dsize - 1 downto 0);
\r
307 q : out std_logic_vector(dsize - 1 downto 0)
\r
310 signal loop24 : std_logic_vector (23 downto 0);
\r
311 signal clock_counter : std_logic_vector (63 downto 0);
\r
317 --ppu/cpu clock generator
318 clock_inst : clock_divider port map
319 (base_clk, rst_n, cpu_clk, ppu_clk, emu_ppu_clk, vga_clk, cpu_mem_clk, cpu_recv_clk, emu_ppu_mem_clk);
321 addr_dec_inst : address_decoder generic map (addr_size, data_size)
\r
322 port map (addr, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
\r
324 --mos 6502 cpu instance
325 cpu_inst : mos6502 generic map (data_size, addr_size)
332 dbg_pcl, dbg_pch, dbg_sp_dummy, dbg_x_dummy, dbg_y, dbg_acc,
\r
336 dbg_idl_h, dbg_idl_l,
338 cpu_clk, cpu_recv_clk, rdy,
339 rst_n, irq_n, nmi_n, r_nw,
342 --main ROM/RAM instance
343 prg_rom_inst : prg_rom generic map (rom_32k, data_size)
344 port map (cpu_mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);
346 ram_oe_n <= not R_nW;
347 prg_ram_inst : ram generic map (ram_2k, data_size)
348 port map (cpu_mem_clk, ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
351 ppu_inst: ppu port map (
353 dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status ,
355 dbg_ppu_data, dbg_ppu_scrl_x_dummy, dbg_ppu_scrl_y_dummy ,
361 dbg_disp_nt, dbg_disp_attr ,
362 dbg_disp_ptn_h, dbg_disp_ptn_l_dummy ,
398 ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size)
399 port map (v_addr, nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);
401 --transparent d-latch
402 --ale_n=0 >> addr latch
\r
403 --ale_n=1 >> addr output.
\r
404 vram_latch : d_flip_flop generic map (vram_size14)
405 port map(emu_ppu_mem_clk, rst_n, '1', ale_n, v_addr_ppu, v_addr);
407 vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
408 port map (emu_ppu_mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), v_data);
410 --name table/attr table
411 vram_nt0 : ram generic map (vram_1k, data_size)
412 port map (emu_ppu_mem_clk, nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), v_data);
414 vram_nt1 : ram generic map (vram_1k, data_size)
415 port map (emu_ppu_mem_clk, nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), v_data);
419 port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
423 -----------------------------------------------------------
\r
424 -----------------------------------------------------------
\r
425 ------------------debug pin setting....--------------------
\r
426 -----------------------------------------------------------
\r
427 -----------------------------------------------------------
\r
428 clock_counter_inst : counter_register generic map (64) port map
\r
429 (cpu_clk, rst_n, '0', '1', (others=>'0'), clock_counter);
\r
431 -- led_test : counter_register generic map (24) port map
\r
432 -- (base_clk, rst_n, '0', '1', (others=>'0'), loop24);
\r
433 -- dbg_cpu_clk <= loop24(23);
\r
434 -- dbg_ppu_clk <= loop24(22);
\r
435 -- dbg_mem_clk <= loop24(21);
\r
439 -- dbg_exec_cycle(0) <= dbg_nes_x(8);
\r
440 -- dbg_instruction <= dbg_nes_x(7 downto 0);
\r
441 -- dbg_exec_cycle(4) <= dbg_nes_y(8);
\r
442 -- dbg_status <= dbg_nes_y(7 downto 0);
\r
444 -- dbg_disp_ptn_l (7 downto 0) <= dbg_p_oam_addr;
\r
445 -- dbg_disp_ptn_l (15 downto 8) <= dbg_p_oam_data;
\r
446 -- dbg_int_d_bus(4 downto 0) <= dbg_s_oam_addr(4 downto 0);
447 -- --dbg_ppu_scrl_y <= dbg_s_oam_data;
448 -- dbg_ppu_scrl_y <= dbg_ppu_scrl_y_dummy;
450 -- dbg_ppu_scrl_x(0) <= ale_n;
451 -- dbg_ppu_scrl_x(1) <= rd_n;
452 -- dbg_ppu_scrl_x(2) <= wr_n;
453 -- dbg_ppu_scrl_x(3) <= nt0_ce_n;
455 --nmi_n <= dummy_nmi;
459 dbg_cpu_clk <= cpu_clk;
\r
460 dbg_ppu_clk <= ppu_clk;
461 dbg_emu_ppu_clk <= emu_ppu_clk;
462 dbg_cpu_mem_clk <= cpu_mem_clk;
\r
463 dbg_vga_clk <= vga_clk;
467 dbg_v_addr <= v_addr;
\r
468 dbg_v_data <= v_data;
\r
472 -- dbg_ppu_ctrl <= dbg_pcl;
\r
473 -- dbg_ppu_data <= dbg_idl_l;
474 -- dbg_ppu_mask <= dbg_idl_h;
\r