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;
\r
14 signal dbg_ppu_clk : out std_logic;
\r
15 signal dbg_mem_clk : out std_logic;
\r
16 signal dbg_r_nw : out std_logic;
\r
17 signal dbg_addr : out std_logic_vector( 16 - 1 downto 0);
\r
18 signal dbg_d_io : out std_logic_vector( 8 - 1 downto 0);
\r
19 signal dbg_vram_ad : out std_logic_vector (7 downto 0);
\r
20 signal dbg_vram_a : out std_logic_vector (13 downto 8);
\r
21 ---monitor inside cpu
\r
22 signal dbg_instruction : out std_logic_vector(7 downto 0);
\r
23 signal dbg_int_d_bus : out std_logic_vector(7 downto 0);
\r
24 signal dbg_exec_cycle : out std_logic_vector (5 downto 0);
\r
25 -- signal dbg_index_bus : out std_logic_vector(7 downto 0);
\r
26 -- signal dbg_acc_bus : out std_logic_vector(7 downto 0);
\r
27 signal dbg_status : out std_logic_vector(7 downto 0);
\r
28 signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc : out std_logic_vector(7 downto 0);
\r
29 signal dbg_dec_oe_n : out std_logic;
\r
30 signal dbg_dec_val : out std_logic_vector (7 downto 0);
\r
31 signal dbg_int_dbus : out std_logic_vector (7 downto 0);
\r
32 -- signal dbg_status_val : out std_logic_vector (7 downto 0);
\r
33 signal dbg_stat_we_n : out std_logic;
\r
36 base_clk : in std_logic;
38 joypad1 : in std_logic_vector(7 downto 0);
39 joypad2 : in std_logic_vector(7 downto 0);
40 vga_clk : out std_logic;
41 h_sync_n : out std_logic;
42 v_sync_n : out std_logic;
43 r : out std_logic_vector(3 downto 0);
44 g : out std_logic_vector(3 downto 0);
45 b : out std_logic_vector(3 downto 0)
49 architecture rtl of de1_nes is
51 generic ( dsize : integer := 8;
55 signal dbg_instruction : out std_logic_vector(7 downto 0);
\r
56 signal dbg_int_d_bus : out std_logic_vector(7 downto 0);
\r
57 signal dbg_exec_cycle : out std_logic_vector (5 downto 0);
\r
58 -- signal dbg_index_bus : out std_logic_vector(7 downto 0);
\r
59 -- signal dbg_acc_bus : out std_logic_vector(7 downto 0);
\r
60 signal dbg_status : out std_logic_vector(7 downto 0);
\r
61 signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc : out std_logic_vector(7 downto 0);
\r
62 signal dbg_dec_oe_n : out std_logic;
\r
63 signal dbg_dec_val : out std_logic_vector (7 downto 0);
\r
64 signal dbg_int_dbus : out std_logic_vector (7 downto 0);
\r
65 -- signal dbg_status_val : out std_logic_vector (7 downto 0);
\r
66 signal dbg_stat_we_n : out std_logic;
\r
68 input_clk : in std_logic; --phi0 input pin.
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 mem_clk : out std_logic;
\r
88 vga_clk : out std_logic
92 component address_decoder
93 generic (abus_size : integer := 16; dbus_size : integer := 8);
94 port ( phi2 : in std_logic;
\r
95 mem_clk : in std_logic;
\r
96 R_nW : in std_logic;
\r
97 addr : in std_logic_vector (abus_size - 1 downto 0);
\r
98 d_io : in std_logic_vector (dbus_size - 1 downto 0);
\r
99 rom_ce_n : out std_logic;
\r
100 ram_ce_n : out std_logic;
\r
101 ppu_ce_n : out std_logic;
\r
102 apu_ce_n : out std_logic
\r
107 generic (abus_size : integer := 16; dbus_size : integer := 8);
\r
108 port ( ce_n, oe_n, we_n : in std_logic; --select pin active low.
\r
109 addr : in std_logic_vector (abus_size - 1 downto 0);
\r
110 d_io : inout std_logic_vector (dbus_size - 1 downto 0)
\r
115 generic (abus_size : integer := 15; dbus_size : integer := 8);
\r
117 clk : in std_logic;
\r
118 ce_n : in std_logic; --active low.
\r
119 addr : in std_logic_vector (abus_size - 1 downto 0);
\r
120 data : out std_logic_vector (dbus_size - 1 downto 0)
\r
125 port ( clk : in std_logic;
127 rst_n : in std_logic;
129 cpu_addr : in std_logic_vector (2 downto 0);
130 cpu_d : inout std_logic_vector (7 downto 0);
131 vblank_n : out std_logic;
132 rd_n : out std_logic;
133 wr_n : out std_logic;
135 vram_ad : inout std_logic_vector (7 downto 0);
136 vram_a : out std_logic_vector (13 downto 8);
137 vga_clk : in std_logic;
138 h_sync_n : out std_logic;
139 v_sync_n : out std_logic;
140 r : out std_logic_vector(3 downto 0);
141 g : out std_logic_vector(3 downto 0);
142 b : out std_logic_vector(3 downto 0)
146 component v_address_decoder
147 generic (abus_size : integer := 14; dbus_size : integer := 8);
148 port ( clk : in std_logic;
152 v_addr : in std_logic_vector (13 downto 0);
153 v_data : in std_logic_vector (7 downto 0);
154 nt_v_mirror : in std_logic;
155 pt_ce_n : out std_logic;
156 nt0_ce_n : out std_logic;
157 nt1_ce_n : out std_logic
162 generic (abus_size : integer := 13; dbus_size : integer := 8);
163 port ( ce_n : in std_logic; --active low.
164 addr : in std_logic_vector (abus_size - 1 downto 0);
165 data : out std_logic_vector (dbus_size - 1 downto 0);
166 nt_v_mirror : out std_logic
174 port ( c : in std_logic;
176 d : in std_logic_vector(dsize - 1 downto 0);
177 q : out std_logic_vector(dsize - 1 downto 0)
182 port ( clk : in std_logic;
184 rst_n : in std_logic;
185 r_nw : inout std_logic;
186 cpu_addr : inout std_logic_vector (15 downto 0);
187 cpu_d : inout std_logic_vector (7 downto 0);
192 constant data_size : integer := 8;
193 constant addr_size : integer := 16;
194 constant vram_size14 : integer := 14;
196 constant ram_2k : integer := 11; --2k = 11 bit width.
\r
197 constant rom_32k : integer := 15; --32k = 15 bit width.
\r
198 constant rom_4k : integer := 12; --4k = 12 bit width. (for test use)
\r
199 constant vram_1k : integer := 10; --1k = 10 bit width.
200 constant chr_rom_8k : integer := 13; --32k = 15 bit width.
202 signal cpu_clk : std_logic;
203 signal ppu_clk : std_logic;
204 signal mem_clk : std_logic;
\r
205 signal vga_out_clk : std_logic;
207 signal rdy, irq_n, nmi_n, dbe, r_nw : std_logic;
208 signal phi1, phi2 : std_logic;
209 signal addr : std_logic_vector( addr_size - 1 downto 0);
210 signal d_io : std_logic_vector( data_size - 1 downto 0);
212 signal rom_ce_n : std_logic;
\r
213 signal ram_ce_n : std_logic;
\r
214 signal ram_oe_n : std_logic;
\r
215 signal ppu_ce_n : std_logic;
216 signal apu_ce_n : std_logic;
218 signal rd_n : std_logic;
219 signal wr_n : std_logic;
220 signal ale : std_logic;
221 signal vram_ad : std_logic_vector (7 downto 0);
222 signal vram_a : std_logic_vector (13 downto 8);
223 signal v_addr : std_logic_vector (13 downto 0);
224 signal nt_v_mirror : std_logic;
225 signal pt_ce_n : std_logic;
226 signal nt0_ce_n : std_logic;
227 signal nt1_ce_n : std_logic;
233 vga_clk <= vga_out_clk;
235 --ppu/cpu clock generator
236 clock_inst : clock_divider port map
237 (base_clk, rst_n, cpu_clk, ppu_clk, mem_clk, vga_out_clk);
239 --mos 6502 cpu instance
240 cpu_inst : mos6502 generic map (data_size, addr_size)
248 dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc,
\r
252 -- dbg_status_val ,
\r
255 cpu_clk, '1', --rdy, -----for testing...
\r
256 rst_n, irq_n, nmi_n, dbe, r_nw,
257 phi1, phi2, addr, d_io);
259 addr_dec_inst : address_decoder generic map (addr_size, data_size)
260 port map (phi2, mem_clk, r_nw, addr, d_io, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
262 --main ROM/RAM instance
\r
263 -- prg_rom_inst : prg_rom generic map (rom_32k, data_size)
\r
264 -- port map (mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);
\r
265 prg_rom_inst : prg_rom generic map (rom_4k, data_size)
\r
266 port map (mem_clk, rom_ce_n, addr(rom_4k - 1 downto 0), d_io);
\r
268 ram_oe_n <= not R_nW;
\r
269 -- prg_ram_inst : ram generic map (ram_2k, data_size)
\r
270 -- port map (ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
\r
272 -- --nes ppu instance
\r
274 -- port map (ppu_clk, ppu_ce_n, rst_n, r_nw, addr(2 downto 0), d_io,
\r
275 -- nmi_n, rd_n, wr_n, ale, vram_ad, vram_a,
\r
276 -- vga_out_clk, h_sync_n, v_sync_n, r, g, b);
\r
278 -- ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size)
\r
279 -- port map (ppu_clk, rd_n, wr_n, ale, v_addr, vram_ad,
\r
280 -- nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);
\r
282 -- ---VRAM/CHR ROM instances
\r
283 -- v_addr (13 downto 8) <= vram_a;
\r
285 -- --transparent d-latch
\r
286 -- vram_latch : ls373 generic map (data_size)
\r
287 -- port map(ale, '0', vram_ad, v_addr(7 downto 0));
\r
289 -- vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
\r
290 -- port map (pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), vram_ad, nt_v_mirror);
\r
292 -- --name table/attr table
\r
293 -- vram_nt0 : ram generic map (vram_1k, data_size)
\r
294 -- port map (nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
\r
296 -- vram_nt1 : ram generic map (vram_1k, data_size)
\r
297 -- port map (nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
\r
299 -- --APU/DMA instance
\r
301 -- port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
\r
303 dbg_cpu_clk <= cpu_clk;
\r
304 dbg_ppu_clk <= ppu_clk;
\r
305 dbg_mem_clk <= mem_clk;
\r
309 -- dbg_vram_ad <= vram_ad ;
\r
310 -- dbg_vram_a <= vram_a ;
\r