OSDN Git Service

rtl sim started...
[motonesfpga/motonesfpga.git] / de0_cv_nes / chip_selector.vhd
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_unsigned.all;
4
5 entity chip_selector is 
6     port (  \r
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
11         );
12 end chip_selector;
13
14 architecture rtl of chip_selector is\r
15 \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
18 \r
19 begin
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)
24     --VGA clock = 25 MHz.
25
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
32 \r
33     po_cpu_en <= reg_cpu_en;\r
34     po_ppu_en <= reg_ppu_en;\r
35     \r
36     cpu_clk_p : process (pi_rst_n, pi_base_clk)\r
37     variable ref_cnt : integer range 0 to 15;\r
38     begin\r
39         if (pi_rst_n = '0') then\r
40             reg_cpu_en <= (others => '0');\r
41             ref_cnt := 0;\r
42         else\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
60                 end if;\r
61                 ref_cnt := ref_cnt + 1;\r
62             end if;\r
63         end if;\r
64     end process;\r
65 \r
66     ppu_clk_p : process (pi_rst_n, pi_base_clk)\r
67     variable ref_cnt : integer range 0 to 31;\r
68     begin\r
69         if (pi_rst_n = '0') then\r
70             reg_ppu_en <= (others => '0');\r
71             ref_cnt := 0;\r
72         else\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
82                 end if;\r
83                 ref_cnt := ref_cnt + 1;\r
84             end if;\r
85         end if;\r
86     end process;\r
87 \r
88 end rtl;
89