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
24 ----------------------------------------------
25 ------------ decoder declaration -------------
26 ----------------------------------------------
28 generic (dsize : integer := 8);
29 port ( set_clk : in std_logic;
30 trig_clk : in std_logic;
35 instruction : in std_logic_vector (dsize - 1 downto 0);
36 exec_cycle : in std_logic_vector (5 downto 0);
37 next_cycle : out std_logic_vector (5 downto 0);
38 status_reg : inout std_logic_vector (dsize - 1 downto 0);
39 inst_we_n : out std_logic;
40 ad_oe_n : out std_logic;
41 dbuf_int_oe_n : out std_logic;
42 pc_inc_n : out std_logic;
43 pcl_cmd : out std_logic_vector(3 downto 0);
44 pch_cmd : out std_logic_vector(3 downto 0);
45 sp_cmd : out std_logic_vector(3 downto 0);
46 acc_cmd : out std_logic_vector(3 downto 0);
47 x_cmd : out std_logic_vector(3 downto 0);
48 y_cmd : out std_logic_vector(3 downto 0);
50 ;---for parameter check purpose!!!
51 check_bit : out std_logic_vector(1 to 5)
56 generic ( dsize : integer := 8
58 port ( clk : in std_logic;
59 pc_inc_n : in std_logic;
60 abs_ea_n : in std_logic;
61 zp_ea_n : in std_logic;
62 arith_en_n : in std_logic;
63 instruction : in std_logic_vector (dsize - 1 downto 0);
64 int_d_bus : inout std_logic_vector (dsize - 1 downto 0);
65 acc_out : in std_logic_vector (dsize - 1 downto 0);
66 acc_in : out std_logic_vector (dsize - 1 downto 0);
67 index_bus : in std_logic_vector (dsize - 1 downto 0);
68 bal : in std_logic_vector (dsize - 1 downto 0);
69 bah : in std_logic_vector (dsize - 1 downto 0);
70 abl : out std_logic_vector (dsize - 1 downto 0);
71 abh : out std_logic_vector (dsize - 1 downto 0);
72 pcl : out std_logic_vector (dsize - 1 downto 0);
73 pch : out std_logic_vector (dsize - 1 downto 0);
74 carry_in : in std_logic;
75 negative : out std_logic;
77 carry_out : out std_logic;
78 overflow : out std_logic
82 ----------------------------------------------
83 ------------ register declaration ------------
84 ----------------------------------------------
94 d : in std_logic_vector (dsize - 1 downto 0);
95 q : out std_logic_vector (dsize - 1 downto 0)
105 res_n : in std_logic;
106 set_n : in std_logic;
107 gate_cmd : in std_logic_vector (3 downto 0);
108 front_port : inout std_logic_vector (dsize - 1 downto 0);
109 back_in_port : in std_logic_vector (dsize - 1 downto 0);
110 back_out_port : out std_logic_vector (dsize - 1 downto 0)
114 component data_bus_buffer
121 int_oe_n : in std_logic;
122 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
123 ext_dbus : inout std_logic_vector (dsize - 1 downto 0)
127 component input_data_latch
135 int_dbus : in std_logic_vector (dsize - 1 downto 0);
136 alu_bus : out std_logic_vector (dsize - 1 downto 0)
140 component tri_state_buffer
146 d : in std_logic_vector (dsize - 1 downto 0);
147 q : out std_logic_vector (dsize - 1 downto 0)
151 ----------------------------------------------
152 ------------ signal declareration ------------
153 ----------------------------------------------
154 signal set_clk : std_logic;
155 signal trigger_clk : std_logic;
157 signal exec_cycle : std_logic_vector(5 downto 0);
158 signal next_cycle : std_logic_vector(5 downto 0);
159 signal status_reg : std_logic_vector (dsize - 1 downto 0);
161 -------------------------------
162 -------- control lines --------
163 -------------------------------
164 signal inst_we_n : std_logic;
165 signal ad_oe_n : std_logic;
167 signal dbuf_r_nw : std_logic;
168 signal dbuf_int_oe_n : std_logic;
170 signal dl_al_we_n : std_logic;
171 signal dl_ah_we_n : std_logic;
172 signal dl_al_oe_n : std_logic;
173 signal dl_ah_oe_n : std_logic;
175 signal pc_inc_n : std_logic;
176 signal abs_ea_n : std_logic;
177 signal zp_ea_n : std_logic;
178 signal arith_en_n : std_logic;
180 signal alu_n : std_logic;
181 signal alu_z : std_logic;
182 signal alu_c_in : std_logic;
183 signal alu_c : std_logic;
184 signal alu_v : std_logic;
186 ----control line for dual port registers.
187 signal pcl_cmd : std_logic_vector(3 downto 0);
188 signal pch_cmd : std_logic_vector(3 downto 0);
189 signal sp_cmd : std_logic_vector(3 downto 0);
190 signal acc_cmd : std_logic_vector(3 downto 0);
191 signal x_cmd : std_logic_vector(3 downto 0);
192 signal y_cmd : std_logic_vector(3 downto 0);
194 -------------------------------
195 ------------ buses ------------
196 -------------------------------
197 signal instruction : std_logic_vector(dsize - 1 downto 0);
199 signal bah : std_logic_vector(dsize - 1 downto 0);
200 signal bal : std_logic_vector(dsize - 1 downto 0);
201 signal index_bus : std_logic_vector(dsize - 1 downto 0);
203 signal acc_in : std_logic_vector(dsize - 1 downto 0);
204 signal acc_out : std_logic_vector(dsize - 1 downto 0);
206 signal pcl_in : std_logic_vector(dsize - 1 downto 0);
207 signal pch_in : std_logic_vector(dsize - 1 downto 0);
208 signal pcl_back : std_logic_vector(dsize - 1 downto 0);
209 signal pch_back : std_logic_vector(dsize - 1 downto 0);
212 signal null_bus : std_logic_vector(dsize - 1 downto 0);
215 signal abh : std_logic_vector(dsize - 1 downto 0);
216 signal abl : std_logic_vector(dsize - 1 downto 0);
219 signal d_bus : std_logic_vector(dsize - 1 downto 0);
222 signal reset_l : std_logic_vector(dsize - 1 downto 0);
223 signal reset_h : std_logic_vector(dsize - 1 downto 0);
224 signal nmi_l : std_logic_vector(dsize - 1 downto 0);
225 signal nmi_h : std_logic_vector(dsize - 1 downto 0);
226 signal irq_l : std_logic_vector(dsize - 1 downto 0);
227 signal irq_h : std_logic_vector(dsize - 1 downto 0);
229 signal check_bit : std_logic_vector(1 to 5);
236 phi2 <= not input_clk;
237 set_clk <= input_clk;
238 trigger_clk <= not input_clk;
241 reset_l <= "00000000";
242 reset_h <= "10000000";
245 --------------------------------------------------
246 ------------------- instances --------------------
247 --------------------------------------------------
249 dec_inst : decoder generic map (dsize)
271 , check_bit --check bit.
274 alu_inst : alu generic map (dsize)
275 port map (trigger_clk,
298 --cpu execution cycle number
299 exec_cycle_inst : d_flip_flop generic map (6)
300 port map(trigger_clk, '1', '1', '0', next_cycle, exec_cycle);
303 dbus_buf : data_bus_buffer generic map (dsize)
304 port map(set_clk, dbuf_r_nw, dbuf_int_oe_n, d_bus, d_io);
306 --address operand data buffer.
307 idl_l : input_data_latch generic map (dsize)
308 port map(set_clk, dl_al_oe_n, dl_al_we_n, bal, d_bus);
309 idl_h : input_data_latch generic map (dsize)
310 port map(set_clk, dl_ah_oe_n, dl_ah_we_n, bah, d_bus);
312 -------- registers --------
313 ir : d_flip_flop generic map (dsize)
314 port map(trigger_clk, '1', '1', inst_we_n, d_io, instruction);
316 pc_l : dual_dff generic map (dsize)
317 port map(trigger_clk, '1', rst_n, pcl_cmd, pcl_in, pcl_back, bal);
318 pc_h : dual_dff generic map (dsize)
319 port map(trigger_clk, '1', rst_n, pch_cmd, pch_in, pch_back, bah);
321 sp : dual_dff generic map (dsize)
322 port map(trigger_clk, rst_n, '1', sp_cmd, d_bus, abl, bal);
324 x : dual_dff generic map (dsize)
325 port map(trigger_clk, rst_n, '1', x_cmd, d_bus, null_bus, index_bus);
326 y : dual_dff generic map (dsize)
327 port map(trigger_clk, rst_n, '1', y_cmd, d_bus, null_bus, index_bus);
329 acc : dual_dff generic map (dsize)
330 port map(trigger_clk, rst_n, '1', acc_cmd, d_bus, acc_in, acc_out);
332 --adh output is controlled by decoder.
333 adh_buf : tri_state_buffer generic map (dsize)
334 port map (ad_oe_n, abh, addr(asize - 1 downto dsize));
335 adl_buf : tri_state_buffer generic map (dsize)
336 port map (ad_oe_n, abl, addr(dsize - 1 downto 0));
338 null_bus <= (others => 'Z');
341 reset_p : process (rst_n)
343 if (rst_n = '0') then
344 --reset vector set to pc.
354 ------------------------------------------------------------
355 ------------------------ for debug... ----------------------
356 ------------------------------------------------------------
358 dbg_p : process (set_clk)
360 use ieee.std_logic_textio.all;
361 use ieee.std_logic_unsigned.conv_integer;
363 procedure d_print(msg : string) is
364 variable out_l : line;
367 writeline(output, out_l);
370 function conv_hex8(ival : integer) return string is
371 variable tmp1, tmp2 : integer;
372 variable hex_chr: string (1 to 16) := "0123456789abcdef";
374 tmp2 := (ival mod 16 ** 2) / 16 ** 1;
375 tmp1 := ival mod 16 ** 1;
376 return hex_chr(tmp2 + 1) & hex_chr(tmp1 + 1);
379 if (set_clk = '0' and exec_cycle = "000000") then
380 --show pc on the T0 (fetch) cycle.
381 d_print("pc : " & conv_hex8(conv_integer(abh))
382 & conv_hex8(conv_integer(abl)));