OSDN Git Service

status register work started.
[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                 we_n            : in std_logic;
33                 dbus_oe_n       : in std_logic;
34                 abus_oe_n       : in std_logic;
35                 addr_inc_n      : in std_logic;
36                 add_carry       : in std_logic;
37                 inc_carry       : out std_logic;
38                 int_d_bus       : inout std_logic_vector (dsize - 1 downto 0);
39                 int_a_bus       : out std_logic_vector (dsize - 1 downto 0)
40             );
41     end component;
42
43     component decoder
44         generic (dsize : integer := 8);
45         port (  set_clk         : in std_logic;
46                 trig_clk        : in std_logic;
47                 res_n           : in std_logic;
48                 irq_n           : in std_logic;
49                 nmi_n           : in std_logic;
50                 rdy             : in std_logic;
51                 instruction     : in std_logic_vector (dsize - 1 downto 0);
52                 status_reg      : inout std_logic_vector (dsize - 1 downto 0);
53                 pcl_we_n        : out std_logic;
54                 pcl_d_oe_n      : out std_logic;
55                 pcl_a_oe_n      : out std_logic;
56                 pch_we_n        : out std_logic;
57                 pch_d_oe_n      : out std_logic;
58                 pch_a_oe_n      : out std_logic;
59                 pc_inc_n        : out std_logic;
60                 inst_we_n       : out std_logic;
61                 dbuf_int_oe_n   : out std_logic;
62                 dbuf_ext_oe_n   : out std_logic;
63                 dbuf_int_we_n   : out std_logic;
64                 dbuf_ext_we_n   : out std_logic;
65                 dl_int_d_oe_n   : out std_logic;
66                 dl_int_al_oe_n  : out std_logic;
67                 dl_int_ah_oe_n  : out std_logic;
68                 sp_we_n         : out std_logic;
69                 sp_int_d_oe_n   : out std_logic;
70                 sp_int_a_oe_n   : out std_logic;
71                 x_we_n          : out std_logic;
72                 x_oe_n          : out std_logic;
73                 y_we_n          : out std_logic;
74                 y_oe_n          : out std_logic;
75                 r_nw            : out std_logic
76             );
77     end component;
78
79     component dff
80         generic (
81                 dsize : integer := 8
82                 );
83         port (  
84                 clk     : in std_logic;
85                 we_n    : in std_logic;
86                 oe_n    : in std_logic;
87                 d       : in std_logic_vector (dsize - 1 downto 0);
88                 q       : out std_logic_vector (dsize - 1 downto 0)
89             );
90     end component;
91
92     component dbus_buf
93         generic (
94                 dsize : integer := 8
95                 );
96         port (  
97                 clk     : in std_logic;
98                 int_we_n    : in std_logic;
99                 ext_we_n    : in std_logic;
100                 int_oe_n    : in std_logic;
101                 ext_oe_n    : in std_logic;
102                 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
103                 ext_dbus : inout std_logic_vector (dsize - 1 downto 0)
104             );
105     end component;
106
107     component input_dl
108         generic (
109                 dsize : integer := 8
110                 );
111         port (  
112                 we_n        : in std_logic;
113                 int_d_oe_n  : in std_logic;
114                 int_al_oe_n : in std_logic;
115                 int_ah_oe_n : in std_logic;
116                 int_dbus    : inout std_logic_vector (dsize - 1 downto 0);
117                 int_abus_l  : out std_logic_vector (dsize - 1 downto 0);
118                 int_abus_h  : out std_logic_vector (dsize - 1 downto 0)
119             );
120     end component;
121
122     component sp
123         generic (
124                 dsize : integer := 8
125                 );
126         port (  
127                 clk         : in std_logic;
128                 we_n        : in std_logic;
129                 int_d_oe_n  : in std_logic;
130                 int_a_oe_n  : in std_logic;
131                 int_dbus    : inout std_logic_vector (dsize - 1 downto 0);
132                 int_abus_l  : out std_logic_vector (dsize - 1 downto 0);
133                 int_abus_h  : out std_logic_vector (dsize - 1 downto 0)
134             );
135     end component;
136
137     component processor_status
138         generic (
139                 dsize : integer := 8
140                 );
141         port (  
142                 clk         : in std_logic;
143                 res_n       : in std_logic;
144                 dec_we_n    : in std_logic;
145                 bus_we_n    : in std_logic;
146                 dec_oe_n    : in std_logic;
147                 bus_oe_n    : in std_logic;
148                 decoder     : inout std_logic_vector (dsize - 1 downto 0);
149                 int_dbus    : inout std_logic_vector (dsize - 1 downto 0)
150             );
151     end component;
152
153     signal set_clk : std_logic;
154     signal trigger_clk : std_logic;
155
156     signal pcl_d_we_n : std_logic;
157     signal pcl_d_oe_n : std_logic;
158     signal pcl_a_oe_n : std_logic;
159     signal pch_d_we_n : std_logic;
160     signal pch_d_oe_n : std_logic;
161     signal pch_a_oe_n : std_logic;
162     signal pc_inc_n : std_logic;
163     signal pc_cry : std_logic;
164     signal pc_cry_n : std_logic;
165     signal dum_terminate : std_logic := 'Z';
166
167     signal inst_we_n : std_logic;
168     signal dbuf_int_oe_n : std_logic;
169     signal dbuf_ext_oe_n : std_logic;
170     signal dbuf_int_we_n : std_logic;
171     signal dbuf_ext_we_n : std_logic;
172     signal dl_int_d_oe_n : std_logic;
173     signal dl_int_al_oe_n : std_logic;
174     signal dl_int_ah_oe_n : std_logic;
175
176     signal sp_we_n : std_logic;
177     signal sp_int_d_oe_n : std_logic;
178     signal sp_int_a_oe_n : std_logic;
179
180     signal x_we_n : std_logic;
181     signal x_oe_n : std_logic;
182     signal y_we_n : std_logic;
183     signal y_oe_n : std_logic;
184
185     --internal bus (address hi/lo, data)
186     signal internal_abus_h : std_logic_vector (dsize - 1 downto 0);
187     signal internal_abus_l : std_logic_vector (dsize - 1 downto 0);
188     signal internal_dbus : std_logic_vector (dsize - 1 downto 0);
189
190     signal instruction : std_logic_vector (dsize - 1 downto 0);
191     signal status_reg : std_logic_vector (dsize - 1 downto 0);
192 begin
193
194     ---instances....
195     pc_l : pc generic map (dsize, 16#00#) 
196             port map(trigger_clk, rst_n, pcl_d_we_n, pcl_d_oe_n, pcl_a_oe_n, 
197                     pc_inc_n, '0', pc_cry, internal_dbus, internal_abus_l);
198     pc_h : pc generic map (dsize, 16#80#) 
199             port map(trigger_clk, rst_n, pch_d_we_n, pch_d_oe_n, pch_a_oe_n, 
200                     pc_cry_n, pc_cry, dum_terminate, internal_dbus, internal_abus_h);
201
202     dec_inst : decoder generic map (dsize) 
203             port map(set_clk, trigger_clk, rst_n, irq_n, nmi_n, 
204                     rdy, instruction, status_reg,
205                     pcl_d_we_n, pcl_d_oe_n, pcl_a_oe_n,
206                     pch_d_we_n, pch_d_oe_n, pch_a_oe_n,
207                     pc_inc_n, 
208                     inst_we_n, 
209                     dbuf_int_oe_n, dbuf_ext_oe_n, dbuf_int_we_n, dbuf_ext_we_n, 
210                     dl_int_d_oe_n, dl_int_al_oe_n, dl_int_ah_oe_n,
211                     sp_we_n, sp_int_d_oe_n, sp_int_a_oe_n,
212                     x_we_n, x_oe_n, y_we_n, y_oe_n, 
213                     r_nw);
214
215     instruction_register : dff generic map (dsize) 
216             port map(trigger_clk, inst_we_n, '0', d_io, instruction);
217
218     data_bus_buffer : dbus_buf generic map (dsize) 
219             port map(set_clk, dbuf_int_we_n, dbuf_ext_we_n, 
220                     dbuf_int_oe_n, dbuf_ext_oe_n, internal_dbus, d_io);
221
222     input_data_latch : input_dl generic map (dsize) 
223             port map('0', dl_int_d_oe_n, dl_int_al_oe_n, dl_int_ah_oe_n, 
224                     internal_dbus, internal_abus_l, internal_abus_h);
225
226     stack_pointer : sp generic map (dsize) 
227             port map(trigger_clk, sp_we_n, sp_int_d_oe_n, sp_int_a_oe_n, 
228                     internal_dbus, internal_abus_l, internal_abus_h);
229
230     status_reg_component : processor_status generic map (dsize) 
231             port map(trigger_clk, rst_n, '1', '1', '0', '1', 
232                     status_reg, internal_dbus);
233
234     x_reg : dff generic map (dsize) 
235             port map(trigger_clk, x_we_n, x_oe_n, internal_dbus, internal_dbus);
236
237     y_reg : dff generic map (dsize) 
238             port map(trigger_clk, y_we_n, y_oe_n, internal_dbus, internal_dbus);
239
240     -- clock generate.
241     phi1 <= input_clk;
242     phi2 <= not input_clk;
243     set_clk <= input_clk;
244     trigger_clk <= not input_clk;
245     pc_cry_n <= not pc_cry;
246
247     addr(asize - 1 downto dsize) <= internal_abus_h;
248     addr(dsize - 1 downto 0) <= internal_abus_l;
249
250     reset_p : process (rst_n)
251     begin
252         if (rst_n'event and rst_n = '0') then
253
254         end if;
255     end process;
256
257 end rtl;
258