OSDN Git Service

sprite ram added.
[motonesfpga/motonesfpga.git] / de0_cv_nes / de0_cv_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 DE0-CV Environment Virtual Cuicuit Board
7 --   All of the components are assembled and instanciated on this board.
8 --  
9
10 entity de0_cv_nes is 
11     port (\r
12 --logic analyzer reference clock
13     signal dbg_base_clk: out std_logic;\r
14     
15 --NES instance
16         pi_base_clk     : in std_logic;
17         pi_rst_n        : in std_logic;
18         pi_joypad1     : in std_logic_vector(7 downto 0);
19         pi_joypad2     : in std_logic_vector(7 downto 0);
20         po_h_sync_n    : out std_logic;
21         po_v_sync_n    : out std_logic;
22         po_r           : out std_logic_vector(3 downto 0);
23         po_g           : out std_logic_vector(3 downto 0);
24         po_b           : out std_logic_vector(3 downto 0);
25         pi_nt_v_mirror : in std_logic\r
26          );
27 end de0_cv_nes;
28
29 architecture rtl of de0_cv_nes is
30     component mos6502
31         port (
32                 pi_rst_n       : in std_logic;\r
33                 pi_base_clk    : in std_logic;\r
34                 pi_cpu_en      : in std_logic_vector (7 downto 0);\r
35                 pi_rdy         : in std_logic;\r
36                 pi_irq_n       : in std_logic;\r
37                 pi_nmi_n       : in std_logic;\r
38                 po_r_nw        : out std_logic;\r
39                 po_addr        : out std_logic_vector ( 15 downto 0);\r
40                 pio_d_io       : inout std_logic_vector ( 7 downto 0)\r
41         );
42     end component;
43
44     component clock_selector\r
45         port (\r
46                 pi_rst_n        : in std_logic;\r
47                 pi_base_clk     : in std_logic;\r
48                 po_cpu_en       : out std_logic_vector (7 downto 0);\r
49                 po_ppu_en       : out std_logic_vector (3 downto 0)\r
50             );\r
51     end component;\r
52 \r
53     component chip_selector\r
54         port (\r
55                 pi_rst_n        : in std_logic;\r
56                 pi_base_clk     : in std_logic;\r
57                 pi_addr         : in std_logic_vector (15 downto 0);\r
58                 po_rom_ce_n     : out std_logic;\r
59                 po_ram_ce_n     : out std_logic;\r
60                 po_ppu_ce_n     : out std_logic;\r
61                 po_apu_ce_n     : out std_logic\r
62             );\r
63     end component;\r
64 \r
65     component ppu port (
66                 pi_rst_n       : in std_logic;\r
67                 pi_base_clk    : in std_logic;
68                 pi_cpu_en      : in std_logic_vector (7 downto 0);\r
69                 pi_ce_n        : in std_logic;
70                 pi_r_nw        : in std_logic;
71                 pi_cpu_addr    : in std_logic_vector (2 downto 0);
72                 pio_cpu_d      : inout std_logic_vector (7 downto 0);
73
74                 po_v_rd_n       : out std_logic;\r
75                 po_v_wr_n       : out std_logic;\r
76                 po_v_addr       : out std_logic_vector (13 downto 0);\r
77                 pio_v_data      : inout std_logic_vector (7 downto 0);\r
78 \r
79                 po_spr_ce_n     : out std_logic;\r
80                 po_spr_rd_n     : out std_logic;\r
81                 po_spr_wr_n     : out std_logic;\r
82                 po_spr_addr     : out std_logic_vector (7 downto 0);\r
83                 po_spr_data     : out std_logic_vector (7 downto 0)\r
84     );
85     end component;
86
87     component ram\r
88         generic (abus_size : integer := 16; dbus_size : integer := 8);\r
89         port (\r
90                 pi_base_clk     : in std_logic;\r
91                 pi_ce_n         : in std_logic;\r
92                 pi_oe_n         : in std_logic;\r
93                 pi_we_n         : in std_logic;\r
94                 pi_addr         : in std_logic_vector (abus_size - 1 downto 0);\r
95                 pio_d_io        : inout std_logic_vector (dbus_size - 1 downto 0)\r
96             );\r
97     end component;\r
98 \r
99     component palette_ram\r
100         port (\r
101                 pi_base_clk     : in std_logic;\r
102                 pi_ce_n         : in std_logic;\r
103                 pi_oe_n         : in std_logic;\r
104                 pi_we_n         : in std_logic;\r
105                 pi_addr         : in std_logic_vector (4 downto 0);\r
106                 pio_d_io        : inout std_logic_vector (7 downto 0)\r
107             );\r
108     end component;\r
109 \r
110     component chr_rom\r
111         port (  \r
112                 pi_base_clk     : in std_logic;\r
113                 pi_ce_n         : in std_logic;\r
114                 pi_addr         : in std_logic_vector (12 downto 0);\r
115                 po_data         : out std_logic_vector (7 downto 0)\r
116             );\r
117     end component;\r
118 \r
119     component v_chip_selector\r
120         port (\r
121                     pi_rst_n        : in std_logic;\r
122                     pi_base_clk     : in std_logic;\r
123                     pi_v_addr       : in std_logic_vector (13 downto 0);\r
124                     pi_nt_v_mirror  : in std_logic;\r
125                     po_pt_ce_n      : out std_logic;\r
126                     po_nt0_ce_n     : out std_logic;\r
127                     po_nt1_ce_n     : out std_logic;\r
128                     po_plt_ce_n     : out std_logic\r
129             );\r
130     end component;\r
131 \r
132 constant ram_2k     : integer := 11;    --2k = 11   bit width.\r
133 constant rom_32k    : integer := 15;    --32k = 15  bit width.\r
134 constant vram_1k    : integer := 10;    --1k = 10   bit width.\r
135 \r
136 signal wr_cpu_en       : std_logic_vector (7 downto 0);\r
137 signal wr_ppu_en       : std_logic_vector (3 downto 0);\r
138 \r
139 signal wr_rdy       : std_logic;\r
140 signal wr_irq_n     : std_logic;\r
141 signal wr_nmi_n     : std_logic;\r
142 signal wr_r_nw      : std_logic;\r
143 \r
144 signal wr_addr      : std_logic_vector ( 15 downto 0);\r
145 signal wr_d_io      : std_logic_vector ( 7 downto 0);\r
146 \r
147 signal wr_rom_ce_n     : std_logic;\r
148 signal wr_ram_ce_n     : std_logic;\r
149 signal wr_ppu_ce_n     : std_logic;\r
150 signal wr_apu_ce_n     : std_logic;\r
151 \r
152 signal wr_v_rd_n        : std_logic;\r
153 signal wr_v_wr_n        : std_logic;\r
154 signal wr_v_addr        : std_logic_vector (13 downto 0);\r
155 signal wr_v_data        : std_logic_vector (7 downto 0);\r
156 \r
157 signal wr_spr_ce_n      : std_logic;\r
158 signal wr_spr_rd_n      : std_logic;\r
159 signal wr_spr_wr_n      : std_logic;\r
160 signal wr_spr_addr      : std_logic_vector (7 downto 0);\r
161 signal wr_spr_data      : std_logic_vector (7 downto 0);\r
162 \r
163 signal wr_pt_ce_n       : std_logic;\r
164 signal wr_nt0_ce_n      : std_logic;\r
165 signal wr_nt1_ce_n      : std_logic;\r
166 signal wr_plt_ce_n      : std_logic;\r
167 \r
168 \r
169 begin
170 \r
171     dbg_base_clk <= pi_base_clk;\r
172 \r
173     --synchronized clock generator instance\r
174     clock_selector_inst : clock_selector port map (\r
175             pi_rst_n,\r
176             pi_base_clk,\r
177             wr_cpu_en,\r
178             wr_ppu_en\r
179             );\r
180 \r
181     --mos 6502 cpu instance\r
182     cpu_inst : mos6502 port map (\r
183             pi_rst_n, \r
184             pi_base_clk, \r
185             wr_cpu_en, \r
186             wr_rdy,\r
187             wr_irq_n, \r
188             wr_nmi_n, \r
189             wr_r_nw, \r
190             wr_addr, \r
191             wr_d_io\r
192             );\r
193 \r
194     --chip select (address decode)\r
195     cs_inst : chip_selector port map (\r
196             pi_rst_n,\r
197             pi_base_clk, \r
198             wr_addr,\r
199             wr_rom_ce_n,\r
200             wr_ram_ce_n,\r
201             wr_ppu_ce_n,\r
202             wr_apu_ce_n\r
203             );\r
204 \r
205     --ppu\r
206     ppu_inst : ppu port map (\r
207             pi_rst_n, \r
208             pi_base_clk, \r
209             wr_cpu_en,\r
210             wr_ppu_ce_n,\r
211             wr_r_nw, \r
212             wr_addr(2 downto 0), \r
213             wr_d_io,\r
214 \r
215             wr_v_rd_n,\r
216             wr_v_wr_n,\r
217             wr_v_addr,\r
218             wr_v_data,\r
219 \r
220             wr_spr_ce_n,\r
221             wr_spr_rd_n,\r
222             wr_spr_wr_n,\r
223             wr_spr_addr,\r
224             wr_spr_data\r
225             );\r
226 \r
227     --vram chip select (address decode)\r
228     vcs_inst : v_chip_selector port map (\r
229             pi_rst_n,\r
230             pi_base_clk, \r
231             wr_v_addr,\r
232             pi_nt_v_mirror,\r
233             wr_pt_ce_n,\r
234             wr_nt0_ce_n,\r
235             wr_nt1_ce_n,\r
236             wr_plt_ce_n\r
237             );\r
238 \r
239     --name table/attr table #0\r
240     vram_nt0_inst : ram generic map\r
241         (vram_1k, 8) port map (\r
242             pi_base_clk,\r
243             wr_nt0_ce_n,\r
244             wr_v_rd_n,\r
245             wr_v_wr_n,\r
246             wr_v_addr(vram_1k - 1 downto 0),\r
247             wr_v_data\r
248             );\r
249 \r
250     --name table/attr table #1\r
251     vram_nt1_inst : ram generic map\r
252         (vram_1k, 8) port map (\r
253             pi_base_clk,\r
254             wr_nt1_ce_n,\r
255             wr_v_rd_n,\r
256             wr_v_wr_n,\r
257             wr_v_addr(vram_1k - 1 downto 0),\r
258             wr_v_data\r
259             );\r
260 \r
261     --palette table\r
262     vram_plt_inst : palette_ram port map (\r
263             pi_base_clk,\r
264             wr_plt_ce_n,\r
265             wr_v_rd_n,\r
266             wr_v_wr_n,\r
267             wr_v_addr(4 downto 0),\r
268             wr_v_data\r
269             );\r
270 \r
271     --pattern table\r
272     chr_rom_inst : chr_rom port map (\r
273             pi_base_clk,\r
274             wr_pt_ce_n,\r
275             wr_v_addr(12 downto 0),\r
276             wr_v_data\r
277             );\r
278 \r
279     --palette table\r
280     spr_ram_inst : ram generic map\r
281             (8, 8) port map (\r
282             pi_base_clk,\r
283             wr_spr_ce_n,\r
284             wr_spr_rd_n,\r
285             wr_spr_wr_n,\r
286             wr_spr_addr,\r
287             wr_spr_data\r
288             );\r
289 \r
290     wr_rdy <= '1';\r
291     wr_irq_n <= '1';\r
292     wr_nmi_n <= '1';\r
293 \r
294     po_h_sync_n    <= '0';\r
295     po_v_sync_n    <= '0';\r
296     po_r           <= (others => '0');\r
297     po_g           <= (others => '0');\r
298     po_b           <= (others => '0');\r
299 end rtl;