OSDN Git Service

clean up. gate level simulation working!!!
[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_addr : out std_logic_vector( 16 - 1 downto 0);\r
17     signal dbg_d_io : out std_logic_vector( 8 - 1 downto 0);\r
18     signal dbg_vram_ad  : out std_logic_vector (7 downto 0);\r
19     signal dbg_vram_a   : out std_logic_vector (13 downto 8);\r
20 ---monitor inside cpu\r
21     signal dbg_instruction  : out std_logic_vector(7 downto 0);\r
22     signal dbg_int_d_bus  : out std_logic_vector(7 downto 0);\r
23     signal dbg_exec_cycle      : out std_logic_vector (5 downto 0);\r
24 \r
25 --NES instance\r
26         base_clk        : in std_logic;
27         rst_n           : in std_logic;
28         joypad1     : in std_logic_vector(7 downto 0);
29         joypad2     : in std_logic_vector(7 downto 0);
30         vga_clk     : out std_logic;
31         h_sync_n    : out std_logic;
32         v_sync_n    : out std_logic;
33         r           : out std_logic_vector(3 downto 0);
34         g           : out std_logic_vector(3 downto 0);
35         b           : out std_logic_vector(3 downto 0)
36          );
37 end de1_nes;
38
39 architecture rtl of de1_nes is
40     component mos6502
41         generic (   dsize : integer := 8;
42                     asize : integer :=16
43                 );
44         port (  \r
45     signal dbg_instruction  : out std_logic_vector(7 downto 0);\r
46     signal dbg_int_d_bus  : out std_logic_vector(7 downto 0);\r
47     signal dbg_exec_cycle      : out std_logic_vector (5 downto 0);\r
48 \r
49                 input_clk   : in std_logic; --phi0 input pin.
50                 rdy         : in std_logic;
51                 rst_n       : in std_logic;
52                 irq_n       : in std_logic;
53                 nmi_n       : in std_logic;
54                 dbe         : in std_logic;
55                 r_nw        : out std_logic;
56                 phi1        : out std_logic;
57                 phi2        : out std_logic;
58                 addr        : out std_logic_vector ( asize - 1 downto 0);
59                 d_io        : inout std_logic_vector ( dsize - 1 downto 0)
60         );
61     end component;
62
63     component clock_divider
64         port (  base_clk    : in std_logic;
65                 reset_n     : in std_logic;
66                 cpu_clk     : out std_logic;
67                 ppu_clk     : out std_logic;
68                 mem_clk     : out std_logic;\r
69                 vga_clk     : out std_logic
70             );
71     end component;
72
73     component address_decoder
74     generic (abus_size : integer := 16; dbus_size : integer := 8);
75         port (  phi2        : in std_logic;\r
76                 mem_clk     : in std_logic;\r
77                 R_nW        : in std_logic; \r
78                 addr        : in std_logic_vector (abus_size - 1 downto 0);\r
79                 d_io        : in std_logic_vector (dbus_size - 1 downto 0);\r
80                 rom_ce_n    : out std_logic;\r
81                 ram_ce_n    : out std_logic;\r
82                 ppu_ce_n    : out std_logic;\r
83                 apu_ce_n    : out std_logic\r
84     );
85     end component;
86
87     component ram\r
88         generic (abus_size : integer := 16; dbus_size : integer := 8);\r
89         port (  ce_n, oe_n, we_n  : in std_logic;   --select pin active low.\r
90                 addr              : in std_logic_vector (abus_size - 1 downto 0);\r
91                 d_io              : inout std_logic_vector (dbus_size - 1 downto 0)\r
92         );\r
93     end component;\r
94 \r
95     component prg_rom\r
96         generic (abus_size : integer := 15; dbus_size : integer := 8);\r
97         port (\r
98                 clk             : in std_logic;\r
99                 ce_n            : in std_logic;     --active low.\r
100                 addr            : in std_logic_vector (abus_size - 1 downto 0);\r
101                 data            : out std_logic_vector (dbus_size - 1 downto 0)\r
102         );\r
103     end component;\r
104 \r
105     component ppu
106     port (  clk         : in std_logic;
107             ce_n        : in std_logic;
108             rst_n       : in std_logic;
109             r_nw        : in std_logic;
110             cpu_addr    : in std_logic_vector (2 downto 0);
111             cpu_d       : inout std_logic_vector (7 downto 0);
112             vblank_n    : out std_logic;
113             rd_n        : out std_logic;
114             wr_n        : out std_logic;
115             ale         : out std_logic;
116             vram_ad     : inout std_logic_vector (7 downto 0);
117             vram_a      : out std_logic_vector (13 downto 8);
118             vga_clk     : in std_logic;
119             h_sync_n    : out std_logic;
120             v_sync_n    : out std_logic;
121             r           : out std_logic_vector(3 downto 0);
122             g           : out std_logic_vector(3 downto 0);
123             b           : out std_logic_vector(3 downto 0)
124     );
125     end component;
126
127     component v_address_decoder
128     generic (abus_size : integer := 14; dbus_size : integer := 8);
129         port (  clk         : in std_logic; 
130                 rd_n        : in std_logic;
131                 wr_n        : in std_logic;
132                 ale         : in std_logic;
133                 vram_ad     : inout std_logic_vector (7 downto 0);
134                 vram_a      : in std_logic_vector (13 downto 8)
135             );
136     end component;
137 \r
138     component apu
139         port (  clk         : in std_logic;
140                 ce_n        : in std_logic;
141                 rst_n       : in std_logic;
142                 r_nw        : inout std_logic;
143                 cpu_addr    : inout std_logic_vector (15 downto 0);
144                 cpu_d       : inout std_logic_vector (7 downto 0);
145                 rdy         : out std_logic
146         );
147     end component;
148
149     constant data_size : integer := 8;
150     constant addr_size : integer := 16;
151     constant size14    : integer := 14;
152
153     constant ram_2k : integer := 11;      --2k = 11 bit width.\r
154     constant rom_32k : integer := 15;     --32k = 15 bit width.\r
155     constant rom_4k : integer := 12;     --4k = 12 bit width. (for test use)\r
156     \r
157 \r
158     signal cpu_clk  : std_logic;
159     signal ppu_clk  : std_logic;
160     signal mem_clk  : std_logic;\r
161     signal vga_out_clk   : std_logic;
162
163     signal rdy, irq_n, nmi_n, dbe, r_nw : std_logic;
164     signal phi1, phi2 : std_logic;
165     signal addr : std_logic_vector( addr_size - 1 downto 0);
166     signal d_io : std_logic_vector( data_size - 1 downto 0);
167
168     signal rom_ce_n : std_logic;\r
169     signal ram_ce_n : std_logic;\r
170     signal ram_oe_n : std_logic;\r
171     signal ppu_ce_n : std_logic;
172     signal apu_ce_n : std_logic;
173     signal rd_n     : std_logic;
174     signal wr_n     : std_logic;
175     signal ale      : std_logic;
176     signal vram_ad  : std_logic_vector (7 downto 0);
177     signal vram_a   : std_logic_vector (13 downto 8);
178 \r
179 begin
180
181     irq_n <= '0';
182     vga_clk <= vga_out_clk;
183
184     --ppu/cpu clock generator
185     clock_inst : clock_divider port map 
186         (base_clk, rst_n, cpu_clk, ppu_clk, mem_clk, vga_out_clk);
187
188     --mos 6502 cpu instance
189     cpu_inst : mos6502 generic map (data_size, addr_size) 
190         port map (\r
191     dbg_instruction,\r
192     dbg_int_d_bus,\r
193     dbg_exec_cycle,\r
194                 cpu_clk, '1', --rdy, -----for testing...\r
195                 rst_n, irq_n, nmi_n, dbe, r_nw, 
196                 phi1, phi2, addr, d_io);
197
198     addr_dec_inst : address_decoder generic map (addr_size, data_size) 
199         port map (phi2, mem_clk, r_nw, addr, d_io, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
200 \r
201     --main ROM/RAM instance\r
202 --    prg_rom_inst : prg_rom generic map (rom_32k, data_size)\r
203 --            port map (mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);\r
204     prg_rom_inst : prg_rom generic map (rom_4k, data_size)\r
205             port map (mem_clk, rom_ce_n, addr(rom_4k - 1 downto 0), d_io);\r
206 \r
207     ram_oe_n <= not R_nW;\r
208 --    prg_ram_inst : ram generic map (ram_2k, data_size)\r
209 --            port map (ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);\r
210 \r
211 --    --nes ppu instance
212 --    ppu_inst : ppu 
213 --        port map (ppu_clk, ppu_ce_n, rst_n, r_nw, addr(2 downto 0), d_io, 
214 --                nmi_n, rd_n, wr_n, ale, vram_ad, vram_a,
215 --                vga_out_clk, h_sync_n, v_sync_n, r, g, b);
216 --
217 --    ppu_addr_decoder : v_address_decoder generic map (size14, data_size) 
218 --        port map (ppu_clk, rd_n, wr_n, ale, vram_ad, vram_a);
219 --
220 --    apu_inst : apu
221 --        port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);\r
222 \r
223     dbg_cpu_clk <= cpu_clk;\r
224     dbg_ppu_clk <= ppu_clk;\r
225     dbg_mem_clk <= mem_clk;\r
226     dbg_addr <= addr;\r
227     dbg_d_io <= d_io;\r
228 --    dbg_vram_ad  <= vram_ad ;\r
229 --    dbg_vram_a   <= vram_a  ;\r
230
231
232 end rtl;
233