OSDN Git Service

now smb all ok!!
[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 (
12         base_clk        : in std_logic;
13         rst_n           : 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)
22          );
23 end motones_sim;
24
25 architecture rtl of motones_sim is
26     component mos6502
27         generic (   dsize : integer := 8;
28                     asize : integer :=16
29                 );
30         port (  input_clk   : in std_logic; --phi0 input pin.
31                 rdy         : in std_logic;
32                 rst_n       : in std_logic;
33                 irq_n       : in std_logic;
34                 nmi_n       : in std_logic;
35                 dbe         : in std_logic;
36                 r_nw        : out std_logic;
37                 phi1        : out std_logic;
38                 phi2        : out std_logic;
39                 addr        : out std_logic_vector ( asize - 1 downto 0);
40                 d_io        : inout std_logic_vector ( dsize - 1 downto 0)
41         );
42     end component;
43
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
51             );
52     end component;
53
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;
58                 R_nW        : 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
65     );
66     end component;
67
68     component ram
69         generic (abus_size : integer := 16; dbus_size : integer := 8);
70         port (  
71                 clk               : in std_logic;
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)
75         );
76     end component;
77
78     component prg_rom
79         generic (abus_size : integer := 15; dbus_size : integer := 8);
80         port (
81                 clk             : in std_logic;
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)
85         );
86     end component;
87
88     component ppu
89     port (  clk         : in std_logic;
90             mem_clk     : in std_logic;
91             ce_n        : in std_logic;
92             rst_n       : in std_logic;
93             r_nw        : 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;
97             rd_n        : out std_logic;
98             wr_n        : out std_logic;
99             ale         : 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)
108     );
109     end component;
110
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;
115                 rd_n        : in std_logic;
116                 wr_n        : in std_logic;
117                 ale         : 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
124             );
125     end component;
126
127     component chr_rom
128         generic (abus_size : integer := 13; dbus_size : integer := 8);
129         port (  
130                 clk             : in std_logic;
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
135         );
136     end component;
137
138     component ls373
139         generic (
140             dsize : integer := 8
141         );
142         port (  c         : in std_logic;
143                 oc_n      : in std_logic;
144                 d         : in std_logic_vector(dsize - 1 downto 0);
145                 q         : out std_logic_vector(dsize - 1 downto 0)
146         );
147     end component;
148
149     component apu
150         port (  clk         : in std_logic;
151                 ce_n        : 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);
156                 rdy         : out std_logic
157         );
158     end component;
159
160     constant data_size : integer := 8;
161     constant addr_size : integer := 16;
162     constant vram_size14    : integer := 14;
163
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.
168
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;
173
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);
178
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;
184
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;
195
196
197 begin
198
199     irq_n <= '0';
200     vga_clk <= vga_out_clk;
201
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);
205
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);
210
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);
213
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);
217
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);
221
222     --nes ppu instance
223     ppu_inst : ppu 
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);
227
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);
231
232     ---VRAM/CHR ROM instances
233     v_addr (13 downto 8) <= vram_a;
234
235     --transparent d-latch
236     vram_latch : ls373 generic map (data_size)
237                 port map(ale, '0', vram_ad, v_addr(7 downto 0));
238
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);
241
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);
245
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);
248
249     --APU/DMA instance
250     apu_inst : apu
251         port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
252
253 end rtl;
254