2 use ieee.std_logic_1164.all;
5 generic ( dsize : integer := 8;
8 port ( input_clk : in std_logic; --phi0 input pin.
17 addr : out std_logic_vector ( asize - 1 downto 0);
18 d_io : inout std_logic_vector ( dsize - 1 downto 0)
22 architecture rtl of mos6502 is
27 reset_addr : integer := 0
30 trig_clk : in std_logic;
32 dbus_we_n : in std_logic;
33 abus_we_n : in std_logic;
34 dbus_oe_n : in std_logic;
35 abus_oe_n : in std_logic;
36 addr_inc_n : in std_logic;
37 add_carry : in std_logic;
38 inc_carry : out std_logic;
39 int_d_bus : inout std_logic_vector (dsize - 1 downto 0);
40 int_a_bus : inout std_logic_vector (dsize - 1 downto 0)
45 generic (dsize : integer := 8);
46 port ( set_clk : in std_logic;
47 trig_clk : in std_logic;
52 instruction : in std_logic_vector (dsize - 1 downto 0);
53 status_reg : inout std_logic_vector (dsize - 1 downto 0);
54 ad_oe_n : out std_logic;
55 pcl_d_we_n : out std_logic;
56 pcl_a_we_n : out std_logic;
57 pcl_d_oe_n : out std_logic;
58 pcl_a_oe_n : out std_logic;
59 pch_d_we_n : out std_logic;
60 pch_a_we_n : out std_logic;
61 pch_d_oe_n : out std_logic;
62 pch_a_oe_n : out std_logic;
63 pc_inc_n : out std_logic;
64 inst_we_n : out std_logic;
65 dbuf_int_oe_n : out std_logic;
66 dbuf_ext_oe_n : out std_logic;
67 dbuf_int_we_n : out std_logic;
68 dbuf_ext_we_n : out std_logic;
69 dl_we_n : out std_logic;
70 dl_int_d_oe_n : out std_logic;
71 dl_int_al_oe_n : out std_logic;
72 dl_int_ah_oe_n : out std_logic;
73 sp_we_n : out std_logic;
74 sp_push_n : out std_logic;
75 sp_pop_n : out std_logic;
76 sp_int_d_oe_n : out std_logic;
77 sp_int_a_oe_n : out std_logic;
78 x_we_n : out std_logic;
79 x_oe_n : out std_logic;
80 y_we_n : out std_logic;
81 y_oe_n : out std_logic;
82 stat_dec_we_n : out std_logic;
83 stat_dec_oe_n : out std_logic;
84 stat_bus_we_n : out std_logic;
85 stat_bus_oe_n : out std_logic;
98 d : in std_logic_vector (dsize - 1 downto 0);
99 q : out std_logic_vector (dsize - 1 downto 0)
110 int_we_n : in std_logic;
111 ext_we_n : in std_logic;
112 int_oe_n : in std_logic;
113 ext_oe_n : in std_logic;
114 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
115 ext_dbus : inout std_logic_vector (dsize - 1 downto 0)
125 int_d_oe_n : in std_logic;
126 int_al_oe_n : in std_logic;
127 int_ah_oe_n : in std_logic;
128 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
129 int_abus_l : out std_logic_vector (dsize - 1 downto 0);
130 int_abus_h : out std_logic_vector (dsize - 1 downto 0)
141 push_n : in std_logic;
142 pop_n : in std_logic;
143 int_d_oe_n : in std_logic;
144 int_a_oe_n : in std_logic;
145 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
146 int_abus_l : out std_logic_vector (dsize - 1 downto 0);
147 int_abus_h : out std_logic_vector (dsize - 1 downto 0)
157 d : in std_logic_vector (dsize - 1 downto 0);
158 q : out std_logic_vector (dsize - 1 downto 0)
162 component processor_status
168 res_n : in std_logic;
169 dec_we_n : in std_logic;
170 bus_we_n : in std_logic;
171 dec_oe_n : in std_logic;
172 bus_oe_n : in std_logic;
173 alu_c : in std_logic;
174 alu_v : in std_logic;
175 decoder : inout std_logic_vector (dsize - 1 downto 0);
176 int_dbus : inout std_logic_vector (dsize - 1 downto 0)
180 signal set_clk : std_logic;
181 signal trigger_clk : std_logic;
183 signal pcl_d_we_n : std_logic;
184 signal pcl_a_we_n : std_logic;
185 signal pcl_d_oe_n : std_logic;
186 signal pcl_a_oe_n : std_logic;
187 signal pch_d_we_n : std_logic;
188 signal pch_a_we_n : std_logic;
189 signal pch_d_oe_n : std_logic;
190 signal pch_a_oe_n : std_logic;
191 signal pc_inc_n : std_logic;
192 signal pc_cry : std_logic;
193 signal pc_cry_n : std_logic;
194 signal dum_terminate : std_logic := 'Z';
196 signal inst_we_n : std_logic;
197 signal dbuf_r_nw : std_logic;
198 signal dbuf_int_oe_n : std_logic;
199 signal dbuf_ext_oe_n : std_logic;
200 signal dbuf_int_we_n : std_logic;
201 signal dbuf_ext_we_n : std_logic;
202 signal dl_we_n : std_logic;
203 signal dl_int_d_oe_n : std_logic;
204 signal dl_int_al_oe_n : std_logic;
205 signal dl_int_ah_oe_n : std_logic;
207 signal sp_we_n : std_logic;
208 signal sp_push_n : std_logic;
209 signal sp_pop_n : std_logic;
210 signal sp_int_d_oe_n : std_logic;
211 signal sp_int_a_oe_n : std_logic;
213 signal x_we_n : std_logic;
214 signal x_oe_n : std_logic;
215 signal y_we_n : std_logic;
216 signal y_oe_n : std_logic;
218 signal stat_dec_we_n : std_logic;
219 signal stat_dec_oe_n : std_logic;
220 signal stat_bus_we_n : std_logic;
221 signal stat_bus_oe_n : std_logic;
222 signal stat_alu_c : std_logic;
223 signal stat_alu_v : std_logic;
225 --internal bus (address hi/lo, data)
226 signal ad_oe_n : std_logic;
227 signal internal_abus_h : std_logic_vector (dsize - 1 downto 0);
228 signal internal_abus_l : std_logic_vector (dsize - 1 downto 0);
229 signal internal_dbus : std_logic_vector (dsize - 1 downto 0);
231 signal instruction : std_logic_vector (dsize - 1 downto 0);
232 signal status_reg : std_logic_vector (dsize - 1 downto 0);
237 pc_l : pc generic map (dsize, 16#00#)
238 port map(trigger_clk, rst_n,
239 pcl_d_we_n, pcl_a_we_n, pcl_d_oe_n, pcl_a_oe_n,
240 pc_inc_n, '0', pc_cry, internal_dbus, internal_abus_l);
241 pc_h : pc generic map (dsize, 16#80#)
242 port map(trigger_clk, rst_n,
243 pch_d_we_n, pch_a_we_n, pch_d_oe_n, pch_a_oe_n,
244 pc_cry_n, pc_cry, dum_terminate, internal_dbus, internal_abus_h);
246 dec_inst : decoder generic map (dsize)
247 port map(set_clk, trigger_clk, rst_n, irq_n, nmi_n,
248 rdy, instruction, status_reg, ad_oe_n,
249 pcl_d_we_n, pcl_a_we_n, pcl_d_oe_n, pcl_a_oe_n,
250 pch_d_we_n, pch_a_we_n, pch_d_oe_n, pch_a_oe_n,
253 dbuf_int_oe_n, dbuf_ext_oe_n, dbuf_int_we_n, dbuf_ext_we_n,
254 dl_we_n, dl_int_d_oe_n, dl_int_al_oe_n, dl_int_ah_oe_n,
255 sp_we_n, sp_push_n, sp_pop_n, sp_int_d_oe_n, sp_int_a_oe_n,
256 x_we_n, x_oe_n, y_we_n, y_oe_n,
257 stat_dec_we_n, stat_dec_oe_n, stat_bus_we_n, stat_bus_oe_n,
260 instruction_register : dff generic map (dsize)
261 port map(trigger_clk, inst_we_n, '0', d_io, instruction);
263 data_bus_buffer : dbus_buf generic map (dsize)
264 port map(set_clk, dbuf_r_nw, dbuf_int_we_n, dbuf_ext_we_n,
265 dbuf_int_oe_n, dbuf_ext_oe_n, internal_dbus, d_io);
267 input_data_latch : input_dl generic map (dsize)
268 port map(dl_we_n, dl_int_d_oe_n, dl_int_al_oe_n, dl_int_ah_oe_n,
269 internal_dbus, internal_abus_l, internal_abus_h);
271 stack_pointer : sp generic map (dsize)
272 port map(trigger_clk, sp_we_n, sp_push_n, sp_pop_n,
273 sp_int_d_oe_n, sp_int_a_oe_n,
274 internal_dbus, internal_abus_l, internal_abus_h);
276 status_reg_component : processor_status generic map (dsize)
277 port map (trigger_clk, rst_n, stat_dec_we_n, stat_bus_we_n,
278 stat_dec_oe_n, stat_bus_oe_n,
279 stat_alu_c, stat_alu_v,
280 status_reg, internal_dbus);
282 x_reg : dff generic map (dsize)
283 port map(trigger_clk, x_we_n, x_oe_n, internal_dbus, internal_dbus);
285 y_reg : dff generic map (dsize)
286 port map(trigger_clk, y_we_n, y_oe_n, internal_dbus, internal_dbus);
290 phi2 <= not input_clk;
291 set_clk <= input_clk;
292 trigger_clk <= not input_clk;
293 pc_cry_n <= not pc_cry;
296 --adh output is controlled by decoder.
297 adh_buffer : tsb generic map (dsize)
298 port map (ad_oe_n, internal_abus_h, addr(asize - 1 downto dsize));
299 adl_buffer : tsb generic map (dsize)
300 port map (ad_oe_n, internal_abus_l, addr(dsize - 1 downto 0));
302 reset_p : process (rst_n)
304 if (rst_n'event and rst_n = '0') then