OSDN Git Service

Merge branch 'master' of git.sourceforge.jp:/gitroot/motonesfpga/motonesfpga
[motonesfpga/motonesfpga.git] / simulation / motones_sim.vhd
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_unsigned.conv_integer;
4
5 --  
6 --   MOTO NES FPGA On GHDL Simulation Environment Virtual Cuicuit Board
7 --   All of the components are assembled and instanciated on this board.
8 --  
9
10 entity motones_sim is 
11     port (  rst_n     : in std_logic
12          );
13 end motones_sim;
14
15 architecture rtl of motones_sim is
16     component mos6502
17         generic (   dsize : integer := 8;
18                     asize : integer :=16
19                 );
20         port (  input_clk   : in std_logic; --phi0 input pin.
21                 rdy         : in std_logic;
22                 rst_n       : in std_logic;
23                 irq_n       : in std_logic;
24                 nmi_n       : in std_logic;
25                 dbe         : in std_logic;
26                 r_nw        : out std_logic;
27                 phi1        : out std_logic;
28                 phi2        : out std_logic;
29                 addr        : out std_logic_vector ( asize - 1 downto 0);
30                 d_io        : inout std_logic_vector ( dsize - 1 downto 0)
31         );
32     end component;
33
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
39             );
40     end component;
41
42     component address_decoder
43     generic (abus_size : integer := 16; dbus_size : integer := 8);
44         port (  phi2        : in std_logic;
45                 R_nW        : 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
50     );
51     end component;
52
53     component ppu
54     port (  clk         : in std_logic;
55             ce_n        : in std_logic;
56             rst_n       : in std_logic;
57             r_nw        : 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;
61             rd_n        : out std_logic;
62             wr_n        : out std_logic;
63             ale         : 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)
72     );
73     end component;
74
75     component v_address_decoder
76     generic (abus_size : integer := 14; dbus_size : integer := 8);
77         port (  clk         : in std_logic; 
78                 rd_n        : in std_logic;
79                 wr_n        : in std_logic;
80                 ale         : in std_logic;
81                 vram_ad     : inout std_logic_vector (7 downto 0);
82                 vram_a      : in std_logic_vector (13 downto 8)
83             );
84     end component;
85
86     component vga_device
87     port (  vga_clk     : in std_logic;
88             rst_n       : 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)
94             );
95     end component;
96
97     component apu
98         port (  clk         : in std_logic;
99                 ce_n        : 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);
104                 rdy         : out std_logic
105         );
106     end component;
107
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;
114
115     signal base_clk : std_logic;
116     signal cpu_clk  : std_logic;
117     signal ppu_clk  : std_logic;
118
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);
123
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);
131
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);
138
139     --test...
140     signal nmi_n2 : std_logic;
141
142 begin
143
144     irq_n <= '0';
145
146     --- generate base clock.
147     clock_p: process
148     begin
149         base_clk <= '1';
150         wait for base_clock_time / 2;
151         base_clk <= '0';
152         wait for base_clock_time / 2;
153     end process;
154
155     --- generate test vga clock.
156     vga_clock_p : process
157     begin
158         vga_clk <= '1';
159         wait for vga_clk_time / 2;
160         vga_clk <= '0';
161         wait for vga_clk_time / 2;
162     end process;
163
164     --ppu/cpu clock generator
165     clock_inst : clock_divider port map 
166         (base_clk, rst_n, cpu_clk, ppu_clk);
167
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);
172
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);
175
176     --nes ppu instance
177     ppu_inst : ppu 
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);
181
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);
184
185     apu_inst : apu
186         port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
187
188     dummy_vga_disp : vga_device 
189         port map (vga_clk, rst_n, h_sync_n, v_sync_n, r, g, b);
190
191 --    nmi_p: process
192 --    constant powerup_time : time := 5000 ns;
193 --    constant reset_time : time := 10 us;
194 --    begin
195 --        wait for powerup_time;
196 --        nmi_n  <= '1';
197 --        wait for reset_time;
198 --        wait for 46 us;
199 --        nmi_n  <= '0';
200 --
201 --        wait;
202 --    end process;
203
204 end rtl;
205