OSDN Git Service

pc update timing fixed.
[motonesfpga/motonesfpga.git] / simulation / cpu / mos6502.vhd
1 library ieee;
2 use ieee.std_logic_1164.all;
3
4 entity mos6502 is 
5     generic (   dsize : integer := 8;
6                 asize : integer :=16
7             );
8     port (  input_clk   : in std_logic; --phi0 input pin.
9             rdy         : in std_logic;
10             rst_n       : in std_logic;
11             irq_n       : in std_logic;
12             nmi_n       : in std_logic;
13             dbe         : in std_logic;
14             r_nw        : out std_logic;
15             phi1        : out std_logic;
16             phi2        : out std_logic;
17             addr        : out std_logic_vector ( asize - 1 downto 0);
18             d_io        : inout std_logic_vector ( dsize - 1 downto 0)
19     );
20 end mos6502;
21
22 architecture rtl of mos6502 is
23
24     component pc
25         generic (
26                 dsize : integer := 8;
27                 reset_addr : integer := 0
28                 );
29         port (  
30                 trig_clk        : in std_logic;
31                 res_n           : in std_logic;
32                 dbus_in_n       : in std_logic;
33                 dbus_out_n      : in std_logic;
34                 abus_out_n      : in std_logic;
35                 addr_inc_n      : in std_logic;
36                 addr_page_nxt_n : out std_logic;
37                 int_d_bus       : inout std_logic_vector (dsize - 1 downto 0);
38                 int_a_bus       : out std_logic_vector (dsize - 1 downto 0)
39             );
40     end component;
41
42     component decoder
43         generic (dsize : integer := 8);
44         port (  set_clk         : in std_logic;
45                 trig_clk        : in std_logic;
46                 res_n           : in std_logic;
47                 irq_n           : in std_logic;
48                 nmi_n           : in std_logic;
49                 rdy             : in std_logic;
50                 instruction     : in std_logic_vector (dsize - 1 downto 0);
51                 status_reg      : in std_logic_vector (dsize - 1 downto 0);
52                 pcl_d_i_n       : out std_logic;
53                 pcl_d_o_n       : out std_logic;
54                 pcl_a_o_n       : out std_logic;
55                 pch_d_i_n       : out std_logic;
56                 pch_d_o_n       : out std_logic;
57                 pch_a_o_n       : out std_logic;
58                 pc_inc_n        : out std_logic;
59                 r_nw            : out std_logic
60             );
61     end component;
62
63     component instruction_reg
64         generic (
65                 dsize : integer := 8
66                 );
67         port (  
68                 trig_clk         : in std_logic;
69                 cpu_d_bus       : in std_logic_vector (dsize - 1 downto 0);
70                 to_decoder      : out std_logic_vector (dsize - 1 downto 0)
71             );
72     end component;
73
74     signal set_clk : std_logic;
75     signal trigger_clk : std_logic;
76
77     signal pcl_d_in_n : std_logic;
78     signal pcl_d_out_n : std_logic;
79     signal pcl_a_out_n : std_logic;
80     signal pch_d_in_n : std_logic;
81     signal pch_d_out_n : std_logic;
82     signal pch_a_out_n : std_logic;
83     signal pc_inc_n : std_logic;
84     signal pc_page_nxt_n : std_logic;
85     signal dum_terminate : std_logic := 'Z';
86
87     --internal bus (address hi/lo, data)
88     signal internal_abus_h : std_logic_vector (dsize - 1 downto 0);
89     signal internal_abus_l : std_logic_vector (dsize - 1 downto 0);
90     signal internal_dbus : std_logic_vector (dsize - 1 downto 0);
91
92     signal instruction : std_logic_vector (dsize - 1 downto 0);
93     signal status_reg : std_logic_vector (dsize - 1 downto 0);
94 begin
95
96     ---instances....
97     pc_l : pc generic map (dsize, 16#00#) 
98             port map(trigger_clk, rst_n, pcl_d_in_n, pcl_d_out_n, pcl_a_out_n, 
99                     pc_inc_n, pc_page_nxt_n, internal_dbus, internal_abus_l);
100     pc_h : pc generic map (dsize, 16#80#) 
101             port map(trigger_clk, rst_n, pch_d_in_n, pch_d_out_n, pch_a_out_n, 
102                     pc_page_nxt_n, dum_terminate, internal_dbus, internal_abus_h);
103
104     dec_inst : decoder generic map (dsize) 
105             port map(set_clk, trigger_clk, rst_n, irq_n, nmi_n, 
106                     rdy, instruction, status_reg,
107                     pcl_d_in_n, pcl_d_out_n, pcl_a_out_n,
108                     pch_d_in_n, pch_d_out_n, pch_a_out_n,
109                     pc_inc_n, r_nw
110                     );
111
112     instruction_register : instruction_reg generic map (dsize) 
113             port map(trigger_clk, d_io, instruction);
114
115     -- clock generate.
116     phi1 <= input_clk;
117     phi2 <= not input_clk;
118     set_clk <= input_clk;
119     trigger_clk <= not input_clk;
120
121     addr(asize - 1 downto dsize) <= internal_abus_h;
122     addr(dsize - 1 downto 0) <= internal_abus_l;
123
124     reset_p : process (rst_n)
125     begin
126         if (rst_n'event and rst_n = '0') then
127
128         end if;
129     end process;
130
131 end rtl;
132