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.
12 base_clk : in std_logic;
14 joypad1 : in std_logic_vector(7 downto 0);
15 joypad2 : in std_logic_vector(7 downto 0);
16 vga_clk : out std_logic;
17 h_sync_n : out std_logic;
18 v_sync_n : out std_logic;
19 r : out std_logic_vector(3 downto 0);
20 g : out std_logic_vector(3 downto 0);
21 b : out std_logic_vector(3 downto 0)
25 architecture rtl of motones_sim is
27 generic ( dsize : integer := 8;
30 port ( input_clk : in std_logic; --phi0 input pin.
39 addr : out std_logic_vector ( asize - 1 downto 0);
40 d_io : inout std_logic_vector ( dsize - 1 downto 0)
44 component clock_divider
45 port ( base_clk : in std_logic;
46 reset_n : in std_logic;
47 cpu_clk : out std_logic;
48 ppu_clk : out std_logic;
49 mem_clk : out std_logic;
50 vga_clk : out std_logic
54 component address_decoder
55 generic (abus_size : integer := 16; dbus_size : integer := 8);
56 port ( phi2 : in std_logic;
57 mem_clk : in std_logic;
59 addr : in std_logic_vector (abus_size - 1 downto 0);
60 d_io : in std_logic_vector (dbus_size - 1 downto 0);
61 rom_ce_n : out std_logic;
62 ram_ce_n : out std_logic;
63 ppu_ce_n : out std_logic;
64 apu_ce_n : out std_logic
69 generic (abus_size : integer := 16; dbus_size : integer := 8);
72 ce_n, oe_n, we_n : in std_logic; --select pin active low.
73 addr : in std_logic_vector (abus_size - 1 downto 0);
74 d_io : inout std_logic_vector (dbus_size - 1 downto 0)
79 generic (abus_size : integer := 15; dbus_size : integer := 8);
82 ce_n : in std_logic; --active low.
83 addr : in std_logic_vector (abus_size - 1 downto 0);
84 data : out std_logic_vector (dbus_size - 1 downto 0)
89 port ( clk : in std_logic;
90 mem_clk : in std_logic;
94 cpu_addr : in std_logic_vector (2 downto 0);
95 cpu_d : inout std_logic_vector (7 downto 0);
96 vblank_n : out std_logic;
100 vram_ad : inout std_logic_vector (7 downto 0);
101 vram_a : out std_logic_vector (13 downto 8);
102 vga_clk : in std_logic;
103 h_sync_n : out std_logic;
104 v_sync_n : out std_logic;
105 r : out std_logic_vector(3 downto 0);
106 g : out std_logic_vector(3 downto 0);
107 b : out std_logic_vector(3 downto 0)
111 component v_address_decoder
112 generic (abus_size : integer := 14; dbus_size : integer := 8);
113 port ( clk : in std_logic;
114 mem_clk : in std_logic;
118 v_addr : in std_logic_vector (13 downto 0);
119 v_data : in std_logic_vector (7 downto 0);
120 nt_v_mirror : in std_logic;
121 pt_ce_n : out std_logic;
122 nt0_ce_n : out std_logic;
123 nt1_ce_n : out std_logic
128 generic (abus_size : integer := 13; dbus_size : integer := 8);
131 ce_n : in std_logic; --active low.
132 addr : in std_logic_vector (abus_size - 1 downto 0);
133 data : out std_logic_vector (dbus_size - 1 downto 0);
134 nt_v_mirror : out std_logic
142 port ( c : in std_logic;
144 d : in std_logic_vector(dsize - 1 downto 0);
145 q : out std_logic_vector(dsize - 1 downto 0)
150 port ( clk : in std_logic;
152 rst_n : in std_logic;
153 r_nw : inout std_logic;
154 cpu_addr : inout std_logic_vector (15 downto 0);
155 cpu_d : inout std_logic_vector (7 downto 0);
160 constant data_size : integer := 8;
161 constant addr_size : integer := 16;
162 constant vram_size14 : integer := 14;
164 constant ram_2k : integer := 11; --2k = 11 bit width.
165 constant rom_32k : integer := 15; --32k = 15 bit width.
166 constant vram_1k : integer := 10; --1k = 10 bit width.
167 constant chr_rom_8k : integer := 13; --32k = 15 bit width.
169 signal cpu_clk : std_logic;
170 signal ppu_clk : std_logic;
171 signal mem_clk : std_logic;
172 signal vga_out_clk : std_logic;
174 signal rdy, irq_n, nmi_n, dbe, r_nw : std_logic;
175 signal phi1, phi2 : std_logic;
176 signal addr : std_logic_vector( addr_size - 1 downto 0);
177 signal d_io : std_logic_vector( data_size - 1 downto 0);
179 signal rom_ce_n : std_logic;
180 signal ram_ce_n : std_logic;
181 signal ram_oe_n : std_logic;
182 signal ppu_ce_n : std_logic;
183 signal apu_ce_n : std_logic;
185 signal rd_n : std_logic;
186 signal wr_n : std_logic;
187 signal ale : std_logic;
188 signal vram_ad : std_logic_vector (7 downto 0);
189 signal vram_a : std_logic_vector (13 downto 8);
190 signal v_addr : std_logic_vector (13 downto 0);
191 signal nt_v_mirror : std_logic;
192 signal pt_ce_n : std_logic;
193 signal nt0_ce_n : std_logic;
194 signal nt1_ce_n : std_logic;
200 vga_clk <= vga_out_clk;
202 --ppu/cpu clock generator
203 clock_inst : clock_divider port map
204 (base_clk, rst_n, cpu_clk, ppu_clk, mem_clk, vga_out_clk);
206 --mos 6502 cpu instance
207 cpu_inst : mos6502 generic map (data_size, addr_size)
208 port map (cpu_clk, rdy, rst_n, irq_n, nmi_n, dbe, r_nw,
209 phi1, phi2, addr, d_io);
211 addr_dec_inst : address_decoder generic map (addr_size, data_size)
212 port map (phi2, mem_clk, r_nw, addr, d_io, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
214 --main ROM/RAM instance
215 prg_rom_inst : prg_rom generic map (rom_32k, data_size)
216 port map (mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);
218 ram_oe_n <= not R_nW;
219 prg_ram_inst : ram generic map (ram_2k, data_size)
220 port map (mem_clk, ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
224 port map (ppu_clk, mem_clk, ppu_ce_n, rst_n, r_nw, addr(2 downto 0), d_io,
225 nmi_n, rd_n, wr_n, ale, vram_ad, vram_a,
226 vga_out_clk, h_sync_n, v_sync_n, r, g, b);
228 ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size)
229 port map (ppu_clk, mem_clk, rd_n, wr_n, ale, v_addr, vram_ad,
230 nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);
232 ---VRAM/CHR ROM instances
233 v_addr (13 downto 8) <= vram_a;
235 --transparent d-latch
236 vram_latch : ls373 generic map (data_size)
237 port map(ale, '0', vram_ad, v_addr(7 downto 0));
239 vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
240 port map (mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), vram_ad, nt_v_mirror);
242 --name table/attr table
243 vram_nt0 : ram generic map (vram_1k, data_size)
244 port map (mem_clk, nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
246 vram_nt1 : ram generic map (vram_1k, data_size)
247 port map (mem_clk, nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
251 port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);