OSDN Git Service

jmp inst pch page cross bug fixed
[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
22 ---monitor inside cpu
23     signal dbg_instruction  : out std_logic_vector(7 downto 0);
24     signal dbg_int_d_bus    : out std_logic_vector(7 downto 0);
25     signal dbg_exec_cycle   : out std_logic_vector (5 downto 0);
26     signal dbg_ea_carry     : out std_logic;
27 --    signal dbg_index_bus    : out std_logic_vector(7 downto 0);
28 --    signal dbg_acc_bus      : out std_logic_vector(7 downto 0);
29     signal dbg_status       : out std_logic_vector(7 downto 0);
30 --    signal dbg_pcl, dbg_pch : out std_logic_vector(7 downto 0);
31     signal dbg_sp, dbg_x, dbg_y, dbg_acc       : out std_logic_vector(7 downto 0);
32     signal dbg_dec_oe_n    : out std_logic;
33     signal dbg_dec_val     : out std_logic_vector (7 downto 0);
34     signal dbg_int_dbus    : out std_logic_vector (7 downto 0);
35 --    signal dbg_status_val    : out std_logic_vector (7 downto 0);
36 --    signal dbg_stat_we_n    : out std_logic;
37 --    signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w    : out std_logic_vector (7 downto 0);
38
39 --ppu debug pins
40     signal dbg_ppu_ce_n    : out std_logic;
41     signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
42     signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
43     signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
44     signal dbg_disp_nt, dbg_disp_attr : out std_logic_vector (7 downto 0);
45     signal dbg_disp_ptn_h, dbg_disp_ptn_l : out std_logic_vector (15 downto 0);
46     
47     
48 --NES instance
49         base_clk        : in std_logic;
50         rst_n           : in std_logic;
51         joypad1     : in std_logic_vector(7 downto 0);
52         joypad2     : in std_logic_vector(7 downto 0);
53         h_sync_n    : out std_logic;
54         v_sync_n    : out std_logic;
55         r           : out std_logic_vector(3 downto 0);
56         g           : out std_logic_vector(3 downto 0);
57         b           : out std_logic_vector(3 downto 0)
58          );
59 end de1_nes;
60
61 architecture rtl of de1_nes is
62     component mos6502
63         generic (   dsize : integer := 8;
64                     asize : integer :=16
65                 );
66         port (  
67     signal dbg_instruction  : out std_logic_vector(7 downto 0);
68     signal dbg_int_d_bus  : out std_logic_vector(7 downto 0);
69     signal dbg_exec_cycle      : out std_logic_vector (5 downto 0);
70     signal dbg_ea_carry     : out std_logic;
71 --    signal dbg_index_bus    : out std_logic_vector(7 downto 0);
72 --    signal dbg_acc_bus      : out std_logic_vector(7 downto 0);
73     signal dbg_status       : out std_logic_vector(7 downto 0);
74     signal dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc       : out std_logic_vector(7 downto 0);
75     signal dbg_dec_oe_n    : out std_logic;
76     signal dbg_dec_val     : out std_logic_vector (7 downto 0);
77     signal dbg_int_dbus    : out std_logic_vector (7 downto 0);
78 --    signal dbg_status_val    : out std_logic_vector (7 downto 0);
79     signal dbg_stat_we_n    : out std_logic;
80     signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w    : out std_logic_vector (7 downto 0);
81     
82                 input_clk   : in std_logic; --phi0 input pin.
83                 rdy         : in std_logic;
84                 rst_n       : in std_logic;
85                 irq_n       : in std_logic;
86                 nmi_n       : in std_logic;
87                 dbe         : in std_logic;
88                 r_nw        : out std_logic;
89                 phi1        : out std_logic;
90                 phi2        : out std_logic;
91                 addr        : out std_logic_vector ( asize - 1 downto 0);
92                 d_io        : inout std_logic_vector ( dsize - 1 downto 0)
93         );
94     end component;
95
96     component clock_divider
97         port (  base_clk    : in std_logic;
98                 reset_n     : in std_logic;
99                 cpu_clk     : out std_logic;
100                 ppu_clk     : out std_logic;
101                 mem_clk     : out std_logic;
102                 vga_clk     : out std_logic
103             );
104     end component;
105
106     component address_decoder
107     generic (abus_size : integer := 16; dbus_size : integer := 8);
108         port (  phi2        : in std_logic;
109                 mem_clk     : in std_logic;
110                 R_nW        : in std_logic; 
111                 addr        : in std_logic_vector (abus_size - 1 downto 0);
112                 rom_ce_n    : out std_logic;
113                 ram_ce_n    : out std_logic;
114                 ppu_ce_n    : out std_logic;
115                 apu_ce_n    : out std_logic
116     );
117     end component;
118
119     component ram
120         generic (abus_size : integer := 16; dbus_size : integer := 8);
121         port (  
122                 clk               : in std_logic;
123                 ce_n, oe_n, we_n  : in std_logic;   --select pin active low.
124                 addr              : in std_logic_vector (abus_size - 1 downto 0);
125                 d_io              : inout std_logic_vector (dbus_size - 1 downto 0)
126         );
127     end component;
128
129     component prg_rom
130         generic (abus_size : integer := 15; dbus_size : integer := 8);
131         port (
132                 clk             : in std_logic;
133                 ce_n            : in std_logic;     --active low.
134                 addr            : in std_logic_vector (abus_size - 1 downto 0);
135                 data            : out std_logic_vector (dbus_size - 1 downto 0)
136         );
137     end component;
138
139     component ppu port (
140         signal dbg_ppu_ce_n    : out std_logic;
141         signal dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status : out std_logic_vector (7 downto 0);
142         signal dbg_ppu_addr : out std_logic_vector (13 downto 0);
143         signal dbg_ppu_data, dbg_ppu_scrl_x, dbg_ppu_scrl_y : out std_logic_vector (7 downto 0);
144
145         signal dbg_ppu_clk                      : out std_logic;
146         signal dbg_nes_x                        : out std_logic_vector (8 downto 0);
147         signal dbg_vga_x                        : out std_logic_vector (9 downto 0);
148         signal dbg_disp_nt, dbg_disp_attr       : out std_logic_vector (7 downto 0);
149         signal dbg_disp_ptn_h, dbg_disp_ptn_l   : out std_logic_vector (15 downto 0);
150         signal dbg_plt_ce_rn_wn                 : out std_logic_vector (2 downto 0);
151         signal dbg_plt_addr                     : out std_logic_vector (4 downto 0);
152         signal dbg_plt_data                     : out std_logic_vector (7 downto 0);
153         signal dbg_p_oam_ce_rn_wn               : out std_logic_vector (2 downto 0);
154         signal dbg_p_oam_addr                   : out std_logic_vector (7 downto 0);
155         signal dbg_p_oam_data                   : out std_logic_vector (7 downto 0);
156         signal dbg_s_oam_ce_rn_wn               : out std_logic_vector (2 downto 0);
157         signal dbg_s_oam_addr                   : out std_logic_vector (4 downto 0);
158         signal dbg_s_oam_data                   : out std_logic_vector (7 downto 0);
159
160         signal dbg_ppu_addr_we_n                : out std_logic;
161         signal dbg_ppu_clk_cnt                  : out std_logic_vector(1 downto 0);
162
163                 ppu_clk     : in std_logic;
164                 mem_clk     : in std_logic;
165                 ce_n        : in std_logic;
166                 rst_n       : in std_logic;
167                 r_nw        : in std_logic;
168                 cpu_addr    : in std_logic_vector (2 downto 0);
169                 cpu_d       : inout std_logic_vector (7 downto 0);
170
171                 vblank_n    : out std_logic;
172                 rd_n        : out std_logic;
173                 wr_n        : out std_logic;
174                 ale         : out std_logic;
175                 vram_ad     : inout std_logic_vector (7 downto 0);
176                 vram_a      : out std_logic_vector (13 downto 8);
177
178                 vga_clk     : in std_logic;
179                 h_sync_n    : out std_logic;
180                 v_sync_n    : out std_logic;
181                 r           : out std_logic_vector(3 downto 0);
182                 g           : out std_logic_vector(3 downto 0);
183                 b           : out std_logic_vector(3 downto 0)
184     );
185     end component;
186
187     component v_address_decoder
188     generic (abus_size : integer := 14; dbus_size : integer := 8);
189         port (  clk         : in std_logic; 
190                 mem_clk     : in std_logic;
191                 rd_n        : in std_logic;
192                 wr_n        : in std_logic;
193                 ale         : in std_logic;
194                 v_addr      : in std_logic_vector (13 downto 0);
195                 v_data      : in std_logic_vector (7 downto 0);
196                 nt_v_mirror : in std_logic;
197                 pt_ce_n     : out std_logic;
198                 nt0_ce_n    : out std_logic;
199                 nt1_ce_n    : out std_logic
200             );
201     end component;
202
203     component chr_rom
204         generic (abus_size : integer := 13; dbus_size : integer := 8);
205         port (  
206                 clk             : in std_logic;
207                 ce_n            : in std_logic;     --active low.
208                 addr            : in std_logic_vector (abus_size - 1 downto 0);
209                 data            : out std_logic_vector (dbus_size - 1 downto 0);
210                 nt_v_mirror     : out std_logic
211         );
212     end component;
213
214     component ls373
215         generic (
216             dsize : integer := 8
217         );
218         port (  c         : in std_logic;
219                 we_n      : in std_logic;
220                 oc_n      : in std_logic;
221                 d         : in std_logic_vector(dsize - 1 downto 0);
222                 q         : out std_logic_vector(dsize - 1 downto 0)
223         );
224     end component;
225
226     component apu
227         port (  clk         : in std_logic;
228                 ce_n        : in std_logic;
229                 rst_n       : in std_logic;
230                 r_nw        : inout std_logic;
231                 cpu_addr    : inout std_logic_vector (15 downto 0);
232                 cpu_d       : inout std_logic_vector (7 downto 0);
233                 rdy         : out std_logic
234         );
235     end component;
236
237     constant data_size : integer := 8;
238     constant addr_size : integer := 16;
239     constant vram_size14    : integer := 14;
240
241     constant ram_2k : integer := 11;      --2k = 11 bit width.
242     constant rom_32k : integer := 15;     --32k = 15 bit width.
243     constant rom_4k : integer := 12;     --4k = 12 bit width. (for test use)
244     constant vram_1k : integer := 10;      --1k = 10 bit width.
245     constant chr_rom_8k : integer := 13;     --32k = 15 bit width.
246
247     signal cpu_clk  : std_logic;
248     signal ppu_clk  : std_logic;
249     signal mem_clk  : std_logic;
250     signal vga_clk   : std_logic;
251
252     signal rdy, irq_n, nmi_n, dbe, r_nw : std_logic;
253     signal phi1, phi2 : std_logic;
254     signal addr : std_logic_vector( addr_size - 1 downto 0);
255     signal d_io : std_logic_vector( data_size - 1 downto 0);
256
257     signal rom_ce_n : std_logic;
258     signal ram_ce_n : std_logic;
259     signal ram_oe_n : std_logic;
260     signal ppu_ce_n : std_logic;
261     signal apu_ce_n : std_logic;
262
263     signal rd_n     : std_logic;
264     signal wr_n     : std_logic;
265     signal ale      : std_logic;
266     signal vram_ad  : std_logic_vector (7 downto 0);
267     signal vram_a   : std_logic_vector (13 downto 8);
268     signal v_addr   : std_logic_vector (13 downto 0);
269     signal nt_v_mirror  : std_logic;
270     signal pt_ce_n  : std_logic;
271     signal nt0_ce_n : std_logic;
272     signal nt1_ce_n : std_logic;
273
274     signal ale_n       : std_logic;
275
276 --    signal dbg_disp_nt, dbg_disp_attr : std_logic_vector (7 downto 0);
277 --    signal dbg_disp_ptn_h, dbg_disp_ptn_l : std_logic_vector (15 downto 0);
278     signal dbg_pcl, dbg_pch : std_logic_vector(7 downto 0);
279     signal dbg_stat_we_n    : std_logic;
280     signal dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w    : std_logic_vector (7 downto 0);
281
282     signal dbg_ppu_addr_we_n                : std_logic;
283     signal dbg_ppu_clk_cnt                  : std_logic_vector(1 downto 0);
284     signal dbg_ppu_addr_dummy               : std_logic_vector (13 downto 0);
285     signal dbg_nes_x                        : std_logic_vector (8 downto 0);
286     signal dbg_vga_x                        : std_logic_vector (9 downto 0);
287     signal dbg_plt_ce_rn_wn                 : std_logic_vector (2 downto 0);
288     signal dbg_plt_addr                     : std_logic_vector (4 downto 0);
289     signal dbg_plt_data                     : std_logic_vector (7 downto 0);
290     signal dbg_p_oam_ce_rn_wn               : std_logic_vector (2 downto 0);
291     signal dbg_p_oam_addr                   : std_logic_vector (7 downto 0);
292     signal dbg_p_oam_data                   : std_logic_vector (7 downto 0);
293     signal dbg_s_oam_ce_rn_wn               : std_logic_vector (2 downto 0);
294     signal dbg_s_oam_addr                   : std_logic_vector (4 downto 0);
295     signal dbg_s_oam_data                   : std_logic_vector (7 downto 0);
296     signal dbg_ppu_data_dummy               : std_logic_vector (7 downto 0);
297     signal dbg_ppu_status_dummy             : std_logic_vector (7 downto 0);
298     signal dbg_ppu_scrl_x_dummy             : std_logic_vector (7 downto 0);
299     signal dbg_ppu_scrl_y_dummy             : std_logic_vector (7 downto 0);
300     signal dbg_disp_ptn_h_dummy, dbg_disp_ptn_l_dummy   : std_logic_vector (15 downto 0);
301
302 begin
303
304     irq_n <= '0';
305
306     --ppu/cpu clock generator
307     clock_inst : clock_divider port map 
308         (base_clk, rst_n, cpu_clk, ppu_clk, mem_clk, vga_clk);
309
310     --mos 6502 cpu instance
311     cpu_inst : mos6502 generic map (data_size, addr_size) 
312         port map (
313     dbg_instruction,
314     dbg_int_d_bus,
315     dbg_exec_cycle,
316     dbg_ea_carry,
317  --   dbg_index_bus,
318  --   dbg_acc_bus,
319     dbg_status,
320     dbg_pcl, dbg_pch, dbg_sp, dbg_x, dbg_y, dbg_acc,
321     dbg_dec_oe_n,
322     dbg_dec_val,
323     dbg_int_dbus,
324 --    dbg_status_val    ,
325     dbg_stat_we_n    ,
326     dbg_idl_h, dbg_idl_l, dbg_dbb_r, dbg_dbb_w,
327
328                 cpu_clk, '1', --rdy, -----for testing...
329                 rst_n, irq_n, nmi_n, dbe, r_nw, 
330                 phi1, phi2, addr, d_io);
331
332     addr_dec_inst : address_decoder generic map (addr_size, data_size) 
333         port map (phi2, mem_clk, r_nw, addr, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
334
335     --main ROM/RAM instance
336 --    prg_rom_inst : prg_rom generic map (rom_32k, data_size)
337 --            port map (mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);
338
339     prg_rom_inst : prg_rom generic map (rom_4k, data_size)
340             port map (mem_clk, rom_ce_n, addr(rom_4k - 1 downto 0), d_io);
341
342     ram_oe_n <= not R_nW;
343     prg_ram_inst : ram generic map (ram_2k, data_size)
344             port map (mem_clk, ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
345
346 --    dbg_ppu_addr <= "00000" & dbg_nes_x;
347     dbg_ppu_scrl_x(0) <= ale;
348     dbg_ppu_scrl_x(1) <= rd_n;
349     dbg_ppu_scrl_x(2) <= wr_n;
350     dbg_ppu_scrl_x(3) <= nt0_ce_n;
351     dbg_ppu_scrl_x(4) <= vga_clk;
352     dbg_ppu_scrl_x(5) <= rom_ce_n;
353     dbg_ppu_scrl_x(6) <= ram_ce_n;
354     dbg_ppu_scrl_x(7) <= addr(15);
355     dbg_ppu_scrl_y(2 downto 0) <= dbg_p_oam_ce_rn_wn(2 downto 0);
356     dbg_ppu_scrl_y(5 downto 3) <= dbg_plt_ce_rn_wn(2 downto 0);
357 --    dbg_disp_ptn_l (7 downto 0) <= dbg_p_oam_addr;
358 --    dbg_disp_ptn_l (15 downto 8) <= dbg_p_oam_data;
359
360     dbg_cpu_clk <= cpu_clk;
361     dbg_mem_clk <= mem_clk;
362     dbg_r_nw <= r_nw;
363     dbg_addr <= addr;
364     dbg_d_io <= d_io;
365     dbg_vram_ad  <= vram_ad ;
366     dbg_disp_ptn_l <= "00" & v_addr ;
367     dbg_disp_ptn_h <= "000" & dbg_plt_addr & dbg_plt_data;
368
369 --    dbg_ppu_ctrl <= dbg_pcl;
370 --    dbg_ppu_mask <= dbg_pch;
371     --nes ppu instance
372     ppu_inst: ppu port map (  
373         dbg_ppu_ce_n                                        ,
374         dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status          ,
375         dbg_ppu_addr                                        ,
376         dbg_ppu_data, dbg_ppu_scrl_x_dummy, dbg_ppu_scrl_y_dummy        ,
377
378         dbg_ppu_clk                      ,
379         dbg_nes_x                        ,
380         dbg_vga_x                        ,
381         dbg_disp_nt, dbg_disp_attr                          ,
382         dbg_disp_ptn_h_dummy, dbg_disp_ptn_l_dummy                      ,
383         dbg_plt_ce_rn_wn                 ,
384         dbg_plt_addr                     ,
385         dbg_plt_data                     ,
386         dbg_p_oam_ce_rn_wn              ,
387         dbg_p_oam_addr                  ,
388         dbg_p_oam_data                  ,
389         dbg_s_oam_ce_rn_wn              ,
390         dbg_s_oam_addr                  ,
391         dbg_s_oam_data                  ,
392         dbg_ppu_addr_we_n                                   ,
393         dbg_ppu_clk_cnt                                     ,
394
395                 ppu_clk         ,
396                 mem_clk     ,
397                 ppu_ce_n        ,
398                 rst_n       ,
399                 r_nw        ,
400                 addr(2 downto 0)    ,
401                 d_io       ,
402
403                 nmi_n    ,
404                 rd_n        ,
405                 wr_n        ,
406                 ale         ,
407                 vram_ad     ,
408                 vram_a      ,
409
410                 vga_clk     ,
411                 h_sync_n    ,
412                 v_sync_n    ,
413                 r           ,
414                 g           ,
415                 b           
416
417         );
418
419     ppu_addr_decoder : v_address_decoder generic map (vram_size14, data_size) 
420         port map (ppu_clk, mem_clk, rd_n, wr_n, ale, v_addr, vram_ad, 
421                 nt_v_mirror, pt_ce_n, nt0_ce_n, nt1_ce_n);
422
423     ---VRAM/CHR ROM instances
424     v_addr (13 downto 8) <= vram_a;
425
426     --transparent d-latch
427         ale_n <= not ale;
428         vram_latch : ls373 generic map (data_size)
429                 port map(vga_clk, ale_n, ale, vram_ad, v_addr(7 downto 0));
430
431     vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
432             port map (mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), vram_ad, nt_v_mirror);
433
434     --name table/attr table
435     vram_nt0 : ram generic map (vram_1k, data_size)
436             port map (mem_clk, nt0_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
437
438     vram_nt1 : ram generic map (vram_1k, data_size)
439             port map (mem_clk, nt1_ce_n, rd_n, wr_n, v_addr(vram_1k - 1 downto 0), vram_ad);
440
441 --    --APU/DMA instance
442 --    apu_inst : apu
443 --        port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
444
445 end rtl;
446