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 dl_al_we_n : out std_logic;
67 dl_ah_we_n : out std_logic;
68 dl_dl_oe_n : out std_logic;
69 dl_dh_oe_n : out std_logic;
70 dl_al_oe_n : out std_logic;
71 dl_ah_oe_n : out std_logic;
72 sp_we_n : out std_logic;
73 sp_push_n : out std_logic;
74 sp_pop_n : out std_logic;
75 sp_int_d_oe_n : out std_logic;
76 sp_int_a_oe_n : out std_logic;
77 acc_d_we_n : out std_logic;
78 acc_alu_we_n : out std_logic;
79 acc_d_oe_n : out std_logic;
80 acc_alu_oe_n : out std_logic;
81 x_we_n : out std_logic;
82 x_oe_n : out std_logic;
83 x_calc_n : out std_logic;
84 y_we_n : out std_logic;
85 y_oe_n : out std_logic;
86 y_calc_n : out std_logic;
87 ea_ah_oe_n : out std_logic;
88 ea_al_oe_n : out std_logic;
89 ea_carry : in std_logic;
90 stat_dec_we_n : out std_logic;
91 stat_dec_oe_n : out std_logic;
92 stat_bus_we_n : out std_logic;
93 stat_bus_oe_n : out std_logic;
95 dbg_show_pc : out std_logic
107 d : in std_logic_vector (dsize - 1 downto 0);
108 q : out std_logic_vector (dsize - 1 downto 0)
119 int_oe_n : in std_logic;
120 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
121 ext_dbus : inout std_logic_vector (dsize - 1 downto 0)
130 int_al_we_n : in std_logic;
131 int_ah_we_n : in std_logic;
132 int_dl_oe_n : in std_logic;
133 int_dh_oe_n : in std_logic;
134 int_al_oe_n : in std_logic;
135 int_ah_oe_n : in std_logic;
136 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
137 int_abus_l : out std_logic_vector (dsize - 1 downto 0);
138 int_abus_h : out std_logic_vector (dsize - 1 downto 0)
149 push_n : in std_logic;
150 pop_n : in std_logic;
151 int_d_oe_n : in std_logic;
152 int_a_oe_n : in std_logic;
153 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
154 int_abus_l : out std_logic_vector (dsize - 1 downto 0);
155 int_abus_h : out std_logic_vector (dsize - 1 downto 0)
165 d : in std_logic_vector (dsize - 1 downto 0);
166 q : out std_logic_vector (dsize - 1 downto 0)
170 component processor_status
176 res_n : in std_logic;
177 dec_we_n : in std_logic;
178 bus_we_n : in std_logic;
179 dec_oe_n : in std_logic;
180 bus_oe_n : in std_logic;
181 alu_c : in std_logic;
182 alu_v : in std_logic;
183 decoder : inout std_logic_vector (dsize - 1 downto 0);
184 int_dbus : inout std_logic_vector (dsize - 1 downto 0)
188 component accumulator
194 d_we_n : in std_logic;
195 alu_we_n : in std_logic;
196 d_oe_n : in std_logic;
197 alu_oe_n : in std_logic;
198 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
199 alu_bus : inout std_logic_vector (dsize - 1 downto 0)
203 component effective_adder
204 generic ( dsize : integer := 8
208 ah_oe_n : in std_logic;
209 al_oe_n : in std_logic;
210 base : in std_logic_vector (dsize - 1 downto 0);
211 index : in std_logic_vector (dsize - 1 downto 0);
212 ah_bus : out std_logic_vector (dsize - 1 downto 0);
213 al_bus : out std_logic_vector (dsize - 1 downto 0);
214 carry : out std_logic
218 signal set_clk : std_logic;
219 signal trigger_clk : std_logic;
221 signal pcl_d_we_n : std_logic;
222 signal pcl_a_we_n : std_logic;
223 signal pcl_d_oe_n : std_logic;
224 signal pcl_a_oe_n : std_logic;
225 signal pch_d_we_n : std_logic;
226 signal pch_a_we_n : std_logic;
227 signal pch_d_oe_n : std_logic;
228 signal pch_a_oe_n : std_logic;
229 signal pc_inc_n : std_logic;
230 signal pc_cry : std_logic;
231 signal pc_cry_n : std_logic;
232 signal dum_terminate : std_logic := 'Z';
234 signal inst_we_n : std_logic;
235 signal dbuf_r_nw : std_logic;
236 signal dbuf_int_oe_n : std_logic;
237 signal dl_al_we_n : std_logic;
238 signal dl_ah_we_n : std_logic;
239 signal dl_dl_oe_n : std_logic;
240 signal dl_dh_oe_n : std_logic;
241 signal dl_al_oe_n : std_logic;
242 signal dl_ah_oe_n : std_logic;
244 signal sp_we_n : std_logic;
245 signal sp_push_n : std_logic;
246 signal sp_pop_n : std_logic;
247 signal sp_int_d_oe_n : std_logic;
248 signal sp_int_a_oe_n : std_logic;
250 signal acc_d_we_n : std_logic;
251 signal acc_alu_we_n : std_logic;
252 signal acc_d_oe_n : std_logic;
253 signal acc_alu_oe_n : std_logic;
254 signal alu_bus : std_logic_vector(dsize - 1 downto 0);
256 signal x_we_n : std_logic;
257 signal x_oe_n : std_logic;
258 signal x_out : std_logic_vector(dsize - 1 downto 0);
260 signal y_we_n : std_logic;
261 signal y_oe_n : std_logic;
262 signal y_out : std_logic_vector(dsize - 1 downto 0);
264 signal ea_ah_oe_n : std_logic;
265 signal ea_al_oe_n : std_logic;
266 signal ea_carry : std_logic;
267 signal x_calc_n : std_logic;
268 signal y_calc_n : std_logic;
270 signal addr_index : std_logic_vector(dsize - 1 downto 0);
272 signal stat_dec_we_n : std_logic;
273 signal stat_dec_oe_n : std_logic;
274 signal stat_bus_we_n : std_logic;
275 signal stat_bus_oe_n : std_logic;
276 signal stat_alu_c : std_logic;
277 signal stat_alu_v : std_logic;
279 --internal bus (address hi/lo, data)
280 signal ad_oe_n : std_logic;
281 signal internal_abus_h : std_logic_vector (dsize - 1 downto 0);
282 signal internal_abus_l : std_logic_vector (dsize - 1 downto 0);
283 signal internal_dbus : std_logic_vector (dsize - 1 downto 0);
285 signal instruction : std_logic_vector (dsize - 1 downto 0);
286 signal status_reg : std_logic_vector (dsize - 1 downto 0);
288 signal dbg_show_pc : std_logic;
292 pc_l : pc generic map (dsize, 16#00#)
293 port map(trigger_clk, rst_n,
294 pcl_d_we_n, pcl_a_we_n, pcl_d_oe_n, pcl_a_oe_n,
295 pc_inc_n, '0', pc_cry, internal_dbus, internal_abus_l);
296 pc_h : pc generic map (dsize, 16#80#)
297 port map(trigger_clk, rst_n,
298 pch_d_we_n, pch_a_we_n, pch_d_oe_n, pch_a_oe_n,
299 pc_cry_n, pc_cry, dum_terminate, internal_dbus, internal_abus_h);
301 dec_inst : decoder generic map (dsize)
354 instruction_register : dff generic map (dsize)
355 port map(trigger_clk, inst_we_n, '0', d_io, instruction);
357 data_bus_buffer : dbus_buf generic map (dsize)
358 port map(set_clk, dbuf_r_nw, dbuf_int_oe_n, internal_dbus, d_io);
360 input_data_latch : input_dl generic map (dsize)
361 port map(dl_al_we_n, dl_ah_we_n, dl_dl_oe_n, dl_dh_oe_n,
362 dl_al_oe_n, dl_ah_oe_n,
363 internal_dbus, internal_abus_l, internal_abus_h);
365 stack_pointer : sp generic map (dsize)
366 port map(trigger_clk, sp_we_n, sp_push_n, sp_pop_n,
367 sp_int_d_oe_n, sp_int_a_oe_n,
368 internal_dbus, internal_abus_l, internal_abus_h);
370 status_reg_component : processor_status generic map (dsize)
371 port map (trigger_clk, rst_n, stat_dec_we_n, stat_bus_we_n,
372 stat_dec_oe_n, stat_bus_oe_n,
373 stat_alu_c, stat_alu_v,
374 status_reg, internal_dbus);
376 --x/y output pin is connected to address calcurator
377 x_reg : dff generic map (dsize)
378 port map(trigger_clk, x_we_n, '0', internal_dbus, x_out);
379 x_buf : tsb generic map (dsize)
380 port map (x_oe_n, x_out, internal_dbus);
381 x_buf_addr : tsb generic map (dsize)
382 port map (x_calc_n, x_out, addr_index);
384 y_reg : dff generic map (dsize)
385 port map(trigger_clk, y_we_n, '0', internal_dbus, y_out);
386 y_buf : tsb generic map (dsize)
387 port map (y_oe_n, y_out, internal_dbus);
388 y_buf_addr : tsb generic map (dsize)
389 port map (y_calc_n, y_out, addr_index);
391 ---effective addres calcurator.
392 addr_calc: effective_adder generic map (dsize)
393 port map (trigger_clk, ea_ah_oe_n, ea_al_oe_n,
394 internal_dbus, addr_index,
395 internal_abus_h, internal_abus_l, ea_carry);
397 acc_reg : accumulator generic map (dsize)
398 port map(trigger_clk,
399 acc_d_we_n, acc_alu_we_n, acc_d_oe_n, acc_alu_oe_n,
400 internal_dbus, alu_bus);
404 phi2 <= not input_clk;
405 set_clk <= input_clk;
406 trigger_clk <= not input_clk;
407 pc_cry_n <= not pc_cry;
410 --adh output is controlled by decoder.
411 adh_buffer : tsb generic map (dsize)
412 port map (ad_oe_n, internal_abus_h, addr(asize - 1 downto dsize));
413 adl_buffer : tsb generic map (dsize)
414 port map (ad_oe_n, internal_abus_l, addr(dsize - 1 downto 0));
416 reset_p : process (rst_n)
418 if (rst_n'event and rst_n = '0') then
423 dbg_p : process (dbg_show_pc)
425 use ieee.std_logic_textio.all;
426 use ieee.std_logic_unsigned.conv_integer;
428 procedure d_print(msg : string) is
429 variable out_l : line;
432 writeline(output, out_l);
435 function conv_hex8(ival : integer) return string is
436 variable tmp1, tmp2 : integer;
437 variable hex_chr: string (1 to 16) := "0123456789abcdef";
439 tmp2 := (ival mod 16 ** 2) / 16 ** 1;
440 tmp1 := ival mod 16 ** 1;
441 return hex_chr(tmp2 + 1) & hex_chr(tmp1 + 1);
444 if (dbg_show_pc = '1') then
445 d_print("pc : " & conv_hex8(conv_integer(internal_abus_h))
446 & conv_hex8(conv_integer(internal_abus_l)));