OSDN Git Service

oam clear ok
[motonesfpga/motonesfpga.git] / de0_cv_nes / chip_selector.vhd
1 ---------------------------------------------\r
2 ---------------------------------------------\r
3 -------- synchronized clock selector --------\r
4 ---------------------------------------------\r
5 ---------------------------------------------\r
6 library ieee;
7 use ieee.std_logic_1164.all;
8 use ieee.std_logic_unsigned.all;
9
10 entity clock_selector is 
11     port (  \r
12                 pi_rst_n        : in std_logic;\r
13                 pi_base_clk     : in std_logic;\r
14                 po_cpu_en       : out std_logic_vector (7 downto 0);\r
15                 po_rnd_en       : out std_logic_vector (3 downto 0)\r
16         );
17 end clock_selector;
18
19 architecture rtl of clock_selector is\r
20 \r
21 signal reg_cpu_en       : std_logic_vector (7 downto 0);\r
22 signal reg_rnd_en       : std_logic_vector (3 downto 0);\r
23 \r
24 begin
25     --Actual NES base clock =  21.477272 MHz
26     --CPU clock = base clock / 12
27     --PPU clock = base clock / 4
28     --Actual NES CPU clock = 1.78 MHz (559 ns / cycle)
29     --VGA clock = 25 MHz.
30
31         ---DE1 base clock 50 MHz
32     ---motones sim project uses following clock.
33     --cpu clock = base clock / 16
34     --ppu clock = base clock / 8
35     --vga clock = base clock / 2\r
36     --emu ppu clock = base clock / 4
37 \r
38     po_cpu_en <= reg_cpu_en;\r
39     \r
40     cpu_clk_p : process (pi_rst_n, pi_base_clk)\r
41     variable ref_cnt : integer range 0 to 31;\r
42     begin\r
43         if (pi_rst_n = '0') then\r
44             reg_cpu_en <= (others => '0');\r
45             ref_cnt := 0;\r
46         else\r
47             if (rising_edge(pi_base_clk)) then\r
48                 if (ref_cnt = 0) then\r
49                     reg_cpu_en <= "00000001";\r
50                 elsif (ref_cnt = 4) then\r
51                     reg_cpu_en <= "00000010";\r
52                 elsif (ref_cnt = 8) then\r
53                     reg_cpu_en <= "00000100";\r
54                 elsif (ref_cnt = 12) then\r
55                     reg_cpu_en <= "00001000";\r
56                 elsif (ref_cnt = 16) then\r
57                     reg_cpu_en <= "00010000";\r
58                 elsif (ref_cnt = 20) then\r
59                     reg_cpu_en <= "00100000";\r
60                 elsif (ref_cnt = 24) then\r
61                     reg_cpu_en <= "01000000";\r
62                 elsif (ref_cnt = 28) then\r
63                     reg_cpu_en <= "10000000";\r
64                 else\r
65                     reg_cpu_en <= "00000000";\r
66                 end if;\r
67 \r
68                 if (ref_cnt = 31) then\r
69                     ref_cnt := 0;\r
70                 else\r
71                     ref_cnt := ref_cnt + 1;\r
72                 end if;\r
73             end if;\r
74         end if;\r
75     end process;\r
76 \r
77     --render clock timing enabler.\r
78     po_rnd_en <= reg_rnd_en;\r
79 \r
80     ppu_clk_p : process (pi_rst_n, pi_base_clk)\r
81     variable ref_cnt : integer range 0 to 3;\r
82     begin\r
83         if (pi_rst_n = '0') then\r
84             reg_rnd_en <= (others => '0');\r
85             ref_cnt := 0;\r
86         else\r
87             if (rising_edge(pi_base_clk)) then\r
88                 if (ref_cnt = 0) then\r
89                     reg_rnd_en <= "0001";\r
90                 elsif (ref_cnt = 1) then\r
91                     reg_rnd_en <= "0010";\r
92                 elsif (ref_cnt = 2) then\r
93                     reg_rnd_en <= "0100";\r
94                 elsif (ref_cnt = 3) then\r
95                     reg_rnd_en <= "1000";\r
96                 else\r
97                     reg_rnd_en <= "0000";\r
98                 end if;\r
99                 \r
100                 if (ref_cnt = 3) then\r
101                     ref_cnt := 0;\r
102                 else\r
103                     ref_cnt := ref_cnt + 1;\r
104                 end if;\r
105             end if;\r
106         end if;\r
107     end process;\r
108 \r
109 end rtl;
110
111 \r
112 ---------------------------------------------\r
113 ---------------------------------------------\r
114 --------------- chip selector ---------------\r
115 ---------------------------------------------\r
116 ---------------------------------------------\r
117 library ieee;\r
118 use ieee.std_logic_1164.all;\r
119 use ieee.std_logic_unsigned.all;\r
120 \r
121 entity chip_selector is \r
122     port (\r
123                 pi_rst_n        : in std_logic;\r
124                 pi_base_clk    : in std_logic;\r
125                 pi_addr         : in std_logic_vector (15 downto 0);\r
126                 po_rom_ce_n     : out std_logic;\r
127                 po_ram_ce_n     : out std_logic;\r
128                 po_ppu_ce_n     : out std_logic;\r
129                 po_apu_ce_n     : out std_logic\r
130         );\r
131 end chip_selector;\r
132 \r
133 architecture rtl of chip_selector is\r
134 \r
135 signal reg_rom_ce_n      : std_logic;\r
136 signal reg_ram_ce_n      : std_logic;\r
137 signal reg_ppu_ce_n      : std_logic;\r
138 signal reg_apu_ce_n      : std_logic;\r
139 \r
140 begin\r
141     po_rom_ce_n <= reg_rom_ce_n;\r
142     po_ram_ce_n <= reg_ram_ce_n;\r
143     po_ppu_ce_n <= reg_ppu_ce_n;\r
144     po_apu_ce_n <= reg_apu_ce_n;\r
145 \r
146     chip_sel_p : process (pi_rst_n, pi_base_clk)\r
147     begin\r
148         if (pi_rst_n = '0') then\r
149             reg_rom_ce_n <= '1';\r
150             reg_ram_ce_n <= '1';\r
151             reg_ppu_ce_n <= '1';\r
152             reg_apu_ce_n <= '1';\r
153         else\r
154             if (rising_edge(pi_base_clk)) then\r
155                 if (pi_addr(15) = '1') then\r
156                     reg_rom_ce_n <= '0';\r
157                 else\r
158                     reg_rom_ce_n <= '1';\r
159                 end if;\r
160 \r
161                 if (pi_addr(15) = '0' and pi_addr(14) = '0' and pi_addr(13) = '1') then\r
162                     reg_ppu_ce_n <= '0';\r
163                 else\r
164                     reg_ppu_ce_n <= '1';\r
165                 end if;\r
166 \r
167                 if (pi_addr(15) = '0' and pi_addr(14) = '1' and pi_addr(13) = '0') then\r
168                     reg_apu_ce_n <= '0';\r
169                 else\r
170                     reg_apu_ce_n <= '1';\r
171                 end if;\r
172 \r
173                 if ((pi_addr(15) or pi_addr(14) or pi_addr(13)) = '0') then\r
174                     reg_ram_ce_n <= '0';\r
175                 else\r
176                     reg_ram_ce_n <= '1';\r
177                 end if;\r
178             end if;\r
179         end if;\r
180     end process;\r
181 \r
182 end rtl;\r
183 \r
184 \r
185 \r
186 ---------------------------------------------\r
187 ---------------------------------------------\r
188 ------------ vram chip selector -------------\r
189 ---------------------------------------------\r
190 ---------------------------------------------\r
191 library ieee;\r
192 use ieee.std_logic_1164.all;\r
193 use ieee.std_logic_unsigned.all;\r
194 \r
195 entity v_chip_selector is \r
196     port (\r
197                 pi_rst_n        : in std_logic;\r
198                 pi_base_clk     : in std_logic;\r
199                 pi_v_ce_n       : in std_logic;\r
200                 pi_v_addr       : in std_logic_vector (13 downto 0);\r
201                 pi_nt_v_mirror  : in std_logic;\r
202                 po_pt_ce_n      : out std_logic;\r
203                 po_nt0_ce_n     : out std_logic;\r
204                 po_nt1_ce_n     : out std_logic\r
205         );\r
206 end v_chip_selector;\r
207 \r
208 architecture rtl of v_chip_selector is\r
209 \r
210 signal reg_pt_ce_n       : std_logic;\r
211 signal reg_nt0_ce_n      : std_logic;\r
212 signal reg_nt1_ce_n      : std_logic;\r
213 \r
214 begin\r
215     po_pt_ce_n <= reg_pt_ce_n;\r
216     po_nt0_ce_n <= reg_nt0_ce_n;\r
217     po_nt1_ce_n <= reg_nt1_ce_n;\r
218 \r
219     v_chip_sel_p : process (pi_rst_n, pi_base_clk)\r
220     begin\r
221         if (pi_rst_n = '0') then\r
222             reg_pt_ce_n <= '1';\r
223             reg_nt0_ce_n <= '1';\r
224             reg_nt1_ce_n <= '1';\r
225         else\r
226             if (rising_edge(pi_base_clk)) then\r
227                 if (pi_v_ce_n = '0') then\r
228                     if ((pi_v_addr(13) = '0')) then\r
229                         reg_pt_ce_n <= '0';\r
230                     else\r
231                         reg_pt_ce_n <= '1';\r
232                     end if;\r
233 \r
234                     if (pi_v_addr(13) = '0') then\r
235                         reg_nt0_ce_n <= '1';\r
236                     elsif (pi_v_addr(13 downto 8) = "111111") then\r
237                         reg_nt0_ce_n <= '1';\r
238                     elsif (((pi_v_addr(11) or pi_v_addr(10)) = '0') \r
239                             or (pi_nt_v_mirror = '1' and pi_v_addr(11) = '1' and pi_v_addr(10) = '0')\r
240                             or (pi_nt_v_mirror = '0' and pi_v_addr(11) = '0' and pi_v_addr(10) = '1')) then\r
241                         reg_nt0_ce_n <= '0';\r
242                     else\r
243                         reg_nt0_ce_n <= '1';\r
244                     end if;\r
245 \r
246                     if (pi_v_addr(13) = '0') then\r
247                         reg_nt1_ce_n <= '1';\r
248                     elsif (pi_v_addr(13 downto 8) = "111111") then\r
249                         reg_nt1_ce_n <= '1';\r
250                     elsif (((pi_v_addr(11) and pi_v_addr(10)) = '1') \r
251                         or (pi_nt_v_mirror = '1' and pi_v_addr(11) = '0' and pi_v_addr(10) = '1')\r
252                         or (pi_nt_v_mirror = '0' and pi_v_addr(11) = '1' and pi_v_addr(10) = '0')) then\r
253                         reg_nt1_ce_n <= '0';\r
254                     else\r
255                         reg_nt1_ce_n <= '1';\r
256                     end if;\r
257                 else\r
258                     reg_pt_ce_n <= '1';\r
259                     reg_nt0_ce_n <= '1';\r
260                     reg_nt1_ce_n <= '1';\r
261                 end if;\r
262             end if;\r
263         end if;\r
264     end process;\r
265 \r
266 end rtl;\r