OSDN Git Service

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