2 use ieee.std_logic_1164.all;
\r
3 use ieee.std_logic_unsigned.all;
\r
7 pi_rst_n : in std_logic;
\r
8 pi_base_clk : in std_logic;
\r
9 pi_cpu_en : in std_logic_vector (7 downto 0);
\r
10 pi_rdy : in std_logic;
\r
11 pi_irq_n : in std_logic;
\r
12 pi_nmi_n : in std_logic;
\r
13 po_r_nw : out std_logic;
\r
14 po_addr : out std_logic_vector ( 15 downto 0);
\r
15 pio_d_io : inout std_logic_vector ( 7 downto 0)
\r
19 architecture rtl of mos6502 is
\r
22 type cpu_main_state is (
\r
23 --common state. idle and inst fetch.
\r
27 --single byte inst execute.
\r
30 --mem data operation
\r
34 ST_A22_T1, ST_A22_T2,
\r
36 ST_A23_T1, ST_A23_T2, ST_A23_T3,
\r
38 ST_A24_T1, ST_A24_T2, ST_A24_T3, ST_A24_T4, ST_A24_T5,
\r
40 ST_A25_T1, ST_A25_T2, ST_A25_T3, ST_A25_T4,
\r
42 ST_A26_T1, ST_A26_T2, ST_A26_T3,
\r
44 ST_A27_T1, ST_A27_T2, ST_A27_T3, ST_A27_T4, ST_A27_T5,
\r
48 ST_A31_T1, ST_A31_T2,
\r
50 ST_A32_T1, ST_A32_T2, ST_A32_T3,
\r
52 ST_A33_T1, ST_A33_T2, ST_A33_T3, ST_A33_T4, ST_A33_T5,
\r
54 ST_A34_T1, ST_A34_T2, ST_A34_T3, ST_A34_T4,
\r
56 ST_A35_T1, ST_A35_T2, ST_A35_T3,
\r
58 ST_A36_T1, ST_A36_T2, ST_A36_T3, ST_A36_T4, ST_A36_T5,
\r
60 --memory to memory op.
\r
62 ST_A41_T1, ST_A41_T2, ST_A41_T3, ST_A41_T4,
\r
64 ST_A42_T1, ST_A42_T2, ST_A42_T3, ST_A42_T4, ST_A42_T5,
\r
66 ST_A43_T1, ST_A43_T2, ST_A43_T3, ST_A43_T4, ST_A43_T5,
\r
68 ST_A44_T1, ST_A44_T2, ST_A44_T3, ST_A44_T4, ST_A44_T5, ST_A44_T6,
\r
72 ST_A51_T1, ST_A51_T2,
\r
74 ST_A52_T1, ST_A52_T2, ST_A52_T3,
\r
76 ST_A53_T1, ST_A53_T2, ST_A53_T3,ST_A53_T4, ST_A53_T5,
\r
78 ST_A55_T1, ST_A55_T2, ST_A55_T3, ST_A55_T4, ST_A55_T5,
\r
80 ST_A561_T1, ST_A561_T2,
\r
82 ST_A562_T1, ST_A562_T2, ST_A562_T3, ST_A562_T4,
\r
84 ST_A57_T1, ST_A57_T2, ST_A57_T3, ST_A57_T4, ST_A57_T5,
\r
86 ST_A58_T1, ST_A58_T2, ST_A58_T3,
\r
89 ST_RS_T0, ST_RS_T1, ST_RS_T2, ST_RS_T3, ST_RS_T4, ST_RS_T5, ST_RS_T6, ST_RS_T7,
\r
96 --1 cpu clock is split into 8 state.
\r
97 --1 cpu clock = 32 x base clock.
\r
98 type cpu_sub_state is (
\r
99 ST_SUB00, ST_SUB01, ST_SUB02, ST_SUB03,
\r
100 ST_SUB10, ST_SUB11, ST_SUB12, ST_SUB13,
\r
101 ST_SUB20, ST_SUB21, ST_SUB22, ST_SUB23,
\r
102 ST_SUB30, ST_SUB31, ST_SUB32, ST_SUB33,
\r
103 ST_SUB40, ST_SUB41, ST_SUB42, ST_SUB43,
\r
104 ST_SUB50, ST_SUB51, ST_SUB52, ST_SUB53,
\r
105 ST_SUB60, ST_SUB61, ST_SUB62, ST_SUB63,
\r
106 ST_SUB70, ST_SUB71, ST_SUB72, ST_SUB73
\r
109 --Most instructions that explicitly reference memory locations have bit patterns of the form aaabbbcc.
\r
110 --The aaa and cc bits determine the opcode, and the bbb bits determine the addressing mode.
\r
111 type cpu_state_array is array (0 to 255) of cpu_main_state;
\r
112 constant inst_decode_rom : cpu_state_array := (
\r
114 ST_INV, ST_A24_T1, ST_INV, ST_INV, ST_INV, ST_A22_T1, ST_INV, ST_INV,
\r
116 ST_INV, ST_A21_T1, ST_A1_T1, ST_INV, ST_INV, ST_A23_T1, ST_INV, ST_INV,
\r
118 ST_INV, ST_A27_T1, ST_INV, ST_INV, ST_INV, ST_A26_T1, ST_INV, ST_INV,
\r
120 ST_A1_T1, ST_A25_T1, ST_INV, ST_INV, ST_INV, ST_A25_T1, ST_INV, ST_INV,
\r
122 ST_INV, ST_A24_T1, ST_INV, ST_INV, ST_A22_T1, ST_A22_T1, ST_INV, ST_INV,
\r
124 ST_INV, ST_A21_T1, ST_A1_T1, ST_INV, ST_A23_T1, ST_A23_T1, ST_INV, ST_INV,
\r
126 ST_INV, ST_A27_T1, ST_INV, ST_INV, ST_A26_T1, ST_INV, ST_INV, ST_INV,
\r
128 ST_A1_T1, ST_A25_T1, ST_INV, ST_INV, ST_INV, ST_A25_T1, ST_INV, ST_INV,
\r
130 ST_INV, ST_A24_T1, ST_INV, ST_INV, ST_INV, ST_A22_T1, ST_INV, ST_INV,
\r
132 ST_INV, ST_A21_T1, ST_A1_T1, ST_INV, ST_INV, ST_A23_T1, ST_INV, ST_INV,
\r
134 ST_INV, ST_A27_T1, ST_INV, ST_INV, ST_A26_T1, ST_INV, ST_INV, ST_INV,
\r
136 ST_A1_T1, ST_A25_T1, ST_INV, ST_INV, ST_INV, ST_A25_T1, ST_INV, ST_INV,
\r
138 ST_INV, ST_A24_T1, ST_INV, ST_INV, ST_INV, ST_A22_T1, ST_INV, ST_INV,
\r
140 ST_INV, ST_A21_T1, ST_A1_T1, ST_INV, ST_INV, ST_A23_T1, ST_INV, ST_INV,
\r
142 ST_INV, ST_A27_T1, ST_INV, ST_INV, ST_A26_T1, ST_INV, ST_INV, ST_INV,
\r
144 ST_A1_T1, ST_A25_T1, ST_INV, ST_INV, ST_INV, ST_A25_T1, ST_INV, ST_INV,
\r
146 ST_INV, ST_INV, ST_INV, ST_INV, ST_INV, ST_INV, ST_INV, ST_INV,
\r
148 ST_A1_T1, ST_INV, ST_A1_T1, ST_INV, ST_INV, ST_INV, ST_INV, ST_INV,
\r
150 ST_INV, ST_INV, ST_INV, ST_INV, ST_INV, ST_INV, ST_INV, ST_INV,
\r
152 ST_A1_T1, ST_INV, ST_A1_T1, ST_INV, ST_INV, ST_INV, ST_INV, ST_INV,
\r
154 ST_A21_T1, ST_A24_T1, ST_A21_T1, ST_INV, ST_A22_T1, ST_A22_T1, ST_A22_T1, ST_INV,
\r
156 ST_A1_T1, ST_A21_T1, ST_A1_T1, ST_INV, ST_A23_T1, ST_A23_T1, ST_A23_T1, ST_INV,
\r
158 ST_INV, ST_A27_T1, ST_INV, ST_A26_T1, ST_A26_T1, ST_A26_T1, ST_INV, ST_INV,
\r
160 ST_A1_T1, ST_A25_T1, ST_A1_T1, ST_INV, ST_A25_T1, ST_A25_T1, ST_A25_T1, ST_INV,
\r
162 ST_A21_T1, ST_A24_T1, ST_INV, ST_INV, ST_INV, ST_A22_T1, ST_INV, ST_INV,
\r
164 ST_A1_T1, ST_A21_T1, ST_A1_T1, ST_INV, ST_A23_T1, ST_A23_T1, ST_INV, ST_INV,
\r
166 ST_INV, ST_A27_T1, ST_INV, ST_INV, ST_A26_T1, ST_INV, ST_INV, ST_INV,
\r
168 ST_A1_T1, ST_A25_T1, ST_INV, ST_INV, ST_INV, ST_A25_T1, ST_INV, ST_INV,
\r
170 ST_A21_T1, ST_A24_T1, ST_INV, ST_INV, ST_A22_T1, ST_A22_T1, ST_INV, ST_INV,
\r
172 ST_A1_T1, ST_A21_T1, ST_A1_T1, ST_INV, ST_A23_T1, ST_A23_T1, ST_INV, ST_INV,
\r
174 ST_INV, ST_A27_T1, ST_INV, ST_INV, ST_INV, ST_A26_T1, ST_INV, ST_INV,
\r
176 ST_A1_T1, ST_A25_T1, ST_INV, ST_INV, ST_INV, ST_A25_T1, ST_INV, ST_INV
\r
179 signal reg_main_state : cpu_main_state;
\r
180 signal reg_main_next_state : cpu_main_state;
\r
181 signal reg_sub_state : cpu_sub_state;
\r
182 signal reg_sub_next_state : cpu_sub_state;
\r
184 --6502 register definition...
\r
185 signal reg_inst : std_logic_vector (7 downto 0);
\r
186 signal reg_acc : std_logic_vector (7 downto 0);
\r
187 signal reg_x : std_logic_vector (7 downto 0);
\r
188 signal reg_y : std_logic_vector (7 downto 0);
\r
189 signal reg_idl_l : std_logic_vector (7 downto 0);
\r
190 signal reg_idl_h : std_logic_vector (7 downto 0);
\r
191 signal reg_sp : std_logic_vector (7 downto 0);
\r
192 signal reg_status : std_logic_vector (7 downto 0);
\r
193 signal reg_pc_l : std_logic_vector (7 downto 0);
\r
194 signal reg_pc_h : std_logic_vector (7 downto 0);
\r
197 signal reg_r_nw : std_logic;
\r
198 signal reg_addr : std_logic_vector (15 downto 0);
\r
199 signal reg_d_in : std_logic_vector (7 downto 0);
\r
200 signal reg_d_out : std_logic_vector (7 downto 0);
\r
204 --state transition process...
\r
205 set_stat_p : process (pi_rst_n, pi_base_clk)
\r
207 if (pi_rst_n = '0') then
\r
208 reg_main_state <= ST_IDLE;
\r
209 reg_sub_state <= ST_SUB00;
\r
210 elsif (rising_edge(pi_base_clk)) then
\r
211 reg_main_state <= reg_main_next_state;
\r
212 reg_sub_state <= reg_sub_next_state;
\r
213 end if;--if (pi_rst_n = '0') then
\r
216 --state change to next.
\r
217 tx_next_sub_stat_p : process (reg_sub_state, pi_cpu_en)
\r
219 case reg_sub_state is
\r
221 if (pi_cpu_en(0) = '1') then
\r
222 reg_sub_next_state <= ST_SUB01;
\r
224 reg_sub_next_state <= reg_sub_state;
\r
227 reg_sub_next_state <= ST_SUB02;
\r
229 reg_sub_next_state <= ST_SUB03;
\r
231 reg_sub_next_state <= ST_SUB10;
\r
233 reg_sub_next_state <= ST_SUB11;
\r
235 reg_sub_next_state <= ST_SUB12;
\r
237 reg_sub_next_state <= ST_SUB13;
\r
239 reg_sub_next_state <= ST_SUB20;
\r
241 reg_sub_next_state <= ST_SUB21;
\r
243 reg_sub_next_state <= ST_SUB22;
\r
245 reg_sub_next_state <= ST_SUB23;
\r
247 reg_sub_next_state <= ST_SUB30;
\r
249 reg_sub_next_state <= ST_SUB31;
\r
251 reg_sub_next_state <= ST_SUB32;
\r
253 reg_sub_next_state <= ST_SUB33;
\r
255 reg_sub_next_state <= ST_SUB40;
\r
257 reg_sub_next_state <= ST_SUB41;
\r
259 reg_sub_next_state <= ST_SUB42;
\r
261 reg_sub_next_state <= ST_SUB43;
\r
263 reg_sub_next_state <= ST_SUB50;
\r
265 reg_sub_next_state <= ST_SUB51;
\r
267 reg_sub_next_state <= ST_SUB52;
\r
269 reg_sub_next_state <= ST_SUB53;
\r
271 reg_sub_next_state <= ST_SUB60;
\r
273 reg_sub_next_state <= ST_SUB61;
\r
275 reg_sub_next_state <= ST_SUB62;
\r
277 reg_sub_next_state <= ST_SUB63;
\r
279 reg_sub_next_state <= ST_SUB70;
\r
281 reg_sub_next_state <= ST_SUB71;
\r
283 reg_sub_next_state <= ST_SUB72;
\r
285 reg_sub_next_state <= ST_SUB73;
\r
287 reg_sub_next_state <= ST_SUB00;
\r
291 --state change to next.
\r
292 tx_next_main_stat_p : process (reg_main_state, reg_sub_state, pi_rst_n)
\r
295 case reg_main_state is
\r
298 if (pi_rst_n = '0') then
\r
299 reg_main_next_state <= reg_main_state;
\r
301 reg_main_next_state <= ST_RS_T0;
\r
305 if (reg_sub_state = ST_SUB73) then
\r
306 reg_main_next_state <= ST_RS_T1;
\r
308 reg_main_next_state <= reg_main_state;
\r
311 if (reg_sub_state = ST_SUB73) then
\r
312 reg_main_next_state <= ST_RS_T2;
\r
314 reg_main_next_state <= reg_main_state;
\r
317 if (reg_sub_state = ST_SUB73) then
\r
318 reg_main_next_state <= ST_RS_T3;
\r
320 reg_main_next_state <= reg_main_state;
\r
323 if (reg_sub_state = ST_SUB73) then
\r
324 reg_main_next_state <= ST_RS_T4;
\r
326 reg_main_next_state <= reg_main_state;
\r
329 if (reg_sub_state = ST_SUB73) then
\r
330 reg_main_next_state <= ST_RS_T5;
\r
332 reg_main_next_state <= reg_main_state;
\r
335 if (reg_sub_state = ST_SUB73) then
\r
336 reg_main_next_state <= ST_RS_T6;
\r
338 reg_main_next_state <= reg_main_state;
\r
341 if (reg_sub_state = ST_SUB73) then
\r
342 reg_main_next_state <= ST_RS_T7;
\r
344 reg_main_next_state <= reg_main_state;
\r
347 if (reg_sub_state = ST_SUB73) then
\r
348 reg_main_next_state <= ST_CM_T0;
\r
350 reg_main_next_state <= reg_main_state;
\r
353 --instruction fetch
\r
355 if (reg_sub_state = ST_SUB73) then
\r
356 ---instruction decode next state.
\r
357 reg_main_next_state <= inst_decode_rom(conv_integer(reg_inst));
\r
359 reg_main_next_state <= reg_main_state;
\r
362 --A1 inst.(single byte)
\r
364 if (reg_sub_state = ST_SUB73) then
\r
365 reg_main_next_state <= ST_CM_T0;
\r
367 reg_main_next_state <= reg_main_state;
\r
372 if (reg_sub_state = ST_SUB73) then
\r
373 reg_main_next_state <= ST_CM_T0;
\r
375 reg_main_next_state <= reg_main_state;
\r
378 if (reg_sub_state = ST_SUB73) then
\r
379 reg_main_next_state <= ST_A22_T2;
\r
381 reg_main_next_state <= reg_main_state;
\r
384 if (reg_sub_state = ST_SUB73) then
\r
385 reg_main_next_state <= ST_CM_T0;
\r
387 reg_main_next_state <= reg_main_state;
\r
390 if (reg_sub_state = ST_SUB73) then
\r
391 reg_main_next_state <= ST_A23_T2;
\r
393 reg_main_next_state <= reg_main_state;
\r
396 if (reg_sub_state = ST_SUB73) then
\r
397 reg_main_next_state <= ST_A23_T3;
\r
399 reg_main_next_state <= reg_main_state;
\r
402 if (reg_sub_state = ST_SUB73) then
\r
403 reg_main_next_state <= ST_CM_T0;
\r
405 reg_main_next_state <= reg_main_state;
\r
408 if (reg_sub_state = ST_SUB73) then
\r
409 reg_main_next_state <= ST_A24_T2;
\r
411 reg_main_next_state <= reg_main_state;
\r
414 if (reg_sub_state = ST_SUB73) then
\r
415 reg_main_next_state <= ST_A24_T3;
\r
417 reg_main_next_state <= reg_main_state;
\r
420 if (reg_sub_state = ST_SUB73) then
\r
421 reg_main_next_state <= ST_A24_T4;
\r
423 reg_main_next_state <= reg_main_state;
\r
426 if (reg_sub_state = ST_SUB73) then
\r
427 reg_main_next_state <= ST_A24_T5;
\r
429 reg_main_next_state <= reg_main_state;
\r
432 if (reg_sub_state = ST_SUB73) then
\r
433 reg_main_next_state <= ST_CM_T0;
\r
435 reg_main_next_state <= reg_main_state;
\r
438 if (reg_sub_state = ST_SUB73) then
\r
439 reg_main_next_state <= ST_A25_T2;
\r
441 reg_main_next_state <= reg_main_state;
\r
444 if (reg_sub_state = ST_SUB73) then
\r
445 reg_main_next_state <= ST_A25_T3;
\r
447 reg_main_next_state <= reg_main_state;
\r
450 if (reg_sub_state = ST_SUB73) then
\r
451 reg_main_next_state <= ST_A25_T4;
\r
453 reg_main_next_state <= reg_main_state;
\r
456 if (reg_sub_state = ST_SUB73) then
\r
457 reg_main_next_state <= ST_CM_T0;
\r
459 reg_main_next_state <= reg_main_state;
\r
462 if (reg_sub_state = ST_SUB73) then
\r
463 reg_main_next_state <= ST_A26_T2;
\r
465 reg_main_next_state <= reg_main_state;
\r
468 if (reg_sub_state = ST_SUB73) then
\r
469 reg_main_next_state <= ST_A26_T3;
\r
471 reg_main_next_state <= reg_main_state;
\r
474 if (reg_sub_state = ST_SUB73) then
\r
475 reg_main_next_state <= ST_CM_T0;
\r
477 reg_main_next_state <= reg_main_state;
\r
480 if (reg_sub_state = ST_SUB73) then
\r
481 reg_main_next_state <= ST_A27_T2;
\r
483 reg_main_next_state <= reg_main_state;
\r
486 if (reg_sub_state = ST_SUB73) then
\r
487 reg_main_next_state <= ST_A27_T3;
\r
489 reg_main_next_state <= reg_main_state;
\r
492 if (reg_sub_state = ST_SUB73) then
\r
493 reg_main_next_state <= ST_A27_T4;
\r
495 reg_main_next_state <= reg_main_state;
\r
498 if (reg_sub_state = ST_SUB73) then
\r
499 reg_main_next_state <= ST_A27_T5;
\r
501 reg_main_next_state <= reg_main_state;
\r
504 if (reg_sub_state = ST_SUB73) then
\r
505 reg_main_next_state <= ST_CM_T0;
\r
507 reg_main_next_state <= reg_main_state;
\r
512 if (reg_sub_state = ST_SUB73) then
\r
513 reg_main_next_state <= ST_A31_T2;
\r
515 reg_main_next_state <= reg_main_state;
\r
518 if (reg_sub_state = ST_SUB73) then
\r
519 reg_main_next_state <= ST_CM_T0;
\r
521 reg_main_next_state <= reg_main_state;
\r
524 if (reg_sub_state = ST_SUB73) then
\r
525 reg_main_next_state <= ST_A32_T2;
\r
527 reg_main_next_state <= reg_main_state;
\r
530 if (reg_sub_state = ST_SUB73) then
\r
531 reg_main_next_state <= ST_A32_T3;
\r
533 reg_main_next_state <= reg_main_state;
\r
536 if (reg_sub_state = ST_SUB73) then
\r
537 reg_main_next_state <= ST_CM_T0;
\r
539 reg_main_next_state <= reg_main_state;
\r
542 if (reg_sub_state = ST_SUB73) then
\r
543 reg_main_next_state <= ST_A33_T2;
\r
545 reg_main_next_state <= reg_main_state;
\r
548 if (reg_sub_state = ST_SUB73) then
\r
549 reg_main_next_state <= ST_A33_T3;
\r
551 reg_main_next_state <= reg_main_state;
\r
554 if (reg_sub_state = ST_SUB73) then
\r
555 reg_main_next_state <= ST_A33_T4;
\r
557 reg_main_next_state <= reg_main_state;
\r
560 if (reg_sub_state = ST_SUB73) then
\r
561 reg_main_next_state <= ST_A33_T5;
\r
563 reg_main_next_state <= reg_main_state;
\r
566 if (reg_sub_state = ST_SUB73) then
\r
567 reg_main_next_state <= ST_CM_T0;
\r
569 reg_main_next_state <= reg_main_state;
\r
572 if (reg_sub_state = ST_SUB73) then
\r
573 reg_main_next_state <= ST_A34_T2;
\r
575 reg_main_next_state <= reg_main_state;
\r
578 if (reg_sub_state = ST_SUB73) then
\r
579 reg_main_next_state <= ST_A34_T3;
\r
581 reg_main_next_state <= reg_main_state;
\r
584 if (reg_sub_state = ST_SUB73) then
\r
585 reg_main_next_state <= ST_A34_T4;
\r
587 reg_main_next_state <= reg_main_state;
\r
590 if (reg_sub_state = ST_SUB73) then
\r
591 reg_main_next_state <= ST_CM_T0;
\r
593 reg_main_next_state <= reg_main_state;
\r
596 if (reg_sub_state = ST_SUB73) then
\r
597 reg_main_next_state <= ST_A35_T2;
\r
599 reg_main_next_state <= reg_main_state;
\r
602 if (reg_sub_state = ST_SUB73) then
\r
603 reg_main_next_state <= ST_A35_T3;
\r
605 reg_main_next_state <= reg_main_state;
\r
608 if (reg_sub_state = ST_SUB73) then
\r
609 reg_main_next_state <= ST_CM_T0;
\r
611 reg_main_next_state <= reg_main_state;
\r
614 if (reg_sub_state = ST_SUB73) then
\r
615 reg_main_next_state <= ST_A36_T2;
\r
617 reg_main_next_state <= reg_main_state;
\r
620 if (reg_sub_state = ST_SUB73) then
\r
621 reg_main_next_state <= ST_A36_T3;
\r
623 reg_main_next_state <= reg_main_state;
\r
626 if (reg_sub_state = ST_SUB73) then
\r
627 reg_main_next_state <= ST_A36_T4;
\r
629 reg_main_next_state <= reg_main_state;
\r
632 if (reg_sub_state = ST_SUB73) then
\r
633 reg_main_next_state <= ST_A36_T5;
\r
635 reg_main_next_state <= reg_main_state;
\r
638 if (reg_sub_state = ST_SUB73) then
\r
639 reg_main_next_state <= ST_CM_T0;
\r
641 reg_main_next_state <= reg_main_state;
\r
647 if (reg_sub_state = ST_SUB73) then
\r
648 reg_main_next_state <= ST_A41_T2;
\r
650 reg_main_next_state <= reg_main_state;
\r
653 if (reg_sub_state = ST_SUB73) then
\r
654 reg_main_next_state <= ST_A41_T3;
\r
656 reg_main_next_state <= reg_main_state;
\r
659 if (reg_sub_state = ST_SUB73) then
\r
660 reg_main_next_state <= ST_A41_T4;
\r
662 reg_main_next_state <= reg_main_state;
\r
665 if (reg_sub_state = ST_SUB73) then
\r
666 reg_main_next_state <= ST_CM_T0;
\r
668 reg_main_next_state <= reg_main_state;
\r
671 if (reg_sub_state = ST_SUB73) then
\r
672 reg_main_next_state <= ST_A42_T2;
\r
674 reg_main_next_state <= reg_main_state;
\r
677 if (reg_sub_state = ST_SUB73) then
\r
678 reg_main_next_state <= ST_A42_T3;
\r
680 reg_main_next_state <= reg_main_state;
\r
683 if (reg_sub_state = ST_SUB73) then
\r
684 reg_main_next_state <= ST_A42_T4;
\r
686 reg_main_next_state <= reg_main_state;
\r
689 if (reg_sub_state = ST_SUB73) then
\r
690 reg_main_next_state <= ST_A42_T5;
\r
692 reg_main_next_state <= reg_main_state;
\r
695 if (reg_sub_state = ST_SUB73) then
\r
696 reg_main_next_state <= ST_CM_T0;
\r
698 reg_main_next_state <= reg_main_state;
\r
701 if (reg_sub_state = ST_SUB73) then
\r
702 reg_main_next_state <= ST_A43_T2;
\r
704 reg_main_next_state <= reg_main_state;
\r
707 if (reg_sub_state = ST_SUB73) then
\r
708 reg_main_next_state <= ST_CM_T0;
\r
710 reg_main_next_state <= reg_main_state;
\r
713 if (reg_sub_state = ST_SUB73) then
\r
714 reg_main_next_state <= ST_A43_T4;
\r
716 reg_main_next_state <= reg_main_state;
\r
719 if (reg_sub_state = ST_SUB73) then
\r
720 reg_main_next_state <= ST_A43_T5;
\r
722 reg_main_next_state <= reg_main_state;
\r
725 if (reg_sub_state = ST_SUB73) then
\r
726 reg_main_next_state <= ST_CM_T0;
\r
728 reg_main_next_state <= reg_main_state;
\r
731 if (reg_sub_state = ST_SUB73) then
\r
732 reg_main_next_state <= ST_A44_T2;
\r
734 reg_main_next_state <= reg_main_state;
\r
737 if (reg_sub_state = ST_SUB73) then
\r
738 reg_main_next_state <= ST_A44_T3;
\r
740 reg_main_next_state <= reg_main_state;
\r
743 if (reg_sub_state = ST_SUB73) then
\r
744 reg_main_next_state <= ST_A44_T4;
\r
746 reg_main_next_state <= reg_main_state;
\r
749 if (reg_sub_state = ST_SUB73) then
\r
750 reg_main_next_state <= ST_A44_T5;
\r
752 reg_main_next_state <= reg_main_state;
\r
755 if (reg_sub_state = ST_SUB73) then
\r
756 reg_main_next_state <= ST_A44_T6;
\r
758 reg_main_next_state <= reg_main_state;
\r
761 if (reg_sub_state = ST_SUB73) then
\r
762 reg_main_next_state <= ST_CM_T0;
\r
764 reg_main_next_state <= reg_main_state;
\r
770 if (reg_sub_state = ST_SUB73) then
\r
771 reg_main_next_state <= ST_A51_T2;
\r
773 reg_main_next_state <= reg_main_state;
\r
776 if (reg_sub_state = ST_SUB73) then
\r
777 reg_main_next_state <= ST_CM_T0;
\r
779 reg_main_next_state <= reg_main_state;
\r
782 if (reg_sub_state = ST_SUB73) then
\r
783 reg_main_next_state <= ST_A52_T2;
\r
785 reg_main_next_state <= reg_main_state;
\r
788 if (reg_sub_state = ST_SUB73) then
\r
789 reg_main_next_state <= ST_A52_T3;
\r
791 reg_main_next_state <= reg_main_state;
\r
794 if (reg_sub_state = ST_SUB73) then
\r
795 reg_main_next_state <= ST_CM_T0;
\r
797 reg_main_next_state <= reg_main_state;
\r
800 if (reg_sub_state = ST_SUB73) then
\r
801 reg_main_next_state <= ST_A53_T2;
\r
803 reg_main_next_state <= reg_main_state;
\r
806 if (reg_sub_state = ST_SUB73) then
\r
807 reg_main_next_state <= ST_A53_T3;
\r
809 reg_main_next_state <= reg_main_state;
\r
812 if (reg_sub_state = ST_SUB73) then
\r
813 reg_main_next_state <= ST_A53_T4;
\r
815 reg_main_next_state <= reg_main_state;
\r
818 if (reg_sub_state = ST_SUB73) then
\r
819 reg_main_next_state <= ST_A53_T5;
\r
821 reg_main_next_state <= reg_main_state;
\r
824 if (reg_sub_state = ST_SUB73) then
\r
825 reg_main_next_state <= ST_CM_T0;
\r
827 reg_main_next_state <= reg_main_state;
\r
830 if (reg_sub_state = ST_SUB73) then
\r
831 reg_main_next_state <= ST_A55_T2;
\r
833 reg_main_next_state <= reg_main_state;
\r
836 if (reg_sub_state = ST_SUB73) then
\r
837 reg_main_next_state <= ST_A55_T3;
\r
839 reg_main_next_state <= reg_main_state;
\r
842 if (reg_sub_state = ST_SUB73) then
\r
843 reg_main_next_state <= ST_A55_T4;
\r
845 reg_main_next_state <= reg_main_state;
\r
848 if (reg_sub_state = ST_SUB73) then
\r
849 reg_main_next_state <= ST_A55_T5;
\r
851 reg_main_next_state <= reg_main_state;
\r
854 if (reg_sub_state = ST_SUB73) then
\r
855 reg_main_next_state <= ST_CM_T0;
\r
857 reg_main_next_state <= reg_main_state;
\r
860 if (reg_sub_state = ST_SUB73) then
\r
861 reg_main_next_state <= ST_A561_T2;
\r
863 reg_main_next_state <= reg_main_state;
\r
866 if (reg_sub_state = ST_SUB73) then
\r
867 reg_main_next_state <= ST_CM_T0;
\r
869 reg_main_next_state <= reg_main_state;
\r
872 if (reg_sub_state = ST_SUB73) then
\r
873 reg_main_next_state <= ST_A562_T2;
\r
875 reg_main_next_state <= reg_main_state;
\r
878 if (reg_sub_state = ST_SUB73) then
\r
879 reg_main_next_state <= ST_A562_T3;
\r
881 reg_main_next_state <= reg_main_state;
\r
884 if (reg_sub_state = ST_SUB73) then
\r
885 reg_main_next_state <= ST_A562_T4;
\r
887 reg_main_next_state <= reg_main_state;
\r
890 if (reg_sub_state = ST_SUB73) then
\r
891 reg_main_next_state <= ST_CM_T0;
\r
893 reg_main_next_state <= reg_main_state;
\r
896 if (reg_sub_state = ST_SUB73) then
\r
897 reg_main_next_state <= ST_A57_T2;
\r
899 reg_main_next_state <= reg_main_state;
\r
902 if (reg_sub_state = ST_SUB73) then
\r
903 reg_main_next_state <= ST_A57_T3;
\r
905 reg_main_next_state <= reg_main_state;
\r
908 if (reg_sub_state = ST_SUB73) then
\r
909 reg_main_next_state <= ST_A57_T4;
\r
911 reg_main_next_state <= reg_main_state;
\r
914 if (reg_sub_state = ST_SUB73) then
\r
915 reg_main_next_state <= ST_A57_T5;
\r
917 reg_main_next_state <= reg_main_state;
\r
920 if (reg_sub_state = ST_SUB73) then
\r
921 reg_main_next_state <= ST_CM_T0;
\r
923 reg_main_next_state <= reg_main_state;
\r
926 if (reg_sub_state = ST_SUB73) then
\r
927 reg_main_next_state <= ST_A58_T2;
\r
929 reg_main_next_state <= reg_main_state;
\r
932 if (reg_sub_state = ST_SUB73) then
\r
933 reg_main_next_state <= ST_A58_T3;
\r
935 reg_main_next_state <= reg_main_state;
\r
938 if (reg_sub_state = ST_SUB73) then
\r
939 reg_main_next_state <= ST_CM_T0;
\r
941 reg_main_next_state <= reg_main_state;
\r
945 ---failed to decode next...
\r
946 reg_main_next_state <= reg_main_state;
\r
947 -- ---not ready yet...
\r
949 -- reg_main_next_state <= reg_main_state;
\r
953 --addressing general process...
\r
954 --pc, io bus, r/w, instruction regs...
\r
955 ad_general_p : process (pi_rst_n, pi_base_clk)
\r
957 procedure pc_inc is
\r
959 if (reg_pc_l = "11111111") then
\r
961 reg_pc_l <= "00000000";
\r
962 reg_pc_h <= reg_pc_h + 1;
\r
964 reg_pc_l <= reg_pc_l + 1;
\r
969 if (pi_rst_n = '0') then
\r
970 reg_pc_l <= (others => '0');
\r
971 reg_pc_h <= (others => '0');
\r
972 reg_inst <= (others => '0');
\r
973 reg_addr <= (others => 'Z');
\r
974 reg_d_out <= (others => 'Z');
\r
976 elsif (rising_edge(pi_base_clk)) then
\r
977 if (reg_main_state = ST_RS_T0) then
\r
978 reg_pc_l <= (others => '0');
\r
979 reg_pc_h <= (others => '0');
\r
980 reg_inst <= (others => '0');
\r
981 reg_addr <= (others => '0');
\r
982 reg_d_out <= (others => 'Z');
\r
984 elsif (reg_main_state = ST_RS_T3) then
\r
986 reg_addr <= "11111111" & reg_sp;
\r
987 reg_d_out <= (others => 'Z');
\r
989 elsif (reg_main_state = ST_RS_T4) then
\r
991 reg_addr <= "11111111" & (reg_sp - 1);
\r
992 reg_d_out <= (others => 'Z');
\r
994 elsif (reg_main_state = ST_RS_T5) then
\r
996 reg_addr <= "11111111" & (reg_sp - 2);
\r
997 reg_d_out <= (others => 'Z');
\r
999 elsif (reg_main_state = ST_RS_T6) then
\r
1000 --reset vector low...
\r
1001 reg_addr <= "1111111111111100";
\r
1002 reg_d_out <= (others => 'Z');
\r
1004 reg_pc_l <= reg_d_in;
\r
1005 elsif (reg_main_state = ST_RS_T7) then
\r
1006 --reset vector high...
\r
1007 reg_addr <= "1111111111111101";
\r
1008 reg_d_out <= (others => 'Z');
\r
1010 reg_pc_h <= reg_d_in;
\r
1011 elsif (reg_main_state = ST_CM_T0) then
\r
1012 if (reg_sub_state = ST_SUB00) then
\r
1013 reg_addr <= reg_pc_h & reg_pc_l;
\r
1014 reg_d_out <= (others => 'Z');
\r
1016 elsif (reg_sub_state = ST_SUB30) then
\r
1017 reg_inst <= reg_d_in;
\r
1018 elsif (reg_sub_state = ST_SUB70) then
\r
1022 end if;--if (pi_rst_n = '0') then
\r
1025 po_r_nw <= reg_r_nw;
\r
1026 po_addr <= reg_addr;
\r
1027 pio_d_io <= reg_d_out;
\r
1028 reg_d_in <= pio_d_io;
\r