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);
\r
26 signal dbg_ea_carry : out std_logic;
\r
27 signal dbg_wait_a58_branch_next : out std_logic;
\r
29 -- signal dbg_index_bus : out std_logic_vector(7 downto 0);
30 -- signal dbg_acc_bus : out std_logic_vector(7 downto 0);
31 signal dbg_status : out std_logic_vector(7 downto 0);
32 -- signal dbg_pcl, dbg_pch : out std_logic_vector(7 downto 0);
\r
33 signal dbg_sp, dbg_x, dbg_y, dbg_acc : out std_logic_vector(7 downto 0);
34 signal dbg_dec_oe_n : out std_logic;
35 signal dbg_dec_val : out std_logic_vector (7 downto 0);
36 signal dbg_int_dbus : out std_logic_vector (7 downto 0);
37 -- signal dbg_status_val : out std_logic_vector (7 downto 0);
38 -- signal dbg_stat_we_n : out std_logic;
39 -- signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w : out std_logic_vector (7 downto 0);
\r
41 signal dbg_ppu_ce_n : out std_logic;
\r
42 signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
\r
43 signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
\r
44 signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
\r
46 -- signal dbg_disp_nt, dbg_disp_attr : out std_logic_vector (7 downto 0);
\r
47 -- signal dbg_disp_ptn_h, dbg_disp_ptn_l : out std_logic_vector (15 downto 0);
\r
48 signal dbg_ppu_addr_we_n : out std_logic;
\r
49 signal dbg_ppu_clk_cnt : out std_logic_vector(1 downto 0);
\r
54 base_clk : in std_logic;
56 joypad1 : in std_logic_vector(7 downto 0);
57 joypad2 : in std_logic_vector(7 downto 0);
58 vga_clk : out std_logic;
59 h_sync_n : out std_logic;
60 v_sync_n : out std_logic;
61 r : out std_logic_vector(3 downto 0);
62 g : out std_logic_vector(3 downto 0);
63 b : out std_logic_vector(3 downto 0);
\r
66 dram_addr : out std_logic_vector (11 downto 0); --Address (12 bit)
\r
67 dram_bank : out std_logic_vector (1 downto 0); --Bank
\r
68 dram_cas_n : out std_logic; --Column Address is being transmitted
\r
69 dram_cke : out std_logic; --Clock Enable
\r
70 dram_clk : out std_logic; --Clock
\r
71 dram_cs_n : out std_logic; --Chip Select (Here - Mask commands)
\r
72 dram_dq : inout std_logic_vector (15 downto 0); --Data in / Data out
\r
73 dram_ldqm : out std_logic; --Byte masking
\r
74 dram_udqm : out std_logic; --Byte masking
\r
75 dram_ras_n : out std_logic; --Row Address is being transmitted
\r
76 dram_we_n : out std_logic --Write Enable
\r
80 architecture rtl of de1_nes is
82 generic ( dsize : integer := 8;
86 signal dbg_instruction : out std_logic_vector(7 downto 0);
87 signal dbg_int_d_bus : out std_logic_vector(7 downto 0);
88 signal dbg_exec_cycle : out std_logic_vector (5 downto 0);
89 signal dbg_ea_carry : out std_logic;
\r
90 signal dbg_wait_a58_branch_next : out std_logic;
\r
91 -- signal dbg_index_bus : out std_logic_vector(7 downto 0);
92 -- signal dbg_acc_bus : out std_logic_vector(7 downto 0);
93 signal dbg_status : out std_logic_vector(7 downto 0);
94 signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc : out std_logic_vector(7 downto 0);
95 signal dbg_dec_oe_n : out std_logic;
96 signal dbg_dec_val : out std_logic_vector (7 downto 0);
97 signal dbg_int_dbus : out std_logic_vector (7 downto 0);
98 -- signal dbg_status_val : out std_logic_vector (7 downto 0);
99 signal dbg_stat_we_n : out std_logic;
100 signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w : out std_logic_vector (7 downto 0);
\r
102 input_clk : in std_logic; --phi0 input pin.
104 rst_n : in std_logic;
105 irq_n : in std_logic;
106 nmi_n : in std_logic;
108 r_nw : out std_logic;
109 phi1 : out std_logic;
110 phi2 : out std_logic;
111 addr : out std_logic_vector ( asize - 1 downto 0);
112 d_io : inout std_logic_vector ( dsize - 1 downto 0)
116 component clock_divider
117 port ( base_clk : in std_logic;
118 reset_n : in std_logic;
119 cpu_clk : out std_logic;
120 ppu_clk : out std_logic;
121 mem_clk : out std_logic;
122 vga_clk : out std_logic
126 component address_decoder
127 generic (abus_size : integer := 16; dbus_size : integer := 8);
128 port ( phi2 : in std_logic;
129 mem_clk : in std_logic;
131 addr : in std_logic_vector (abus_size - 1 downto 0);
132 d_io : in std_logic_vector (dbus_size - 1 downto 0);
133 rom_ce_n : out std_logic;
134 ram_ce_n : out std_logic;
135 ppu_ce_n : out std_logic;
136 apu_ce_n : out std_logic
141 generic (abus_size : integer := 16; dbus_size : integer := 8);
144 ce_n, oe_n, we_n : in std_logic; --select pin active low.
145 addr : in std_logic_vector (abus_size - 1 downto 0);
146 d_io : inout std_logic_vector (dbus_size - 1 downto 0)
151 generic (abus_size : integer := 15; dbus_size : integer := 8);
154 ce_n : in std_logic; --active low.
155 addr : in std_logic_vector (abus_size - 1 downto 0);
156 data : out std_logic_vector (dbus_size - 1 downto 0)
162 signal dbg_ppu_ce_n : out std_logic;
\r
163 signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
\r
164 signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
\r
165 signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
\r
166 signal dbg_disp_nt, dbg_disp_attr : out std_logic_vector (7 downto 0);
\r
167 signal dbg_disp_ptn_h, dbg_disp_ptn_l : out std_logic_vector (15 downto 0);
\r
168 signal dbg_ppu_addr_we_n : out std_logic;
\r
169 signal dbg_ppu_clk_cnt : out std_logic_vector(1 downto 0);
\r
172 mem_clk : in std_logic;
173 sdram_clk : in std_logic;
\r
175 rst_n : in std_logic;
177 cpu_addr : in std_logic_vector (2 downto 0);
178 cpu_d : inout std_logic_vector (7 downto 0);
179 vblank_n : out std_logic;
180 rd_n : out std_logic;
181 wr_n : out std_logic;
183 vram_ad : inout std_logic_vector (7 downto 0);
184 vram_a : out std_logic_vector (13 downto 8);
185 vga_clk : in std_logic;
186 h_sync_n : out std_logic;
187 v_sync_n : out std_logic;
188 r : out std_logic_vector(3 downto 0);
189 g : out std_logic_vector(3 downto 0);
190 b : out std_logic_vector(3 downto 0);
192 wbs_adr_i : out std_logic_vector (21 downto 0); --Address (Bank, Row, Col)
\r
193 wbs_dat_i : out std_logic_vector (15 downto 0); --Data In (16 bits)
\r
194 wbs_we_i : out std_logic; --Write Enable
\r
195 wbs_tga_i : out std_logic_vector (7 downto 0); --Address Tag : Read/write burst length-1 (0 represents 1 word, FF represents 256 words)
\r
196 wbs_cyc_i : out std_logic; --Cycle Command from interface
\r
197 wbs_stb_i : out std_logic; --Strobe Command from interface
\r
198 wbs_dat_o : in std_logic_vector (15 downto 0); --Data Out (16 bits)
\r
199 wbs_stall_o : in std_logic; --Slave is not ready to receive new data
\r
200 wbs_err_o : in std_logic; --Error flag: OOR Burst. Burst length is greater that 256-column address
\r
201 wbs_ack_o : in std_logic --When Read Burst: DATA bus must be valid in this cycle
\r
205 component v_address_decoder
206 generic (abus_size : integer := 14; dbus_size : integer := 8);
207 port ( clk : in std_logic;
208 mem_clk : in std_logic;
212 v_addr : in std_logic_vector (13 downto 0);
213 v_data : in std_logic_vector (7 downto 0);
214 nt_v_mirror : in std_logic;
215 pt_ce_n : out std_logic;
216 nt0_ce_n : out std_logic;
217 nt1_ce_n : out std_logic
222 generic (abus_size : integer := 13; dbus_size : integer := 8);
225 ce_n : in std_logic; --active low.
226 addr : in std_logic_vector (abus_size - 1 downto 0);
227 data : out std_logic_vector (dbus_size - 1 downto 0);
228 nt_v_mirror : out std_logic
236 port ( c : in std_logic;
238 d : in std_logic_vector(dsize - 1 downto 0);
239 q : out std_logic_vector(dsize - 1 downto 0)
244 port ( clk : in std_logic;
246 rst_n : in std_logic;
247 r_nw : inout std_logic;
248 cpu_addr : inout std_logic_vector (15 downto 0);
249 cpu_d : inout std_logic_vector (7 downto 0);
254 component pll_clk_gen
\r
257 inclk0 : IN STD_LOGIC := '0';
\r
258 c0 : OUT STD_LOGIC ;
\r
259 locked : OUT STD_LOGIC
\r
263 component sdram_controller
\r
266 reset_polarity_g : std_logic := '0' --When rst = reset_polarity_g, system is in RESET mode
\r
269 --Clocks and Reset
\r
270 clk_i : in std_logic; --Wishbone input clock
\r
271 rst : in std_logic; --Reset
\r
272 pll_locked : in std_logic; --PLL Locked indication, for CKE (Clock Enable) signal to SDRAM
\r
275 dram_addr : out std_logic_vector (11 downto 0); --Address (12 bit)
\r
276 dram_bank : out std_logic_vector (1 downto 0); --Bank
\r
277 dram_cas_n : out std_logic; --Column Address is being transmitted
\r
278 dram_cke : out std_logic; --Clock Enable
\r
279 dram_cs_n : out std_logic; --Chip Select (Here - Mask commands)
\r
280 dram_dq : inout std_logic_vector (15 downto 0); --Data in / Data out
\r
281 dram_ldqm : out std_logic; --Byte masking
\r
282 dram_udqm : out std_logic; --Byte masking
\r
283 dram_ras_n : out std_logic; --Row Address is being transmitted
\r
284 dram_we_n : out std_logic; --Write Enable
\r
286 -- Wishbone Slave signals to Read/Write interface
\r
287 wbs_adr_i : in std_logic_vector (21 downto 0); --Address (Bank, Row, Col)
\r
288 wbs_dat_i : in std_logic_vector (15 downto 0); --Data In (16 bits)
\r
289 wbs_we_i : in std_logic; --Write Enable
\r
290 wbs_tga_i : in std_logic_vector (7 downto 0); --Address Tag : Read/write burst length-1 (0 represents 1 word, FF represents 256 words)
\r
291 wbs_cyc_i : in std_logic; --Cycle Command from interface
\r
292 wbs_stb_i : in std_logic; --Strobe Command from interface
\r
293 wbs_dat_o : out std_logic_vector (15 downto 0); --Data Out (16 bits)
\r
294 wbs_stall_o : out std_logic; --Slave is not ready to receive new data
\r
295 wbs_err_o : out std_logic; --Error flag: OOR Burst. Burst length is greater that 256-column address
\r
296 wbs_ack_o : out std_logic; --When Read Burst: DATA bus must be valid in this cycle
\r
297 --When Write Burst: Data has been read from SDRAM and is valid
\r
300 cmd_ack : out std_logic; --Command has been acknowledged
\r
301 cmd_done : out std_logic; --Command has finished (read/write)
\r
302 init_st_o : out std_logic_vector (3 downto 0); --Current init state
\r
303 main_st_o : out std_logic_vector (3 downto 0) --Current main state
\r
307 constant data_size : integer := 8;
308 constant addr_size : integer := 16;
309 constant vram_size14 : integer := 14;
311 constant ram_2k : integer := 11; --2k = 11 bit width.
312 constant rom_32k : integer := 15; --32k = 15 bit width.
313 constant rom_4k : integer := 12; --4k = 12 bit width. (for test use)
314 constant vram_1k : integer := 10; --1k = 10 bit width.
315 constant chr_rom_8k : integer := 13; --32k = 15 bit width.
317 signal cpu_clk : std_logic;
318 signal ppu_clk : std_logic;
319 signal mem_clk : std_logic;
320 signal vga_out_clk : std_logic;
321 signal sdram_clk : std_logic;
\r
322 signal sdram_clk_locked : std_logic;
\r
324 signal rdy, irq_n, nmi_n, dbe, r_nw : std_logic;
325 signal phi1, phi2 : std_logic;
326 signal addr : std_logic_vector( addr_size - 1 downto 0);
327 signal d_io : std_logic_vector( data_size - 1 downto 0);
329 signal rom_ce_n : std_logic;
330 signal ram_ce_n : std_logic;
331 signal ram_oe_n : std_logic;
332 signal ppu_ce_n : std_logic;
333 signal apu_ce_n : std_logic;
335 signal rd_n : std_logic;
336 signal wr_n : std_logic;
337 signal ale : std_logic;
338 signal vram_ad : std_logic_vector (7 downto 0);
339 signal vram_a : std_logic_vector (13 downto 8);
340 signal v_addr : std_logic_vector (13 downto 0);
341 signal nt_v_mirror : std_logic;
342 signal pt_ce_n : std_logic;
343 signal nt0_ce_n : std_logic;
344 signal nt1_ce_n : std_logic;
346 -- SDRAM signals to Read/Write interface
\r
347 signal wbs_adr_i : std_logic_vector (21 downto 0); --Address (Bank, Row, Col)
\r
348 signal wbs_dat_i : std_logic_vector (15 downto 0); --Data In (16 bits)
\r
349 signal wbs_we_i : std_logic; --Write Enable
\r
350 signal wbs_tga_i : std_logic_vector (7 downto 0); --Address Tag : Read/write burst length-1 (0 represents 1 word, FF represents 256 words)
\r
351 signal wbs_cyc_i : std_logic; --Cycle Command from interface
\r
352 signal wbs_stb_i : std_logic; --Strobe Command from interface
\r
353 signal wbs_dat_o : std_logic_vector (15 downto 0); --Data Out (16 bits)
\r
354 signal wbs_stall_o : std_logic; --Slave is not ready to receive new data
\r
355 signal wbs_err_o : std_logic; --Error flag: OOR Burst. Burst length is greater that 256-column address
\r
356 signal wbs_ack_o : std_logic; --When Read Burst: DATA bus must be valid in this cycle
\r
357 --When Write Burst: Data has been read from SDRAM and is valid
\r
359 signal cmd_ack : std_logic; --Command has been acknowledged
\r
360 signal cmd_done : std_logic; --Command has finished (read/write)
\r
361 signal init_st_o : std_logic_vector (3 downto 0); --Current init state
\r
362 signal main_st_o : std_logic_vector (3 downto 0); --Current main state
\r
364 signal dbg_disp_nt, dbg_disp_attr : std_logic_vector (7 downto 0);
\r
365 signal dbg_disp_ptn_h, dbg_disp_ptn_l : std_logic_vector (15 downto 0);
\r
366 signal dbg_pcl, dbg_pch : std_logic_vector(7 downto 0);
\r
367 signal dbg_stat_we_n : std_logic;
\r
368 signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w : std_logic_vector (7 downto 0);
\r
373 vga_clk <= vga_out_clk;
375 --ppu/cpu clock generator
376 clock_inst : clock_divider port map
377 (base_clk, rst_n, cpu_clk, ppu_clk, mem_clk, vga_out_clk);
379 --mos 6502 cpu instance
380 cpu_inst : mos6502 generic map (data_size, addr_size)
386 dbg_wait_a58_branch_next,
\r
390 dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc,
396 dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w,
\r
398 cpu_clk, '1', --rdy, -----for testing...
399 rst_n, irq_n, nmi_n, dbe, r_nw,
400 phi1, phi2, addr, d_io);
402 addr_dec_inst : address_decoder generic map (addr_size, data_size)
403 port map (phi2, mem_clk, r_nw, addr, d_io, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
405 --main ROM/RAM instance
406 -- prg_rom_inst : prg_rom generic map (rom_32k, data_size)
407 -- port map (mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);
408 prg_rom_inst : prg_rom generic map (rom_4k, data_size)
409 port map (mem_clk, rom_ce_n, addr(rom_4k - 1 downto 0), d_io);
411 ram_oe_n <= not R_nW;
412 prg_ram_inst : ram generic map (ram_2k, data_size)
413 port map (mem_clk, ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
419 dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status, dbg_ppu_addr,
\r
420 dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y,
\r
421 dbg_disp_nt, dbg_disp_attr, dbg_disp_ptn_h, dbg_disp_ptn_l ,
\r
422 dbg_ppu_addr_we_n ,
\r
425 ppu_clk, mem_clk, sdram_clk, ppu_ce_n, rst_n, r_nw, addr(2 downto 0), d_io,
426 nmi_n, rd_n, wr_n, ale, vram_ad, vram_a,
427 vga_out_clk, h_sync_n, v_sync_n, r, g, b,
\r
441 ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size)
442 port map (ppu_clk, mem_clk, rd_n, wr_n, ale, v_addr, vram_ad,
443 nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);
445 ---VRAM/CHR ROM instances
446 v_addr (13 downto 8) <= vram_a;
448 --transparent d-latch
449 vram_latch : ls373 generic map (data_size)
450 port map(ale, '0', vram_ad, v_addr(7 downto 0));
452 vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
453 port map (mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), vram_ad, nt_v_mirror);
455 --name table/attr table
456 vram_nt0 : ram generic map (vram_1k, data_size)
457 port map (mem_clk, nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
459 vram_nt1 : ram generic map (vram_1k, data_size)
460 port map (mem_clk, nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
462 -- --APU/DMA instance
464 -- port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
466 pll_inst : pll_clk_gen
\r
467 PORT map ( base_clk, sdram_clk, sdram_clk_locked );
\r
469 dram_clk <= sdram_clk;
\r
470 sdram_ctl_inst : sdram_controller
\r
472 --Clocks and Reset
\r
489 -- Wishbone Slave signals to Read/Write interface
\r
508 dbg_cpu_clk <= cpu_clk;
509 dbg_ppu_clk <= ppu_clk;
510 dbg_mem_clk <= mem_clk;
514 dbg_vram_ad <= vram_ad ;
515 dbg_vram_a <= vram_a ;