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);
49 base_clk : in std_logic;
51 joypad1 : in std_logic_vector(7 downto 0);
52 joypad2 : in std_logic_vector(7 downto 0);
53 h_sync_n : out std_logic;
54 v_sync_n : out std_logic;
55 r : out std_logic_vector(3 downto 0);
56 g : out std_logic_vector(3 downto 0);
57 b : out std_logic_vector(3 downto 0)
61 architecture rtl of de1_nes is
63 generic ( dsize : integer := 8;
67 signal dbg_instruction : out std_logic_vector(7 downto 0);
68 signal dbg_int_d_bus : out std_logic_vector(7 downto 0);
69 signal dbg_exec_cycle : out std_logic_vector (5 downto 0);
70 signal dbg_ea_carry : out std_logic;
71 -- signal dbg_index_bus : out std_logic_vector(7 downto 0);
72 -- signal dbg_acc_bus : out std_logic_vector(7 downto 0);
73 signal dbg_status : out std_logic_vector(7 downto 0);
74 signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc : out std_logic_vector(7 downto 0);
75 signal dbg_dec_oe_n : out std_logic;
76 signal dbg_dec_val : out std_logic_vector (7 downto 0);
77 signal dbg_int_dbus : out std_logic_vector (7 downto 0);
78 -- signal dbg_status_val : out std_logic_vector (7 downto 0);
79 signal dbg_stat_we_n : out std_logic;
80 signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w : out std_logic_vector (7 downto 0);
82 input_clk : in std_logic; --phi0 input pin.
91 addr : out std_logic_vector ( asize - 1 downto 0);
92 d_io : inout std_logic_vector ( dsize - 1 downto 0)
96 component clock_divider
97 port ( base_clk : in std_logic;
98 reset_n : in std_logic;
99 cpu_clk : out std_logic;
100 ppu_clk : out std_logic;
101 mem_clk : out std_logic;
102 vga_clk : out std_logic
106 component address_decoder
107 generic (abus_size : integer := 16; dbus_size : integer := 8);
108 port ( phi2 : in std_logic;
109 mem_clk : in std_logic;
111 addr : in std_logic_vector (abus_size - 1 downto 0);
112 rom_ce_n : out std_logic;
113 ram_ce_n : out std_logic;
114 ppu_ce_n : out std_logic;
115 apu_ce_n : out std_logic
120 generic (abus_size : integer := 16; dbus_size : integer := 8);
123 ce_n, oe_n, we_n : in std_logic; --select pin active low.
124 addr : in std_logic_vector (abus_size - 1 downto 0);
125 d_io : inout std_logic_vector (dbus_size - 1 downto 0)
130 generic (abus_size : integer := 15; dbus_size : integer := 8);
133 ce_n : in std_logic; --active low.
134 addr : in std_logic_vector (abus_size - 1 downto 0);
135 data : out std_logic_vector (dbus_size - 1 downto 0)
140 signal dbg_ppu_ce_n : out std_logic;
141 signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
142 signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
143 signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
145 signal dbg_ppu_clk : out std_logic;
146 signal dbg_nes_x : out std_logic_vector (8 downto 0);
147 signal dbg_vga_x : out std_logic_vector (9 downto 0);
148 signal dbg_disp_nt, dbg_disp_attr : out std_logic_vector (7 downto 0);
149 signal dbg_disp_ptn_h, dbg_disp_ptn_l : out std_logic_vector (15 downto 0);
150 signal dbg_plt_ce_rn_wn : out std_logic_vector (2 downto 0);
151 signal dbg_plt_addr : out std_logic_vector (4 downto 0);
152 signal dbg_plt_data : out std_logic_vector (7 downto 0);
153 signal dbg_p_oam_ce_rn_wn : out std_logic_vector (2 downto 0);
154 signal dbg_p_oam_addr : out std_logic_vector (7 downto 0);
155 signal dbg_p_oam_data : out std_logic_vector (7 downto 0);
156 signal dbg_s_oam_ce_rn_wn : out std_logic_vector (2 downto 0);
157 signal dbg_s_oam_addr : out std_logic_vector (4 downto 0);
158 signal dbg_s_oam_data : out std_logic_vector (7 downto 0);
160 signal dbg_ppu_addr_we_n : out std_logic;
161 signal dbg_ppu_clk_cnt : out std_logic_vector(1 downto 0);
163 ppu_clk : in std_logic;
164 mem_clk : in std_logic;
166 rst_n : in std_logic;
168 cpu_addr : in std_logic_vector (2 downto 0);
169 cpu_d : inout std_logic_vector (7 downto 0);
171 vblank_n : out std_logic;
172 rd_n : out std_logic;
173 wr_n : out std_logic;
175 vram_ad : inout std_logic_vector (7 downto 0);
176 vram_a : out std_logic_vector (13 downto 8);
178 vga_clk : in std_logic;
179 h_sync_n : out std_logic;
180 v_sync_n : out std_logic;
181 r : out std_logic_vector(3 downto 0);
182 g : out std_logic_vector(3 downto 0);
183 b : out std_logic_vector(3 downto 0)
187 component v_address_decoder
188 generic (abus_size : integer := 14; dbus_size : integer := 8);
189 port ( clk : in std_logic;
190 mem_clk : in std_logic;
194 v_addr : in std_logic_vector (13 downto 0);
195 v_data : in std_logic_vector (7 downto 0);
196 nt_v_mirror : in std_logic;
197 pt_ce_n : out std_logic;
198 nt0_ce_n : out std_logic;
199 nt1_ce_n : out std_logic
204 generic (abus_size : integer := 13; dbus_size : integer := 8);
207 ce_n : in std_logic; --active low.
208 addr : in std_logic_vector (abus_size - 1 downto 0);
209 data : out std_logic_vector (dbus_size - 1 downto 0);
210 nt_v_mirror : out std_logic
218 port ( c : in std_logic;
221 d : in std_logic_vector(dsize - 1 downto 0);
222 q : out std_logic_vector(dsize - 1 downto 0)
227 port ( clk : in std_logic;
229 rst_n : in std_logic;
230 r_nw : inout std_logic;
231 cpu_addr : inout std_logic_vector (15 downto 0);
232 cpu_d : inout std_logic_vector (7 downto 0);
237 constant data_size : integer := 8;
238 constant addr_size : integer := 16;
239 constant vram_size14 : integer := 14;
241 constant ram_2k : integer := 11; --2k = 11 bit width.
242 constant rom_32k : integer := 15; --32k = 15 bit width.
243 constant rom_4k : integer := 12; --4k = 12 bit width. (for test use)
244 constant vram_1k : integer := 10; --1k = 10 bit width.
245 constant chr_rom_8k : integer := 13; --32k = 15 bit width.
247 signal cpu_clk : std_logic;
248 signal ppu_clk : std_logic;
249 signal mem_clk : std_logic;
250 signal vga_clk : std_logic;
252 signal rdy, irq_n, nmi_n, dbe, r_nw : std_logic;
253 signal phi1, phi2 : std_logic;
254 signal addr : std_logic_vector( addr_size - 1 downto 0);
255 signal d_io : std_logic_vector( data_size - 1 downto 0);
257 signal rom_ce_n : std_logic;
258 signal ram_ce_n : std_logic;
259 signal ram_oe_n : std_logic;
260 signal ppu_ce_n : std_logic;
261 signal apu_ce_n : std_logic;
263 signal rd_n : std_logic;
264 signal wr_n : std_logic;
265 signal ale : std_logic;
266 signal vram_ad : std_logic_vector (7 downto 0);
267 signal vram_a : std_logic_vector (13 downto 8);
268 signal v_addr : std_logic_vector (13 downto 0);
269 signal nt_v_mirror : std_logic;
270 signal pt_ce_n : std_logic;
271 signal nt0_ce_n : std_logic;
272 signal nt1_ce_n : std_logic;
274 signal ale_n : std_logic;
276 -- signal dbg_disp_nt, dbg_disp_attr : std_logic_vector (7 downto 0);
277 -- signal dbg_disp_ptn_h, dbg_disp_ptn_l : std_logic_vector (15 downto 0);
278 signal dbg_pcl, dbg_pch : std_logic_vector(7 downto 0);
279 signal dbg_stat_we_n : std_logic;
280 signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w : std_logic_vector (7 downto 0);
282 signal dbg_ppu_addr_we_n : std_logic;
283 signal dbg_ppu_clk_cnt : std_logic_vector(1 downto 0);
284 signal dbg_ppu_addr_dummy : std_logic_vector (13 downto 0);
285 signal dbg_nes_x : std_logic_vector (8 downto 0);
286 signal dbg_vga_x : std_logic_vector (9 downto 0);
287 signal dbg_plt_ce_rn_wn : std_logic_vector (2 downto 0);
288 signal dbg_plt_addr : std_logic_vector (4 downto 0);
289 signal dbg_plt_data : std_logic_vector (7 downto 0);
290 signal dbg_p_oam_ce_rn_wn : std_logic_vector (2 downto 0);
291 signal dbg_p_oam_addr : std_logic_vector (7 downto 0);
292 signal dbg_p_oam_data : std_logic_vector (7 downto 0);
293 signal dbg_s_oam_ce_rn_wn : std_logic_vector (2 downto 0);
294 signal dbg_s_oam_addr : std_logic_vector (4 downto 0);
295 signal dbg_s_oam_data : std_logic_vector (7 downto 0);
296 signal dbg_ppu_data_dummy : std_logic_vector (7 downto 0);
297 signal dbg_ppu_status_dummy : std_logic_vector (7 downto 0);
298 signal dbg_ppu_scrl_x_dummy : std_logic_vector (7 downto 0);
299 signal dbg_ppu_scrl_y_dummy : std_logic_vector (7 downto 0);
300 signal dbg_disp_ptn_h_dummy, dbg_disp_ptn_l_dummy : std_logic_vector (15 downto 0);
306 --ppu/cpu clock generator
307 clock_inst : clock_divider port map
308 (base_clk, rst_n, cpu_clk, ppu_clk, mem_clk, vga_clk);
310 --mos 6502 cpu instance
311 cpu_inst : mos6502 generic map (data_size, addr_size)
320 dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc,
326 dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w,
328 cpu_clk, '1', --rdy, -----for testing...
329 rst_n, irq_n, nmi_n, dbe, r_nw,
330 phi1, phi2, addr, d_io);
332 addr_dec_inst : address_decoder generic map (addr_size, data_size)
333 port map (phi2, mem_clk, r_nw, addr, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
335 --main ROM/RAM instance
336 -- prg_rom_inst : prg_rom generic map (rom_32k, data_size)
337 -- port map (mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);
339 prg_rom_inst : prg_rom generic map (rom_4k, data_size)
340 port map (mem_clk, rom_ce_n, addr(rom_4k - 1 downto 0), d_io);
342 ram_oe_n <= not R_nW;
343 prg_ram_inst : ram generic map (ram_2k, data_size)
344 port map (mem_clk, ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
346 -- dbg_ppu_addr <= "00000" & dbg_nes_x;
347 dbg_ppu_scrl_x(0) <= ale;
348 dbg_ppu_scrl_x(1) <= rd_n;
349 dbg_ppu_scrl_x(2) <= wr_n;
350 dbg_ppu_scrl_x(3) <= nt0_ce_n;
351 dbg_ppu_scrl_x(4) <= vga_clk;
352 dbg_ppu_scrl_x(5) <= rom_ce_n;
353 dbg_ppu_scrl_x(6) <= ram_ce_n;
354 dbg_ppu_scrl_x(7) <= addr(15);
355 dbg_ppu_scrl_y(2 downto 0) <= dbg_p_oam_ce_rn_wn(2 downto 0);
356 dbg_ppu_scrl_y(5 downto 3) <= dbg_plt_ce_rn_wn(2 downto 0);
357 -- dbg_disp_ptn_l (7 downto 0) <= dbg_p_oam_addr;
358 -- dbg_disp_ptn_l (15 downto 8) <= dbg_p_oam_data;
360 dbg_cpu_clk <= cpu_clk;
361 dbg_mem_clk <= mem_clk;
365 dbg_vram_ad <= vram_ad ;
366 dbg_disp_ptn_l <= "00" & v_addr ;
367 dbg_disp_ptn_h <= "000" & dbg_plt_addr & dbg_plt_data;
369 -- dbg_ppu_ctrl <= dbg_pcl;
370 -- dbg_ppu_mask <= dbg_pch;
372 ppu_inst: ppu port map (
374 dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status ,
376 dbg_ppu_data, dbg_ppu_scrl_x_dummy, dbg_ppu_scrl_y_dummy ,
381 dbg_disp_nt, dbg_disp_attr ,
382 dbg_disp_ptn_h_dummy, dbg_disp_ptn_l_dummy ,
419 ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size)
420 port map (ppu_clk, mem_clk, rd_n, wr_n, ale, v_addr, vram_ad,
421 nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);
423 ---VRAM/CHR ROM instances
424 v_addr (13 downto 8) <= vram_a;
426 --transparent d-latch
428 vram_latch : ls373 generic map (data_size)
429 port map(vga_clk, ale_n, ale, vram_ad, v_addr(7 downto 0));
431 vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
432 port map (mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), vram_ad, nt_v_mirror);
434 --name table/attr table
435 vram_nt0 : ram generic map (vram_1k, data_size)
436 port map (mem_clk, nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
438 vram_nt1 : ram generic map (vram_1k, data_size)
439 port map (mem_clk, nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
441 -- --APU/DMA instance
443 -- port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);