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_index_bus : out std_logic_vector(7 downto 0);
28 -- signal dbg_acc_bus : out std_logic_vector(7 downto 0);
29 signal dbg_status : out std_logic_vector(7 downto 0);
30 -- signal dbg_pcl, dbg_pch : out std_logic_vector(7 downto 0);
31 signal dbg_sp, dbg_x, dbg_y, dbg_acc : out std_logic_vector(7 downto 0);
32 signal dbg_dec_oe_n : out std_logic;
33 signal dbg_dec_val : out std_logic_vector (7 downto 0);
34 signal dbg_int_dbus : out std_logic_vector (7 downto 0);
35 -- signal dbg_status_val : out std_logic_vector (7 downto 0);
36 -- signal dbg_stat_we_n : out std_logic;
37 -- signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w : out std_logic_vector (7 downto 0);
40 signal dbg_ppu_ce_n : out std_logic;
41 signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
42 signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
43 signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
44 signal dbg_disp_nt, dbg_disp_attr : out std_logic_vector (7 downto 0);
45 signal dbg_disp_ptn_h, dbg_disp_ptn_l : out std_logic_vector (15 downto 0);
46 signal dummy_nmi : in std_logic;
50 base_clk : in std_logic;
52 joypad1 : in std_logic_vector(7 downto 0);
53 joypad2 : in std_logic_vector(7 downto 0);
54 h_sync_n : out std_logic;
55 v_sync_n : out std_logic;
56 r : out std_logic_vector(3 downto 0);
57 g : out std_logic_vector(3 downto 0);
58 b : out std_logic_vector(3 downto 0)
62 architecture rtl of de1_nes is
64 generic ( dsize : integer := 8;
68 signal dbg_instruction : out std_logic_vector(7 downto 0);
69 signal dbg_int_d_bus : out std_logic_vector(7 downto 0);
70 signal dbg_exec_cycle : out std_logic_vector (5 downto 0);
71 signal dbg_ea_carry : out std_logic;
72 -- signal dbg_index_bus : out std_logic_vector(7 downto 0);
73 -- signal dbg_acc_bus : out std_logic_vector(7 downto 0);
74 signal dbg_status : out std_logic_vector(7 downto 0);
75 signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc : out std_logic_vector(7 downto 0);
76 signal dbg_dec_oe_n : out std_logic;
77 signal dbg_dec_val : out std_logic_vector (7 downto 0);
78 signal dbg_int_dbus : out std_logic_vector (7 downto 0);
79 -- signal dbg_status_val : out std_logic_vector (7 downto 0);
80 signal dbg_stat_we_n : out std_logic;
81 signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w : out std_logic_vector (7 downto 0);
83 input_clk : in std_logic; --phi0 input pin.
92 addr : out std_logic_vector ( asize - 1 downto 0);
93 d_io : inout std_logic_vector ( dsize - 1 downto 0)
97 component clock_divider
98 port ( base_clk : in std_logic;
99 reset_n : in std_logic;
100 cpu_clk : out std_logic;
101 ppu_clk : out std_logic;
102 mem_clk : out std_logic;
103 vga_clk : out std_logic
107 component address_decoder
108 generic (abus_size : integer := 16; dbus_size : integer := 8);
109 port ( phi2 : in std_logic;
110 mem_clk : in std_logic;
112 addr : in std_logic_vector (abus_size - 1 downto 0);
113 rom_ce_n : out std_logic;
114 ram_ce_n : out std_logic;
115 ppu_ce_n : out std_logic;
116 apu_ce_n : out std_logic
121 generic (abus_size : integer := 16; dbus_size : integer := 8);
124 ce_n, oe_n, we_n : in std_logic; --select pin active low.
125 addr : in std_logic_vector (abus_size - 1 downto 0);
126 d_io : inout std_logic_vector (dbus_size - 1 downto 0)
131 generic (abus_size : integer := 15; dbus_size : integer := 8);
134 ce_n : in std_logic; --active low.
135 addr : in std_logic_vector (abus_size - 1 downto 0);
136 data : out std_logic_vector (dbus_size - 1 downto 0)
141 signal dbg_ppu_ce_n : out std_logic;
142 signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
143 signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
144 signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
146 signal dbg_ppu_clk : out std_logic;
147 signal dbg_nes_x : out std_logic_vector (8 downto 0);
148 signal dbg_vga_x : out std_logic_vector (9 downto 0);
149 signal dbg_disp_nt, dbg_disp_attr : out std_logic_vector (7 downto 0);
150 signal dbg_disp_ptn_h, dbg_disp_ptn_l : out std_logic_vector (15 downto 0);
151 signal dbg_plt_ce_rn_wn : out std_logic_vector (2 downto 0);
152 signal dbg_plt_addr : out std_logic_vector (4 downto 0);
153 signal dbg_plt_data : out std_logic_vector (7 downto 0);
154 signal dbg_p_oam_ce_rn_wn : out std_logic_vector (2 downto 0);
155 signal dbg_p_oam_addr : out std_logic_vector (7 downto 0);
156 signal dbg_p_oam_data : out std_logic_vector (7 downto 0);
157 signal dbg_s_oam_ce_rn_wn : out std_logic_vector (2 downto 0);
158 signal dbg_s_oam_addr : out std_logic_vector (4 downto 0);
159 signal dbg_s_oam_data : out std_logic_vector (7 downto 0);
161 signal dbg_ppu_addr_we_n : out std_logic;
162 signal dbg_ppu_clk_cnt : out std_logic_vector(1 downto 0);
164 ppu_clk : in std_logic;
165 mem_clk : in std_logic;
167 rst_n : in std_logic;
169 cpu_addr : in std_logic_vector (2 downto 0);
170 cpu_d : inout std_logic_vector (7 downto 0);
172 vblank_n : out std_logic;
173 rd_n : out std_logic;
174 wr_n : out std_logic;
176 vram_ad : inout std_logic_vector (7 downto 0);
177 vram_a : out std_logic_vector (13 downto 8);
179 vga_clk : in std_logic;
180 h_sync_n : out std_logic;
181 v_sync_n : out std_logic;
182 r : out std_logic_vector(3 downto 0);
183 g : out std_logic_vector(3 downto 0);
184 b : out std_logic_vector(3 downto 0)
188 component v_address_decoder
189 generic (abus_size : integer := 14; dbus_size : integer := 8);
190 port ( clk : in std_logic;
191 mem_clk : in std_logic;
195 v_addr : in std_logic_vector (13 downto 0);
196 v_data : in std_logic_vector (7 downto 0);
197 nt_v_mirror : in std_logic;
198 pt_ce_n : out std_logic;
199 nt0_ce_n : out std_logic;
200 nt1_ce_n : out std_logic
205 generic (abus_size : integer := 13; dbus_size : integer := 8);
208 ce_n : in std_logic; --active low.
209 addr : in std_logic_vector (abus_size - 1 downto 0);
210 data : out std_logic_vector (dbus_size - 1 downto 0);
211 nt_v_mirror : out std_logic
219 port ( c : in std_logic;
222 d : in std_logic_vector(dsize - 1 downto 0);
223 q : out std_logic_vector(dsize - 1 downto 0)
228 port ( clk : in std_logic;
230 rst_n : in std_logic;
231 r_nw : inout std_logic;
232 cpu_addr : inout std_logic_vector (15 downto 0);
233 cpu_d : inout std_logic_vector (7 downto 0);
238 constant data_size : integer := 8;
239 constant addr_size : integer := 16;
240 constant vram_size14 : integer := 14;
242 constant ram_2k : integer := 11; --2k = 11 bit width.
243 constant rom_32k : integer := 15; --32k = 15 bit width.
244 constant rom_8k : integer := 13; --8k = 13 bit width. (for test use)
245 constant vram_1k : integer := 10; --1k = 10 bit width.
246 constant chr_rom_8k : integer := 13; --32k = 15 bit width.
248 signal cpu_clk : std_logic;
249 signal ppu_clk : std_logic;
250 signal mem_clk : std_logic;
251 signal vga_clk : std_logic;
253 signal rdy, irq_n, nmi_n, dbe, r_nw : std_logic;
254 signal phi1, phi2 : 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 : std_logic;
267 signal vram_ad : std_logic_vector (7 downto 0);
268 signal vram_a : std_logic_vector (13 downto 8);
269 signal v_addr : std_logic_vector (13 downto 0);
270 signal nt_v_mirror : std_logic;
271 signal pt_ce_n : std_logic;
272 signal nt0_ce_n : std_logic;
273 signal nt1_ce_n : std_logic;
275 signal ale_n : std_logic;
277 -- signal dbg_disp_nt, dbg_disp_attr : std_logic_vector (7 downto 0);
278 -- signal dbg_disp_ptn_h, dbg_disp_ptn_l : std_logic_vector (15 downto 0);
279 signal dbg_pcl, dbg_pch : std_logic_vector(7 downto 0);
280 signal dbg_stat_we_n : std_logic;
281 signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w : std_logic_vector (7 downto 0);
283 signal dbg_ppu_addr_we_n : std_logic;
284 signal dbg_ppu_clk_cnt : std_logic_vector(1 downto 0);
285 signal dbg_ppu_addr_dummy : std_logic_vector (13 downto 0);
286 signal dbg_nes_x : std_logic_vector (8 downto 0);
287 signal dbg_vga_x : std_logic_vector (9 downto 0);
288 signal dbg_plt_ce_rn_wn : std_logic_vector (2 downto 0);
289 signal dbg_plt_addr : std_logic_vector (4 downto 0);
290 signal dbg_plt_data : std_logic_vector (7 downto 0);
291 signal dbg_p_oam_ce_rn_wn : std_logic_vector (2 downto 0);
292 signal dbg_p_oam_addr : std_logic_vector (7 downto 0);
293 signal dbg_p_oam_data : std_logic_vector (7 downto 0);
294 signal dbg_s_oam_ce_rn_wn : std_logic_vector (2 downto 0);
295 signal dbg_s_oam_addr : std_logic_vector (4 downto 0);
296 signal dbg_s_oam_data : std_logic_vector (7 downto 0);
297 signal dbg_ppu_data_dummy : std_logic_vector (7 downto 0);
298 signal dbg_ppu_status_dummy : std_logic_vector (7 downto 0);
299 signal dbg_ppu_scrl_x_dummy : std_logic_vector (7 downto 0);
300 signal dbg_ppu_scrl_y_dummy : std_logic_vector (7 downto 0);
301 signal dbg_disp_ptn_h_dummy, dbg_disp_ptn_l_dummy : std_logic_vector (15 downto 0);
307 --ppu/cpu clock generator
308 clock_inst : clock_divider port map
309 (base_clk, rst_n, cpu_clk, ppu_clk, mem_clk, vga_clk);
311 --mos 6502 cpu instance
312 cpu_inst : mos6502 generic map (data_size, addr_size)
321 dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc,
327 dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w,
329 cpu_clk, '1', --rdy, -----for testing...
330 rst_n, irq_n, nmi_n, dbe, r_nw,
331 phi1, phi2, addr, d_io);
333 addr_dec_inst : address_decoder generic map (addr_size, data_size)
334 port map (phi2, mem_clk, r_nw, addr, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
336 --main ROM/RAM instance
337 -- prg_rom_inst : prg_rom generic map (rom_32k, data_size)
338 -- port map (mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);
340 prg_rom_inst : prg_rom generic map (rom_8k, data_size)
341 port map (mem_clk, rom_ce_n, addr(rom_8k - 1 downto 0), d_io);
343 ram_oe_n <= not R_nW;
344 prg_ram_inst : ram generic map (ram_2k, data_size)
345 port map (mem_clk, ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
347 -- dbg_ppu_addr <= "00000" & dbg_nes_x;
348 dbg_ppu_scrl_x(0) <= ale;
349 dbg_ppu_scrl_x(1) <= rd_n;
350 dbg_ppu_scrl_x(2) <= wr_n;
351 dbg_ppu_scrl_x(3) <= nt0_ce_n;
352 dbg_ppu_scrl_x(4) <= vga_clk;
353 dbg_ppu_scrl_x(5) <= rom_ce_n;
354 dbg_ppu_scrl_x(6) <= ram_ce_n;
355 dbg_ppu_scrl_x(7) <= addr(15);
356 dbg_ppu_scrl_y(2 downto 0) <= dbg_p_oam_ce_rn_wn(2 downto 0);
357 dbg_ppu_scrl_y(5 downto 3) <= dbg_plt_ce_rn_wn(2 downto 0);
358 -- dbg_disp_ptn_l (7 downto 0) <= dbg_p_oam_addr;
359 -- dbg_disp_ptn_l (15 downto 8) <= dbg_p_oam_data;
361 dbg_cpu_clk <= cpu_clk;
362 dbg_mem_clk <= mem_clk;
366 dbg_vram_ad <= vram_ad ;
367 dbg_disp_ptn_l <= "00" & v_addr ;
368 dbg_disp_ptn_h <= "000" & dbg_plt_addr & dbg_plt_data;
369 -- nmi_n <= dummy_nmi;
370 -- dbg_ppu_ctrl <= dbg_pcl;
371 -- dbg_ppu_mask <= dbg_pch;
373 ppu_inst: ppu port map (
375 dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status ,
377 dbg_ppu_data, dbg_ppu_scrl_x_dummy, dbg_ppu_scrl_y_dummy ,
382 dbg_disp_nt, dbg_disp_attr ,
383 dbg_disp_ptn_h_dummy, dbg_disp_ptn_l_dummy ,
420 ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size)
421 port map (ppu_clk, mem_clk, rd_n, wr_n, ale, v_addr, vram_ad,
422 nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);
424 ---VRAM/CHR ROM instances
425 v_addr (13 downto 8) <= vram_a;
427 --transparent d-latch
429 vram_latch : ls373 generic map (data_size)
430 port map(vga_clk, ale_n, ale, vram_ad, v_addr(7 downto 0));
432 vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
433 port map (mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), vram_ad, nt_v_mirror);
435 --name table/attr table
436 vram_nt0 : ram generic map (vram_1k, data_size)
437 port map (mem_clk, nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
439 vram_nt1 : ram generic map (vram_1k, data_size)
440 port map (mem_clk, nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
442 -- --APU/DMA instance
444 -- port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);