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;
\r
15 signal dbg_emu_ppu_clk : out std_logic;
\r
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);
\r
24 signal dbg_instruction : out std_logic_vector(7 downto 0);
25 signal dbg_int_d_bus : out std_logic_vector(7 downto 0);
26 signal dbg_exec_cycle : out std_logic_vector (5 downto 0);
27 signal dbg_ea_carry : out std_logic;
28 signal dbg_status : out std_logic_vector(7 downto 0);
29 signal dbg_sp, dbg_x, dbg_y, dbg_acc : out std_logic_vector(7 downto 0);
30 signal dbg_dec_oe_n : out std_logic;
31 signal dbg_dec_val : out std_logic_vector (7 downto 0);
33 signal dbg_int_dbus : out std_logic_vector (7 downto 0);
36 signal dbg_ppu_ce_n : out std_logic;
37 signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
38 signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
39 signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
40 signal dbg_disp_nt, dbg_disp_attr : out std_logic_vector (7 downto 0);
41 signal dbg_disp_ptn_h, dbg_disp_ptn_l : out std_logic_vector (15 downto 0);
42 signal dbg_nmi : out std_logic;
43 signal dummy_nmi : in std_logic;
\r
46 base_clk : in std_logic;
48 joypad1 : in std_logic_vector(7 downto 0);
49 joypad2 : in std_logic_vector(7 downto 0);
50 h_sync_n : out std_logic;
51 v_sync_n : out std_logic;
52 r : out std_logic_vector(3 downto 0);
53 g : out std_logic_vector(3 downto 0);
54 b : out std_logic_vector(3 downto 0);
55 nt_v_mirror : in std_logic
\r
59 architecture rtl of de1_nes is
61 generic ( dsize : integer := 8;
65 signal dbg_instruction : out std_logic_vector(7 downto 0);
66 signal dbg_int_d_bus : out std_logic_vector(7 downto 0);
67 signal dbg_exec_cycle : out std_logic_vector (5 downto 0);
68 signal dbg_ea_carry : out std_logic;
69 signal dbg_status : out std_logic_vector(7 downto 0);
70 signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc : out std_logic_vector(7 downto 0);
71 signal dbg_dec_oe_n : out std_logic;
72 signal dbg_dec_val : out std_logic_vector (7 downto 0);
73 signal dbg_stat_we_n : out std_logic;
74 signal dbg_idl_h, dbg_idl_l : out std_logic_vector (7 downto 0);
76 cpu_clk : in std_logic; --phi0 input pin.
\r
77 dl_cpu_clk : in std_logic; --phi1 delayed clock.
\r
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 emu_ppu_clk : out std_logic;
\r
94 vga_clk : out std_logic;
95 cpu_mem_clk : out std_logic;
\r
96 cpu_recv_clk : out std_logic;
\r
97 emu_ppu_mem_clk : out std_logic
\r
101 component address_decoder
102 generic (abus_size : integer := 16; dbus_size : integer := 8);
104 addr : in std_logic_vector (abus_size - 1 downto 0);
105 rom_ce_n : out std_logic;
106 ram_ce_n : out std_logic;
107 ppu_ce_n : out std_logic;
108 apu_ce_n : out std_logic
113 generic (abus_size : integer := 16; dbus_size : integer := 8);
\r
115 clk : in std_logic;
\r
116 ce_n, oe_n, we_n : in std_logic; --select pin active low.
\r
117 addr : in std_logic_vector (abus_size - 1 downto 0);
\r
118 d_io : inout std_logic_vector (dbus_size - 1 downto 0)
\r
123 generic (abus_size : integer := 16; dbus_size : integer := 8);
\r
125 clk : in std_logic;
\r
126 ce_n, oe_n, we_n : in std_logic; --select pin active low.
\r
127 addr : in std_logic_vector (abus_size - 1 downto 0);
\r
128 d_io : inout std_logic_vector (dbus_size - 1 downto 0)
\r
133 generic (abus_size : integer := 15; dbus_size : integer := 8);
136 ce_n : in std_logic; --active low.
137 addr : in std_logic_vector (abus_size - 1 downto 0);
138 data : out std_logic_vector (dbus_size - 1 downto 0)
143 signal dbg_ppu_ce_n : out std_logic;
144 signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
145 signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
146 signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
148 signal dbg_nes_x : out std_logic_vector (8 downto 0);
149 signal dbg_vga_x : out std_logic_vector (9 downto 0);
150 signal dbg_nes_y : out std_logic_vector (8 downto 0);
151 signal dbg_vga_y : out std_logic_vector (9 downto 0);
152 signal dbg_disp_nt, dbg_disp_attr : out std_logic_vector (7 downto 0);
153 signal dbg_disp_ptn_h, dbg_disp_ptn_l : out std_logic_vector (15 downto 0);
154 signal dbg_plt_ce_rn_wn : out std_logic_vector (2 downto 0);
155 signal dbg_plt_addr : out std_logic_vector (4 downto 0);
156 signal dbg_plt_data : out std_logic_vector (7 downto 0);
157 signal dbg_p_oam_ce_rn_wn : out std_logic_vector (2 downto 0);
158 signal dbg_p_oam_addr : out std_logic_vector (7 downto 0);
159 signal dbg_p_oam_data : out std_logic_vector (7 downto 0);
160 signal dbg_s_oam_ce_rn_wn : out std_logic_vector (2 downto 0);
161 signal dbg_s_oam_addr : out std_logic_vector (4 downto 0);
162 signal dbg_s_oam_data : out std_logic_vector (7 downto 0);
163 signal dbg_s_oam_addr_cpy : out std_logic_vector (4 downto 0);
\r
165 dl_cpu_clk : in std_logic;
\r
166 ppu_clk : in std_logic;
\r
167 vga_clk : in std_logic;
\r
168 emu_ppu_clk : in std_logic;
\r
169 emu_ppu_clk_dl : in std_logic;
\r
171 rst_n : in std_logic;
173 cpu_addr : in std_logic_vector (2 downto 0);
174 cpu_d : inout std_logic_vector (7 downto 0);
176 vblank_n : out std_logic;
177 rd_n : out std_logic;
178 wr_n : out std_logic;
179 ale_n : out std_logic;
180 vram_addr : out std_logic_vector (13 downto 0);
\r
181 vram_data : inout std_logic_vector (7 downto 0);
\r
183 h_sync_n : out std_logic;
184 v_sync_n : out std_logic;
185 r : out std_logic_vector(3 downto 0);
186 g : out std_logic_vector(3 downto 0);
187 b : out std_logic_vector(3 downto 0)
191 component v_address_decoder
192 generic (abus_size : integer := 14; dbus_size : integer := 8);
194 v_addr : in std_logic_vector (13 downto 0);
195 nt_v_mirror : in std_logic;
196 pt_ce_n : out std_logic;
197 nt0_ce_n : out std_logic;
198 nt1_ce_n : out std_logic
203 generic (abus_size : integer := 13; dbus_size : integer := 8);
206 ce_n : in std_logic; --active low.
207 addr : in std_logic_vector (abus_size - 1 downto 0);
208 data : out std_logic_vector (dbus_size - 1 downto 0)
212 component d_flip_flop
\r
214 dsize : integer := 8
\r
216 port ( clk : in std_logic;
\r
217 res_n : in std_logic;
\r
218 set_n : in std_logic;
\r
219 we_n : in std_logic;
\r
220 d : in std_logic_vector (dsize - 1 downto 0);
\r
221 q : out std_logic_vector (dsize - 1 downto 0)
\r
226 port ( clk : in std_logic;
228 rst_n : in std_logic;
229 r_nw : inout std_logic;
230 cpu_addr : inout std_logic_vector (15 downto 0);
231 cpu_d : inout std_logic_vector (7 downto 0);
236 constant data_size : integer := 8;
237 constant addr_size : integer := 16;
238 constant vram_size14 : integer := 14;
240 constant ram_2k : integer := 11; --2k = 11 bit width.
241 constant rom_32k : integer := 15; --32k = 15 bit width.
242 constant rom_8k : integer := 13; --8k = 13 bit width. (for test use)
243 constant vram_1k : integer := 10; --1k = 10 bit width.
244 constant chr_rom_8k : integer := 13; --32k = 15 bit width.
246 signal cpu_clk : std_logic;
247 signal ppu_clk : std_logic;
248 signal vga_clk : std_logic;
\r
249 signal emu_ppu_clk : std_logic;
\r
250 signal cpu_mem_clk : std_logic;
\r
251 signal cpu_recv_clk : std_logic;
\r
252 signal emu_ppu_mem_clk : std_logic;
\r
254 signal rdy, irq_n, nmi_n, r_nw : std_logic;
255 signal addr : std_logic_vector( addr_size - 1 downto 0);
256 signal d_io : std_logic_vector( data_size - 1 downto 0);
258 signal rom_ce_n : std_logic;
259 signal ram_ce_n : std_logic;
260 signal ram_oe_n : std_logic;
261 signal ppu_ce_n : std_logic;
262 signal apu_ce_n : std_logic;
264 signal rd_n : std_logic;
265 signal wr_n : std_logic;
266 signal ale_n : std_logic;
\r
267 signal v_addr : std_logic_vector (13 downto 0);
\r
268 signal v_addr_ppu : std_logic_vector (13 downto 0);
\r
269 signal v_data : std_logic_vector (7 downto 0);
\r
270 signal pt_ce_n : std_logic;
271 signal nt0_ce_n : std_logic;
272 signal nt1_ce_n : std_logic;
274 signal dbg_pcl, dbg_pch : std_logic_vector(7 downto 0);
275 signal dbg_stat_we_n : std_logic;
276 signal dbg_idl_h, dbg_idl_l : std_logic_vector (7 downto 0);
278 signal dbg_vga_clk : std_logic;
279 signal dbg_ppu_addr_dummy : std_logic_vector (13 downto 0);
280 signal dbg_nes_x : std_logic_vector (8 downto 0);
281 signal dbg_vga_x : std_logic_vector (9 downto 0);
282 signal dbg_nes_y : std_logic_vector (8 downto 0);
283 signal dbg_vga_y : std_logic_vector (9 downto 0);
284 signal dbg_plt_ce_rn_wn : std_logic_vector (2 downto 0);
285 signal dbg_plt_addr : std_logic_vector (4 downto 0);
286 signal dbg_plt_data : std_logic_vector (7 downto 0);
287 signal dbg_p_oam_ce_rn_wn : std_logic_vector (2 downto 0);
288 signal dbg_p_oam_addr : std_logic_vector (7 downto 0);
289 signal dbg_p_oam_data : std_logic_vector (7 downto 0);
290 signal dbg_s_oam_ce_rn_wn : std_logic_vector (2 downto 0);
291 signal dbg_s_oam_addr : std_logic_vector (4 downto 0);
292 signal dbg_s_oam_data : std_logic_vector (7 downto 0);
293 signal dbg_s_oam_addr_cpy : std_logic_vector (4 downto 0);
\r
294 signal dbg_ppu_data_dummy : std_logic_vector (7 downto 0);
295 signal dbg_ppu_status_dummy : std_logic_vector (7 downto 0);
296 signal dbg_ppu_scrl_x_dummy : std_logic_vector (7 downto 0);
297 signal dbg_ppu_scrl_y_dummy : std_logic_vector (7 downto 0);
298 signal dbg_disp_ptn_h_dummy, dbg_disp_ptn_l_dummy : std_logic_vector (15 downto 0);
300 signal dbg_instruction_dummy : std_logic_vector(7 downto 0);
301 signal dbg_int_d_bus_dummy : std_logic_vector(7 downto 0);
302 signal dbg_exec_cycle_dummy : std_logic_vector (5 downto 0);
303 signal dbg_ea_carry_dummy : std_logic;
304 signal dbg_status_dummy : std_logic_vector(7 downto 0);
305 signal dbg_sp_dummy, dbg_x_dummy, dbg_y_dummy, dbg_acc_dummy : std_logic_vector(7 downto 0);
\r
306 signal dbg_dec_val_dummy : std_logic_vector (7 downto 0);
\r
313 --ppu/cpu clock generator
314 clock_inst : clock_divider port map
315 (base_clk, rst_n, cpu_clk, ppu_clk, emu_ppu_clk, vga_clk, cpu_mem_clk, cpu_recv_clk, emu_ppu_mem_clk);
317 addr_dec_inst : address_decoder generic map (addr_size, data_size)
\r
318 port map (addr, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
\r
320 --mos 6502 cpu instance
321 cpu_inst : mos6502 generic map (data_size, addr_size)
323 dbg_instruction_dummy,
325 dbg_exec_cycle_dummy,
328 dbg_pcl, dbg_pch, dbg_sp_dummy, dbg_x_dummy, dbg_y_dummy, dbg_acc_dummy,
332 dbg_idl_h, dbg_idl_l,
334 cpu_clk, cpu_recv_clk, rdy,
335 rst_n, irq_n, nmi_n, r_nw,
338 --main ROM/RAM instance
339 prg_rom_inst : prg_rom generic map (rom_8k, data_size)
340 port map (cpu_mem_clk, rom_ce_n, addr(rom_8k - 1 downto 0), d_io);
342 ram_oe_n <= not R_nW;
343 prg_ram_inst : tss_ram generic map (ram_2k, data_size)
344 port map (cpu_mem_clk, ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
347 ppu_inst: ppu port map (
349 dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status ,
351 dbg_ppu_data, dbg_ppu_scrl_x_dummy, dbg_ppu_scrl_y ,
357 dbg_disp_nt, dbg_disp_attr ,
358 dbg_disp_ptn_h, dbg_disp_ptn_l ,
368 dbg_s_oam_addr_cpy ,
\r
396 ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size)
397 port map (v_addr, nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);
399 --transparent d-latch
400 --ale_n=0 >> addr latch
\r
401 --ale_n=1 >> addr output.
\r
402 vram_latch : d_flip_flop generic map (vram_size14)
403 port map(emu_ppu_mem_clk, rst_n, '1', ale_n, v_addr_ppu, v_addr);
405 vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
406 port map (emu_ppu_mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), v_data);
408 --name table/attr table
409 vram_nt0 : ram generic map (vram_1k, data_size)
410 port map (emu_ppu_mem_clk, nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), v_data);
412 vram_nt1 : ram generic map (vram_1k, data_size)
413 port map (emu_ppu_mem_clk, nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), v_data);
417 port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
421 -----------------------------------------------------------
\r
422 -----------------------------------------------------------
\r
423 ------------------debug pin setting....--------------------
424 -----------------------------------------------------------
\r
425 -----------------------------------------------------------
\r
428 dbg_exec_cycle(0) <= dbg_nes_x(8);
\r
429 dbg_instruction <= dbg_nes_x(7 downto 0);
\r
430 dbg_exec_cycle(4) <= dbg_nes_y(8);
\r
431 dbg_status <= dbg_nes_y(7 downto 0);
\r
433 dbg_ppu_scrl_x(0) <= ale_n;
\r
434 dbg_ppu_scrl_x(1) <= rd_n;
\r
435 dbg_ppu_scrl_x(2) <= wr_n;
\r
436 dbg_ppu_scrl_x(3) <= nt0_ce_n;
\r
438 dbg_sp <= dbg_p_oam_addr;
\r
439 dbg_x <= dbg_p_oam_data;
\r
440 dbg_int_d_bus(4 downto 0) <= dbg_s_oam_addr(4 downto 0);
\r
441 dbg_dec_val <= dbg_s_oam_data;
\r
442 dbg_y(5 downto 0) <= dbg_vga_y(5 downto 0);
\r
443 dbg_acc <= "000" & dbg_s_oam_addr_cpy;
\r
444 --dbg_ppu_scrl_y <= dbg_ppu_scrl_y_dummy;
\r
446 --nmi_n <= dummy_nmi;
\r
450 dbg_cpu_clk <= cpu_clk;
\r
451 dbg_ppu_clk <= ppu_clk;
\r
452 dbg_emu_ppu_clk <= emu_ppu_clk;
\r
453 dbg_cpu_mem_clk <= cpu_mem_clk;
\r
454 dbg_vga_clk <= vga_clk;
\r
458 dbg_v_addr <= v_addr;
\r
459 dbg_v_data <= v_data;
\r
463 -- dbg_ppu_ctrl <= dbg_pcl;
\r
464 -- dbg_ppu_data <= dbg_idl_l;
\r
465 -- dbg_ppu_mask <= dbg_idl_h;
\r