OSDN Git Service

rom to be clk syncronized
[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       : inout std_logic_vector (dbus_size - 1 downto 0);
61                 ppu_ce_n    : out std_logic;
62                 apu_ce_n    : out std_logic
63     );
64     end component;
65
66     component ppu
67     port (  clk         : in std_logic;
68             ce_n        : in std_logic;
69             rst_n       : in std_logic;
70             r_nw        : in std_logic;
71             cpu_addr    : in std_logic_vector (2 downto 0);
72             cpu_d       : inout std_logic_vector (7 downto 0);
73             vblank_n    : out std_logic;
74             rd_n        : out std_logic;
75             wr_n        : out std_logic;
76             ale         : out std_logic;
77             vram_ad     : inout std_logic_vector (7 downto 0);
78             vram_a      : out std_logic_vector (13 downto 8);
79             vga_clk     : in std_logic;
80             h_sync_n    : out std_logic;
81             v_sync_n    : out std_logic;
82             r           : out std_logic_vector(3 downto 0);
83             g           : out std_logic_vector(3 downto 0);
84             b           : out std_logic_vector(3 downto 0)
85     );
86     end component;
87
88     component v_address_decoder
89     generic (abus_size : integer := 14; dbus_size : integer := 8);
90         port (  clk         : in std_logic; 
91                 rd_n        : in std_logic;
92                 wr_n        : in std_logic;
93                 ale         : in std_logic;
94                 vram_ad     : inout std_logic_vector (7 downto 0);
95                 vram_a      : in std_logic_vector (13 downto 8)
96             );
97     end component;
98
99     component apu
100         port (  clk         : in std_logic;
101                 ce_n        : in std_logic;
102                 rst_n       : in std_logic;
103                 r_nw        : inout std_logic;
104                 cpu_addr    : inout std_logic_vector (15 downto 0);
105                 cpu_d       : inout std_logic_vector (7 downto 0);
106                 rdy         : out std_logic
107         );
108     end component;
109
110     constant data_size : integer := 8;
111     constant addr_size : integer := 16;
112     constant size14    : integer := 14;
113
114     signal cpu_clk  : std_logic;
115     signal ppu_clk  : std_logic;
116     signal mem_clk  : std_logic;
117     signal vga_out_clk   : std_logic;
118
119     signal rdy, irq_n, nmi_n, dbe, r_nw : std_logic;
120     signal phi1, phi2 : std_logic;
121     signal addr : std_logic_vector( addr_size - 1 downto 0);
122     signal d_io : std_logic_vector( data_size - 1 downto 0);
123
124     signal ppu_ce_n : std_logic;
125     signal apu_ce_n : std_logic;
126     signal rd_n     : std_logic;
127     signal wr_n     : std_logic;
128     signal ale      : std_logic;
129     signal vram_ad  : std_logic_vector (7 downto 0);
130     signal vram_a   : std_logic_vector (13 downto 8);
131
132     --test...
133     signal nmi_n2 : std_logic;
134
135 begin
136
137     irq_n <= '0';
138     vga_clk <= vga_out_clk;
139
140     --ppu/cpu clock generator
141     clock_inst : clock_divider port map 
142         (base_clk, rst_n, cpu_clk, ppu_clk, mem_clk, vga_out_clk);
143
144     --mos 6502 cpu instance
145     cpu_inst : mos6502 generic map (data_size, addr_size) 
146         port map (cpu_clk, rdy, rst_n, irq_n, nmi_n, dbe, r_nw, 
147                 phi1, phi2, addr, d_io);
148
149     addr_dec_inst : address_decoder generic map (addr_size, data_size) 
150         port map (phi2, mem_clk, r_nw, addr, d_io, ppu_ce_n, apu_ce_n);
151
152     --nes ppu instance
153     ppu_inst : ppu 
154         port map (ppu_clk, ppu_ce_n, rst_n, r_nw, addr(2 downto 0), d_io, 
155                 nmi_n, rd_n, wr_n, ale, vram_ad, vram_a,
156                 vga_out_clk, h_sync_n, v_sync_n, r, g, b);
157
158     ppu_addr_decoder : v_address_decoder generic map (size14, data_size) 
159         port map (ppu_clk, rd_n, wr_n, ale, vram_ad, vram_a);
160
161     apu_inst : apu
162         port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
163
164 end rtl;
165