1 ---------------------------------------------
\r
2 ---------------------------------------------
\r
3 -------- synchronized clock selector --------
\r
4 ---------------------------------------------
\r
5 ---------------------------------------------
\r
7 use ieee.std_logic_1164.all;
8 use ieee.std_logic_unsigned.all;
10 entity clock_selector is
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
19 architecture rtl of clock_selector is
\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
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)
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
38 po_cpu_en <= reg_cpu_en;
\r
40 cpu_clk_p : process (pi_rst_n, pi_base_clk)
\r
41 variable ref_cnt : integer range 0 to 31;
\r
43 if (pi_rst_n = '0') then
\r
44 reg_cpu_en <= (others => '0');
\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
65 reg_cpu_en <= "00000000";
\r
68 if (ref_cnt = 31) then
\r
71 ref_cnt := ref_cnt + 1;
\r
77 --render clock timing enabler.
\r
78 po_rnd_en <= reg_rnd_en;
\r
80 ppu_clk_p : process (pi_rst_n, pi_base_clk)
\r
81 variable ref_cnt : integer range 0 to 3;
\r
83 if (pi_rst_n = '0') then
\r
84 reg_rnd_en <= (others => '0');
\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
97 reg_rnd_en <= "0000";
\r
100 if (ref_cnt = 3) then
\r
103 ref_cnt := ref_cnt + 1;
\r
112 ---------------------------------------------
\r
113 ---------------------------------------------
\r
114 --------------- chip selector ---------------
\r
115 ---------------------------------------------
\r
116 ---------------------------------------------
\r
118 use ieee.std_logic_1164.all;
\r
119 use ieee.std_logic_unsigned.all;
\r
121 entity chip_selector is
\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
133 architecture rtl of chip_selector is
\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
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
146 chip_sel_p : process (pi_rst_n, pi_base_clk)
\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
154 if (rising_edge(pi_base_clk)) then
\r
155 if (pi_addr(15) = '1') then
\r
156 reg_rom_ce_n <= '0';
\r
158 reg_rom_ce_n <= '1';
\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
164 reg_ppu_ce_n <= '1';
\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
170 reg_apu_ce_n <= '1';
\r
173 if ((pi_addr(15) or pi_addr(14) or pi_addr(13)) = '0') then
\r
174 reg_ram_ce_n <= '0';
\r
176 reg_ram_ce_n <= '1';
\r
186 ---------------------------------------------
\r
187 ---------------------------------------------
\r
188 ------------ vram chip selector -------------
\r
189 ---------------------------------------------
\r
190 ---------------------------------------------
\r
192 use ieee.std_logic_1164.all;
\r
193 use ieee.std_logic_unsigned.all;
\r
195 entity v_chip_selector is
\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
206 end v_chip_selector;
\r
208 architecture rtl of v_chip_selector is
\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
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
219 v_chip_sel_p : process (pi_rst_n, pi_base_clk)
\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
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
231 reg_pt_ce_n <= '1';
\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
243 reg_nt0_ce_n <= '1';
\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
255 reg_nt1_ce_n <= '1';
\r
258 reg_pt_ce_n <= '1';
\r
259 reg_nt0_ce_n <= '1';
\r
260 reg_nt1_ce_n <= '1';
\r