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);
22 signal dbg_instruction : out std_logic_vector(7 downto 0);
23 signal dbg_int_d_bus : out std_logic_vector(7 downto 0);
24 signal dbg_exec_cycle : out std_logic_vector (5 downto 0);
25 -- signal dbg_index_bus : out std_logic_vector(7 downto 0);
26 -- signal dbg_acc_bus : out std_logic_vector(7 downto 0);
27 signal dbg_status : out std_logic_vector(7 downto 0);
28 signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc : out std_logic_vector(7 downto 0);
29 signal dbg_dec_oe_n : out std_logic;
30 signal dbg_dec_val : out std_logic_vector (7 downto 0);
31 signal dbg_int_dbus : out std_logic_vector (7 downto 0);
32 -- signal dbg_status_val : out std_logic_vector (7 downto 0);
33 signal dbg_stat_we_n : out std_logic;
34 signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w : out std_logic_vector (7 downto 0);
\r
36 signal dbg_ppu_ce_n : out std_logic;
\r
37 signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
\r
38 signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
\r
39 signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
\r
45 base_clk : in std_logic;
47 joypad1 : in std_logic_vector(7 downto 0);
48 joypad2 : in std_logic_vector(7 downto 0);
49 vga_clk : out std_logic;
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)
58 architecture rtl of de1_nes is
60 generic ( dsize : integer := 8;
64 signal dbg_instruction : out std_logic_vector(7 downto 0);
65 signal dbg_int_d_bus : out std_logic_vector(7 downto 0);
66 signal dbg_exec_cycle : out std_logic_vector (5 downto 0);
67 -- signal dbg_index_bus : out std_logic_vector(7 downto 0);
68 -- signal dbg_acc_bus : out std_logic_vector(7 downto 0);
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_int_dbus : out std_logic_vector (7 downto 0);
74 -- signal dbg_status_val : out std_logic_vector (7 downto 0);
75 signal dbg_stat_we_n : out std_logic;
76 signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w : out std_logic_vector (7 downto 0);
\r
78 input_clk : in std_logic; --phi0 input pin.
87 addr : out std_logic_vector ( asize - 1 downto 0);
88 d_io : inout std_logic_vector ( dsize - 1 downto 0)
92 component clock_divider
93 port ( base_clk : in std_logic;
94 reset_n : in std_logic;
95 cpu_clk : out std_logic;
96 ppu_clk : out std_logic;
97 mem_clk : out std_logic;
98 vga_clk : out std_logic
102 component address_decoder
103 generic (abus_size : integer := 16; dbus_size : integer := 8);
104 port ( phi2 : in std_logic;
105 mem_clk : in std_logic;
107 addr : in std_logic_vector (abus_size - 1 downto 0);
108 d_io : in std_logic_vector (dbus_size - 1 downto 0);
109 rom_ce_n : out std_logic;
110 ram_ce_n : out std_logic;
111 ppu_ce_n : out std_logic;
112 apu_ce_n : out std_logic
117 generic (abus_size : integer := 16; dbus_size : integer := 8);
120 ce_n, oe_n, we_n : in std_logic; --select pin active low.
121 addr : in std_logic_vector (abus_size - 1 downto 0);
122 d_io : inout std_logic_vector (dbus_size - 1 downto 0)
127 generic (abus_size : integer := 15; dbus_size : integer := 8);
130 ce_n : in std_logic; --active low.
131 addr : in std_logic_vector (abus_size - 1 downto 0);
132 data : out std_logic_vector (dbus_size - 1 downto 0)
138 signal dbg_ppu_ce_n : out std_logic;
\r
139 signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
\r
140 signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
\r
141 signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
\r
144 mem_clk : in std_logic;
146 rst_n : in std_logic;
148 cpu_addr : in std_logic_vector (2 downto 0);
149 cpu_d : inout std_logic_vector (7 downto 0);
150 vblank_n : out std_logic;
151 rd_n : out std_logic;
152 wr_n : out std_logic;
154 vram_ad : inout std_logic_vector (7 downto 0);
155 vram_a : out std_logic_vector (13 downto 8);
156 vga_clk : in std_logic;
157 h_sync_n : out std_logic;
158 v_sync_n : out std_logic;
159 r : out std_logic_vector(3 downto 0);
160 g : out std_logic_vector(3 downto 0);
161 b : out std_logic_vector(3 downto 0)
165 component v_address_decoder
166 generic (abus_size : integer := 14; dbus_size : integer := 8);
167 port ( clk : in std_logic;
168 mem_clk : in std_logic;
172 v_addr : in std_logic_vector (13 downto 0);
173 v_data : in std_logic_vector (7 downto 0);
174 nt_v_mirror : in std_logic;
175 pt_ce_n : out std_logic;
176 nt0_ce_n : out std_logic;
177 nt1_ce_n : out std_logic
182 generic (abus_size : integer := 13; dbus_size : integer := 8);
185 ce_n : in std_logic; --active low.
186 addr : in std_logic_vector (abus_size - 1 downto 0);
187 data : out std_logic_vector (dbus_size - 1 downto 0);
188 nt_v_mirror : out std_logic
196 port ( c : in std_logic;
198 d : in std_logic_vector(dsize - 1 downto 0);
199 q : out std_logic_vector(dsize - 1 downto 0)
204 port ( clk : in std_logic;
206 rst_n : in std_logic;
207 r_nw : inout std_logic;
208 cpu_addr : inout std_logic_vector (15 downto 0);
209 cpu_d : inout std_logic_vector (7 downto 0);
214 constant data_size : integer := 8;
215 constant addr_size : integer := 16;
216 constant vram_size14 : integer := 14;
218 constant ram_2k : integer := 11; --2k = 11 bit width.
219 constant rom_32k : integer := 15; --32k = 15 bit width.
220 constant rom_4k : integer := 12; --4k = 12 bit width. (for test use)
221 constant vram_1k : integer := 10; --1k = 10 bit width.
222 constant chr_rom_8k : integer := 13; --32k = 15 bit width.
224 signal cpu_clk : std_logic;
225 signal ppu_clk : std_logic;
226 signal mem_clk : std_logic;
227 signal vga_out_clk : std_logic;
229 signal rdy, irq_n, nmi_n, dbe, r_nw : std_logic;
230 signal phi1, phi2 : std_logic;
231 signal addr : std_logic_vector( addr_size - 1 downto 0);
232 signal d_io : std_logic_vector( data_size - 1 downto 0);
234 signal rom_ce_n : std_logic;
235 signal ram_ce_n : std_logic;
236 signal ram_oe_n : std_logic;
237 signal ppu_ce_n : std_logic;
238 signal apu_ce_n : std_logic;
240 signal rd_n : std_logic;
241 signal wr_n : std_logic;
242 signal ale : std_logic;
243 signal vram_ad : std_logic_vector (7 downto 0);
244 signal vram_a : std_logic_vector (13 downto 8);
245 signal v_addr : std_logic_vector (13 downto 0);
246 signal nt_v_mirror : std_logic;
247 signal pt_ce_n : std_logic;
248 signal nt0_ce_n : std_logic;
249 signal nt1_ce_n : std_logic;
255 vga_clk <= vga_out_clk;
257 --ppu/cpu clock generator
258 clock_inst : clock_divider port map
259 (base_clk, rst_n, cpu_clk, ppu_clk, mem_clk, vga_out_clk);
261 --mos 6502 cpu instance
262 cpu_inst : mos6502 generic map (data_size, addr_size)
270 dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc,
276 dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w,
\r
278 cpu_clk, '1', --rdy, -----for testing...
279 rst_n, irq_n, nmi_n, dbe, r_nw,
280 phi1, phi2, addr, d_io);
282 addr_dec_inst : address_decoder generic map (addr_size, data_size)
283 port map (phi2, mem_clk, r_nw, addr, d_io, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
285 --main ROM/RAM instance
286 -- prg_rom_inst : prg_rom generic map (rom_32k, data_size)
287 -- port map (mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);
288 prg_rom_inst : prg_rom generic map (rom_4k, data_size)
289 port map (mem_clk, rom_ce_n, addr(rom_4k - 1 downto 0), d_io);
291 ram_oe_n <= not R_nW;
292 prg_ram_inst : ram generic map (ram_2k, data_size)
293 port map (mem_clk, ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
299 dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status, dbg_ppu_addr,
\r
300 dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y,
\r
302 ppu_clk, mem_clk, ppu_ce_n, rst_n, r_nw, addr(2 downto 0), d_io,
303 nmi_n, rd_n, wr_n, ale, vram_ad, vram_a,
304 vga_out_clk, h_sync_n, v_sync_n, r, g, b);
306 ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size)
307 port map (ppu_clk, mem_clk, rd_n, wr_n, ale, v_addr, vram_ad,
308 nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);
310 ---VRAM/CHR ROM instances
311 v_addr (13 downto 8) <= vram_a;
313 --transparent d-latch
314 vram_latch : ls373 generic map (data_size)
315 port map(ale, '0', vram_ad, v_addr(7 downto 0));
317 vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
318 port map (mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), vram_ad, nt_v_mirror);
320 --name table/attr table
321 vram_nt0 : ram generic map (vram_1k, data_size)
322 port map (mem_clk, nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
324 vram_nt1 : ram generic map (vram_1k, data_size)
325 port map (mem_clk, nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
327 -- --APU/DMA instance
329 -- port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
331 dbg_cpu_clk <= cpu_clk;
332 dbg_ppu_clk <= ppu_clk;
333 dbg_mem_clk <= mem_clk;
337 dbg_vram_ad <= vram_ad ;
338 dbg_vram_a <= vram_a ;