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.
11 port ( rst_n : in std_logic
15 architecture rtl of motones_sim is
17 generic ( dsize : integer := 8;
20 port ( input_clk : in std_logic; --phi0 input pin.
29 addr : out std_logic_vector ( asize - 1 downto 0);
30 d_io : inout std_logic_vector ( dsize - 1 downto 0)
34 component clock_divider
35 port ( base_clk : in std_logic;
36 reset_n : in std_logic;
37 cpu_clk : out std_logic;
38 ppu_clk : out std_logic
42 component address_decoder
43 generic (abus_size : integer := 16; dbus_size : integer := 8);
44 port ( phi2 : in std_logic;
46 addr : in std_logic_vector (abus_size - 1 downto 0);
47 d_io : inout std_logic_vector (dbus_size - 1 downto 0);
48 ppu_ce_n : out std_logic;
49 apu_ce_n : out std_logic
54 port ( clk : in std_logic;
58 cpu_addr : in std_logic_vector (2 downto 0);
59 cpu_d : inout std_logic_vector (7 downto 0);
60 vblank_n : out std_logic;
64 vram_ad : inout std_logic_vector (7 downto 0);
65 vram_a : out std_logic_vector (13 downto 8);
66 vga_clk : in std_logic;
67 h_sync_n : out std_logic;
68 v_sync_n : out std_logic;
69 r : out std_logic_vector(3 downto 0);
70 g : out std_logic_vector(3 downto 0);
71 b : out std_logic_vector(3 downto 0)
75 component v_address_decoder
76 generic (abus_size : integer := 14; dbus_size : integer := 8);
77 port ( clk : in std_logic;
81 vram_ad : inout std_logic_vector (7 downto 0);
82 vram_a : in std_logic_vector (13 downto 8)
87 port ( vga_clk : in std_logic;
89 h_sync_n : in std_logic;
90 v_sync_n : in std_logic;
91 r : in std_logic_vector(3 downto 0);
92 g : in std_logic_vector(3 downto 0);
93 b : in std_logic_vector(3 downto 0)
98 port ( clk : in std_logic;
100 rst_n : in std_logic;
101 r_nw : inout std_logic;
102 cpu_addr : inout std_logic_vector (15 downto 0);
103 cpu_d : inout std_logic_vector (7 downto 0);
108 ---clock frequency = 21,477,270 (21 MHz)
109 constant base_clock_time : time := 46 ns;
110 constant vga_clk_time : time := 40 ns;
111 constant data_size : integer := 8;
112 constant addr_size : integer := 16;
113 constant size14 : integer := 14;
115 signal base_clk : std_logic;
116 signal cpu_clk : std_logic;
117 signal ppu_clk : std_logic;
119 signal rdy, irq_n, nmi_n, dbe, r_nw : std_logic;
120 signal phi1, phi2 : std_logic;
121 signal addr : std_logic_vector( addr_size - 1 downto 0);
122 signal d_io : std_logic_vector( data_size - 1 downto 0);
124 signal ppu_ce_n : std_logic;
125 signal apu_ce_n : std_logic;
126 signal rd_n : std_logic;
127 signal wr_n : std_logic;
128 signal ale : std_logic;
129 signal vram_ad : std_logic_vector (7 downto 0);
130 signal vram_a : std_logic_vector (13 downto 8);
132 signal vga_clk : std_logic;
133 signal h_sync_n : std_logic;
134 signal v_sync_n : std_logic;
135 signal r : std_logic_vector(3 downto 0);
136 signal g : std_logic_vector(3 downto 0);
137 signal b : std_logic_vector(3 downto 0);
140 signal nmi_n2 : std_logic;
146 --- generate base clock.
150 wait for base_clock_time / 2;
152 wait for base_clock_time / 2;
155 --- generate test vga clock.
156 vga_clock_p : process
159 wait for vga_clk_time / 2;
161 wait for vga_clk_time / 2;
164 --ppu/cpu clock generator
165 clock_inst : clock_divider port map
166 (base_clk, rst_n, cpu_clk, ppu_clk);
168 --mos 6502 cpu instance
169 cpu_inst : mos6502 generic map (data_size, addr_size)
170 port map (cpu_clk, rdy, rst_n, irq_n, nmi_n, dbe, r_nw,
171 phi1, phi2, addr, d_io);
173 addr_dec_inst : address_decoder generic map (addr_size, data_size)
174 port map (phi2, r_nw, addr, d_io, ppu_ce_n, apu_ce_n);
178 port map (ppu_clk, ppu_ce_n, rst_n, r_nw, addr(2 downto 0), d_io,
179 nmi_n, rd_n, wr_n, ale, vram_ad, vram_a,
180 vga_clk, h_sync_n, v_sync_n, r, g, b);
182 ppu_addr_decoder : v_address_decoder generic map (size14, data_size)
183 port map (ppu_clk, rd_n, wr_n, ale, vram_ad, vram_a);
186 port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
188 dummy_vga_disp : vga_device
189 port map (vga_clk, rst_n, h_sync_n, v_sync_n, r, g, b);
192 -- constant powerup_time : time := 5000 ns;
193 -- constant reset_time : time := 10 us;
195 -- wait for powerup_time;
197 -- wait for reset_time;