OSDN Git Service

ppu integration and bug fix
[motonesfpga/motonesfpga.git] / de1_nes / de1_nes.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 de1_nes is 
11     port (
12 --debug signal
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);
21 ---monitor inside cpu
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);
25 --    signal dbg_index_bus    : out std_logic_vector(7 downto 0);
26 --    signal dbg_acc_bus      : out std_logic_vector(7 downto 0);
27     signal dbg_status       : out std_logic_vector(7 downto 0);
28     signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc       : out std_logic_vector(7 downto 0);
29     signal dbg_dec_oe_n    : out std_logic;
30     signal dbg_dec_val     : out std_logic_vector (7 downto 0);
31     signal dbg_int_dbus    : out std_logic_vector (7 downto 0);
32 --    signal dbg_status_val    : out std_logic_vector (7 downto 0);
33     signal dbg_stat_we_n    : out std_logic;
34     signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w    : out std_logic_vector (7 downto 0);\r
35 \r
36     signal dbg_ppu_ce_n    : out std_logic;\r
37     signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);\r
38     signal dbg_ppu_addr : out std_logic_vector (13 downto 0);\r
39     signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);\r
40 \r
41     \r
42     \r
43     \r
44 --NES instance
45         base_clk        : in std_logic;
46         rst_n           : in std_logic;
47         joypad1     : in std_logic_vector(7 downto 0);
48         joypad2     : in std_logic_vector(7 downto 0);
49         vga_clk     : out std_logic;
50         h_sync_n    : out std_logic;
51         v_sync_n    : out std_logic;
52         r           : out std_logic_vector(3 downto 0);
53         g           : out std_logic_vector(3 downto 0);
54         b           : out std_logic_vector(3 downto 0)
55          );
56 end de1_nes;
57
58 architecture rtl of de1_nes is
59     component mos6502
60         generic (   dsize : integer := 8;
61                     asize : integer :=16
62                 );
63         port (  
64     signal dbg_instruction  : out std_logic_vector(7 downto 0);
65     signal dbg_int_d_bus  : out std_logic_vector(7 downto 0);
66     signal dbg_exec_cycle      : out std_logic_vector (5 downto 0);
67 --    signal dbg_index_bus    : out std_logic_vector(7 downto 0);
68 --    signal dbg_acc_bus      : out std_logic_vector(7 downto 0);
69     signal dbg_status       : out std_logic_vector(7 downto 0);
70     signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc       : out std_logic_vector(7 downto 0);
71     signal dbg_dec_oe_n    : out std_logic;
72     signal dbg_dec_val     : out std_logic_vector (7 downto 0);
73     signal dbg_int_dbus    : out std_logic_vector (7 downto 0);
74 --    signal dbg_status_val    : out std_logic_vector (7 downto 0);
75     signal dbg_stat_we_n    : out std_logic;
76     signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w    : out std_logic_vector (7 downto 0);\r
77     
78                 input_clk   : in std_logic; --phi0 input pin.
79                 rdy         : in std_logic;
80                 rst_n       : in std_logic;
81                 irq_n       : in std_logic;
82                 nmi_n       : in std_logic;
83                 dbe         : in std_logic;
84                 r_nw        : out std_logic;
85                 phi1        : out std_logic;
86                 phi2        : out std_logic;
87                 addr        : out std_logic_vector ( asize - 1 downto 0);
88                 d_io        : inout std_logic_vector ( dsize - 1 downto 0)
89         );
90     end component;
91
92     component clock_divider
93         port (  base_clk    : in std_logic;
94                 reset_n     : in std_logic;
95                 cpu_clk     : out std_logic;
96                 ppu_clk     : out std_logic;
97                 mem_clk     : out std_logic;
98                 vga_clk     : out std_logic
99             );
100     end component;
101
102     component address_decoder
103     generic (abus_size : integer := 16; dbus_size : integer := 8);
104         port (  phi2        : in std_logic;
105                 mem_clk     : in std_logic;
106                 R_nW        : in std_logic; 
107                 addr        : in std_logic_vector (abus_size - 1 downto 0);
108                 d_io        : in std_logic_vector (dbus_size - 1 downto 0);
109                 rom_ce_n    : out std_logic;
110                 ram_ce_n    : out std_logic;
111                 ppu_ce_n    : out std_logic;
112                 apu_ce_n    : out std_logic
113     );
114     end component;
115
116     component ram
117         generic (abus_size : integer := 16; dbus_size : integer := 8);
118         port (  
119                 clk               : in std_logic;
120                 ce_n, oe_n, we_n  : in std_logic;   --select pin active low.
121                 addr              : in std_logic_vector (abus_size - 1 downto 0);
122                 d_io              : inout std_logic_vector (dbus_size - 1 downto 0)
123         );
124     end component;
125
126     component prg_rom
127         generic (abus_size : integer := 15; dbus_size : integer := 8);
128         port (
129                 clk             : in std_logic;
130                 ce_n            : in std_logic;     --active low.
131                 addr            : in std_logic_vector (abus_size - 1 downto 0);
132                 data            : out std_logic_vector (dbus_size - 1 downto 0)
133         );
134     end component;
135
136     component ppu
137     port (  \r
138     signal dbg_ppu_ce_n    : out std_logic;\r
139     signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);\r
140     signal dbg_ppu_addr : out std_logic_vector (13 downto 0);\r
141     signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);\r
142     \r
143             clk         : in std_logic;
144             mem_clk     : in std_logic;
145             ce_n        : in std_logic;
146             rst_n       : in std_logic;
147             r_nw        : in std_logic;
148             cpu_addr    : in std_logic_vector (2 downto 0);
149             cpu_d       : inout std_logic_vector (7 downto 0);
150             vblank_n    : out std_logic;
151             rd_n        : out std_logic;
152             wr_n        : out std_logic;
153             ale         : out std_logic;
154             vram_ad     : inout std_logic_vector (7 downto 0);
155             vram_a      : out std_logic_vector (13 downto 8);
156             vga_clk     : in std_logic;
157             h_sync_n    : out std_logic;
158             v_sync_n    : out std_logic;
159             r           : out std_logic_vector(3 downto 0);
160             g           : out std_logic_vector(3 downto 0);
161             b           : out std_logic_vector(3 downto 0)
162     );
163     end component;
164
165     component v_address_decoder
166     generic (abus_size : integer := 14; dbus_size : integer := 8);
167         port (  clk         : in std_logic; 
168                 mem_clk     : in std_logic;
169                 rd_n        : in std_logic;
170                 wr_n        : in std_logic;
171                 ale         : in std_logic;
172                 v_addr      : in std_logic_vector (13 downto 0);
173                 v_data      : in std_logic_vector (7 downto 0);
174                 nt_v_mirror : in std_logic;
175                 pt_ce_n     : out std_logic;
176                 nt0_ce_n    : out std_logic;
177                 nt1_ce_n    : out std_logic
178             );
179     end component;
180
181     component chr_rom
182         generic (abus_size : integer := 13; dbus_size : integer := 8);
183         port (  
184                 clk             : in std_logic;
185                 ce_n            : in std_logic;     --active low.
186                 addr            : in std_logic_vector (abus_size - 1 downto 0);
187                 data            : out std_logic_vector (dbus_size - 1 downto 0);
188                 nt_v_mirror     : out std_logic
189         );
190     end component;
191
192     component ls373
193         generic (
194             dsize : integer := 8
195         );
196         port (  c         : in std_logic;
197                 oc_n      : in std_logic;
198                 d         : in std_logic_vector(dsize - 1 downto 0);
199                 q         : out std_logic_vector(dsize - 1 downto 0)
200         );
201     end component;
202
203     component apu
204         port (  clk         : in std_logic;
205                 ce_n        : in std_logic;
206                 rst_n       : in std_logic;
207                 r_nw        : inout std_logic;
208                 cpu_addr    : inout std_logic_vector (15 downto 0);
209                 cpu_d       : inout std_logic_vector (7 downto 0);
210                 rdy         : out std_logic
211         );
212     end component;
213
214     constant data_size : integer := 8;
215     constant addr_size : integer := 16;
216     constant vram_size14    : integer := 14;
217
218     constant ram_2k : integer := 11;      --2k = 11 bit width.
219     constant rom_32k : integer := 15;     --32k = 15 bit width.
220     constant rom_4k : integer := 12;     --4k = 12 bit width. (for test use)
221     constant vram_1k : integer := 10;      --1k = 10 bit width.
222     constant chr_rom_8k : integer := 13;     --32k = 15 bit width.
223
224     signal cpu_clk  : std_logic;
225     signal ppu_clk  : std_logic;
226     signal mem_clk  : std_logic;
227     signal vga_out_clk   : std_logic;
228
229     signal rdy, irq_n, nmi_n, dbe, r_nw : std_logic;
230     signal phi1, phi2 : std_logic;
231     signal addr : std_logic_vector( addr_size - 1 downto 0);
232     signal d_io : std_logic_vector( data_size - 1 downto 0);
233
234     signal rom_ce_n : std_logic;
235     signal ram_ce_n : std_logic;
236     signal ram_oe_n : std_logic;
237     signal ppu_ce_n : std_logic;
238     signal apu_ce_n : std_logic;
239
240     signal rd_n     : std_logic;
241     signal wr_n     : std_logic;
242     signal ale      : std_logic;
243     signal vram_ad  : std_logic_vector (7 downto 0);
244     signal vram_a   : std_logic_vector (13 downto 8);
245     signal v_addr   : std_logic_vector (13 downto 0);
246     signal nt_v_mirror  : std_logic;
247     signal pt_ce_n  : std_logic;
248     signal nt0_ce_n : std_logic;
249     signal nt1_ce_n : std_logic;
250
251
252 begin
253
254     irq_n <= '0';
255     vga_clk <= vga_out_clk;
256
257     --ppu/cpu clock generator
258     clock_inst : clock_divider port map 
259         (base_clk, rst_n, cpu_clk, ppu_clk, mem_clk, vga_out_clk);
260
261     --mos 6502 cpu instance
262     cpu_inst : mos6502 generic map (data_size, addr_size) 
263         port map (
264     dbg_instruction,
265     dbg_int_d_bus,
266     dbg_exec_cycle,
267  --   dbg_index_bus,
268  --   dbg_acc_bus,
269     dbg_status,
270     dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc,
271     dbg_dec_oe_n,
272     dbg_dec_val,
273     dbg_int_dbus,
274 --    dbg_status_val    ,
275     dbg_stat_we_n    ,
276     dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w,\r
277
278                 cpu_clk, '1', --rdy, -----for testing...
279                 rst_n, irq_n, nmi_n, dbe, r_nw, 
280                 phi1, phi2, addr, d_io);
281
282     addr_dec_inst : address_decoder generic map (addr_size, data_size) 
283         port map (phi2, mem_clk, r_nw, addr, d_io, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
284
285     --main ROM/RAM instance
286 --    prg_rom_inst : prg_rom generic map (rom_32k, data_size)
287 --            port map (mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);
288     prg_rom_inst : prg_rom generic map (rom_4k, data_size)
289             port map (mem_clk, rom_ce_n, addr(rom_4k - 1 downto 0), d_io);
290
291     ram_oe_n <= not R_nW;
292     prg_ram_inst : ram generic map (ram_2k, data_size)
293             port map (mem_clk, ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
294
295     --nes ppu instance
296     ppu_inst : ppu 
297         port map (\r
298             dbg_ppu_ce_n    ,\r
299             dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status, dbg_ppu_addr, \r
300             dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y,\r
301                 \r
302                 ppu_clk, mem_clk, ppu_ce_n, rst_n, r_nw, addr(2 downto 0), d_io, 
303                 nmi_n, rd_n, wr_n, ale, vram_ad, vram_a,
304                 vga_out_clk, h_sync_n, v_sync_n, r, g, b);
305
306     ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size) 
307         port map (ppu_clk, mem_clk, rd_n, wr_n, ale, v_addr, vram_ad, 
308                 nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);
309
310     ---VRAM/CHR ROM instances
311     v_addr (13 downto 8) <= vram_a;
312
313     --transparent d-latch
314     vram_latch : ls373 generic map (data_size)
315                 port map(ale, '0', vram_ad, v_addr(7 downto 0));
316
317     vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
318             port map (mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), vram_ad, nt_v_mirror);
319
320     --name table/attr table
321     vram_nt0 : ram generic map (vram_1k, data_size)
322             port map (mem_clk, nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
323
324     vram_nt1 : ram generic map (vram_1k, data_size)
325             port map (mem_clk, nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
326
327 --    --APU/DMA instance
328 --    apu_inst : apu
329 --        port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
330
331     dbg_cpu_clk <= cpu_clk;
332     dbg_ppu_clk <= ppu_clk;
333     dbg_mem_clk <= mem_clk;
334     dbg_r_nw <= r_nw;
335     dbg_addr <= addr;
336     dbg_d_io <= d_io;
337     dbg_vram_ad  <= vram_ad ;
338     dbg_vram_a   <= vram_a  ;
339
340
341 end rtl;
342