2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_unsigned.all;
5 entity chip_selector is
7 pi_rst_n : in std_logic;
\r
8 pi_base_clk : in std_logic;
\r
9 po_cpu_en : out std_logic_vector (7 downto 0);
\r
10 po_ppu_en : out std_logic_vector (3 downto 0)
\r
14 architecture rtl of chip_selector is
\r
16 signal reg_cpu_en : std_logic_vector (7 downto 0);
\r
17 signal reg_ppu_en : std_logic_vector (3 downto 0);
\r
20 --Actual NES base clock = 21.477272 MHz
21 --CPU clock = base clock / 12
22 --PPU clock = base clock / 4
23 --Actual NES CPU clock = 1.78 MHz (559 ns / cycle)
26 ---DE1 base clock 50 MHz
27 ---motones sim project uses following clock.
28 --cpu clock = base clock / 16
29 --ppu clock = base clock / 8
30 --vga clock = base clock / 2
\r
31 --emu ppu clock = base clock / 4
33 po_cpu_en <= reg_cpu_en;
\r
34 po_ppu_en <= reg_ppu_en;
\r
36 cpu_clk_p : process (pi_rst_n, pi_base_clk)
\r
37 variable ref_cnt : integer range 0 to 15;
\r
39 if (pi_rst_n = '0') then
\r
40 reg_cpu_en <= (others => '0');
\r
43 if (rising_edge(pi_base_clk)) then
\r
44 if (ref_cnt = 0) then
\r
45 reg_cpu_en <= "00000001";
\r
46 elsif (ref_cnt = 3) then
\r
47 reg_cpu_en <= "00000010";
\r
48 elsif (ref_cnt = 7) then
\r
49 reg_cpu_en <= "00000100";
\r
50 elsif (ref_cnt = 11) then
\r
51 reg_cpu_en <= "00001000";
\r
52 elsif (ref_cnt = 15) then
\r
53 reg_cpu_en <= "00010000";
\r
54 elsif (ref_cnt = 19) then
\r
55 reg_cpu_en <= "00100000";
\r
56 elsif (ref_cnt = 23) then
\r
57 reg_cpu_en <= "01000000";
\r
58 elsif (ref_cnt = 27) then
\r
59 reg_cpu_en <= "10000000";
\r
61 ref_cnt := ref_cnt + 1;
\r
66 ppu_clk_p : process (pi_rst_n, pi_base_clk)
\r
67 variable ref_cnt : integer range 0 to 31;
\r
69 if (pi_rst_n = '0') then
\r
70 reg_ppu_en <= (others => '0');
\r
73 if (rising_edge(pi_base_clk)) then
\r
74 if (ref_cnt = 0) then
\r
75 reg_ppu_en <= "0001";
\r
76 elsif (ref_cnt = 3) then
\r
77 reg_ppu_en <= "0010";
\r
78 elsif (ref_cnt = 7) then
\r
79 reg_ppu_en <= "0100";
\r
80 elsif (ref_cnt = 11) then
\r
81 reg_ppu_en <= "1000";
\r
83 ref_cnt := ref_cnt + 1;
\r