2 ----------------------------------------
3 --- program counter register declaration
4 ----------------------------------------
7 use ieee.std_logic_1164.all;
8 use ieee.std_logic_unsigned.all;
9 use ieee.std_logic_arith.conv_std_logic_vector;
14 reset_addr : integer := 0
19 pc_type : in std_logic; --'0' pcl, '1' pch
20 dbus_we_n : in std_logic;
21 abus_we_n : in std_logic;
22 dbus_oe_n : in std_logic;
23 abus_oe_n : in std_logic;
24 addr_inc_n : in std_logic;
25 addr_dec_n : in std_logic;
26 add_carry : out std_logic;
27 rel_we_n : in std_logic;
28 rel_calc_n : in std_logic;
29 rel_prev : out std_logic;
30 int_d_bus : inout std_logic_vector (dsize - 1 downto 0);
31 int_a_bus : inout std_logic_vector (dsize - 1 downto 0)
35 architecture rtl of pc is
45 d : in std_logic_vector (dsize - 1 downto 0);
46 q : out std_logic_vector (dsize - 1 downto 0)
50 signal val : std_logic_vector (dsize - 1 downto 0);
51 signal rel : std_logic_vector (dsize - 1 downto 0);
54 ---increment & page moved case.
55 int_a_bus <= val + 1 when (abus_oe_n = '0'
56 and pc_type = '1' and addr_inc_n = '0') else
57 val when (abus_oe_n = '0') else
60 ---increment & page moved case.
61 int_d_bus <= val + 1 when (dbus_oe_n = '0'
62 and pc_type = '1' and addr_inc_n = '0') else
63 val when (dbus_oe_n = '0') else
66 set_p : process (clk, res_n)
67 variable add_val : std_logic_vector(dsize downto 0);
68 variable dec_val : std_logic_vector(dsize downto 0);
70 if (clk'event and clk = '1') then
72 if (addr_inc_n = '0' and abus_we_n = '0') then
73 --case increment & address set
74 --for jmp op, abs xy not page crossing case.
75 add_val := ('0' & int_a_bus) + 1;
76 val <= add_val(dsize - 1 downto 0);
77 add_carry <= add_val(dsize);
79 elsif (addr_inc_n = '0') then
80 add_val := ('0' & val) + 1;
81 val <= add_val(dsize - 1 downto 0);
82 add_carry <= add_val(dsize);
84 elsif (addr_dec_n = '0') then
85 dec_val := ('0' & val) - 1;
86 val <= dec_val(dsize - 1 downto 0);
89 elsif (rel_calc_n = '0') then
90 add_val := ('0' & val) + ('0' & rel);
91 --relative addressing mode is signed operation.
92 if (rel(7) = '0') then
94 add_carry <= add_val(dsize);
99 if (add_val(7) = '1') then
100 --negative value > goto preveous page.
106 val <= add_val(dsize - 1 downto 0);
107 elsif (abus_we_n = '0') then
111 elsif (dbus_we_n = '0') then
119 elsif (res_n'event and res_n = '0') then
120 val <= conv_std_logic_vector(reset_addr, dsize);
124 rel_dff : dff generic map (dsize)
125 port map(clk, rel_we_n, '0', int_d_bus, rel);
128 ----------------------------------------
129 --- normal d-flipflop declaration
130 ----------------------------------------
133 use ieee.std_logic_1164.all;
143 d : in std_logic_vector (dsize - 1 downto 0);
144 q : out std_logic_vector (dsize - 1 downto 0)
148 architecture rtl of dff is
149 signal val : std_logic_vector (dsize - 1 downto 0);
154 if ( clk'event and clk = '1'and we_n = '0') then
159 q <= val when oe_n = '0' else
163 ----------------------------------------
164 --- normal data latch declaration
165 ----------------------------------------
168 use ieee.std_logic_1164.all;
177 d : in std_logic_vector (dsize - 1 downto 0);
178 q : out std_logic_vector (dsize - 1 downto 0)
182 architecture rtl of latch is
183 signal val : std_logic_vector (dsize - 1 downto 0);
189 --latch only when clock is high
194 q <= val when oe_n = '0' else
198 ----------------------------------------
199 --- data bus buffer register
200 ----------------------------------------
203 use ieee.std_logic_1164.all;
212 int_oe_n : in std_logic;
213 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
214 ext_dbus : inout std_logic_vector (dsize - 1 downto 0)
218 architecture rtl of dbus_buf is
226 d : in std_logic_vector (dsize - 1 downto 0);
227 q : out std_logic_vector (dsize - 1 downto 0)
231 signal rd_clk : std_logic;
232 signal wr_clk : std_logic;
234 rd_clk <= r_nw and clk;
235 wr_clk <= (not r_nw) and clk;
237 --read from i/o to cpu
238 latch_r : latch generic map (dsize)
239 port map(rd_clk, int_oe_n, ext_dbus, int_dbus);
240 --write from cpu to io
241 latch_w : latch generic map (dsize)
242 port map(wr_clk, r_nw, int_dbus, ext_dbus);
245 ----------------------------------------
246 --- input data latch register
247 ----------------------------------------
250 use ieee.std_logic_1164.all;
258 al_we_n : in std_logic;
259 ah_we_n : in std_logic;
260 al_oe_n : in std_logic;
261 ah_oe_n : in std_logic;
262 int_dbus : in std_logic_vector (dsize - 1 downto 0);
263 ea_al : out std_logic_vector (dsize - 1 downto 0);
264 ea_ah : out std_logic_vector (dsize - 1 downto 0)
268 architecture rtl of input_dl is
276 d : in std_logic_vector (dsize - 1 downto 0);
277 q : out std_logic_vector (dsize - 1 downto 0)
280 signal ll_clk : std_logic;
281 signal lh_clk : std_logic;
282 signal ql : std_logic_vector (dsize - 1 downto 0);
283 signal qh : std_logic_vector (dsize - 1 downto 0);
286 ll_clk <= (not al_we_n) and clk;
287 lh_clk <= (not ah_we_n) and clk;
288 latch_l : latch generic map (dsize)
289 port map(ll_clk, '0', int_dbus, ql);
290 latch_h : latch generic map (dsize)
291 port map(lh_clk, '0', int_dbus, qh);
293 --tri-state buffer at the output
294 ea_al <= ql when al_oe_n = '0' else
296 ea_ah <= qh when ah_oe_n = '0' else
301 ----------------------------------------
302 --- stack pointer register
303 ----------------------------------------
306 use ieee.std_logic_1164.all;
307 use ieee.std_logic_unsigned.all;
316 push_n : in std_logic;
317 pop_n : in std_logic;
318 int_d_oe_n : in std_logic;
319 int_a_oe_n : in std_logic;
320 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
321 int_abus_l : out std_logic_vector (dsize - 1 downto 0);
322 int_abus_h : out std_logic_vector (dsize - 1 downto 0)
326 architecture rtl of sp is
335 d : in std_logic_vector (dsize - 1 downto 0);
336 q : out std_logic_vector (dsize - 1 downto 0)
339 signal oe_n : std_logic;
340 signal dff_we_n : std_logic;
341 signal q : std_logic_vector (dsize - 1 downto 0);
342 signal d : std_logic_vector (dsize - 1 downto 0);
343 signal q_buf : std_logic_vector (dsize - 1 downto 0);
346 oe_n <= (int_d_oe_n and int_a_oe_n);
347 dff_we_n <= (we_n and push_n and pop_n);
348 int_dbus <= q when int_d_oe_n = '0' else
351 ---push: address decrement after push is done.
352 ---pop: address increment before pop is done.
353 al_p : process (int_a_oe_n, push_n, clk, q_buf, q)
355 if (int_a_oe_n = '0') then
356 if (push_n = '0') then
362 elsif (pop_n = '0') then
372 int_abus_l <= (others => 'Z');
376 int_abus_h <= "00000001" when int_a_oe_n = '0' else
378 d <= int_dbus when we_n = '0' else
379 (q - 1) when push_n = '0' else
380 (q + 1) when pop_n = '0' else
383 dff_inst : dff generic map (dsize)
384 port map(clk, dff_we_n, oe_n, d, q);
385 buf : dff generic map (dsize)
386 port map(clk, dff_we_n, '0', q, q_buf);
390 ----------------------------------------
392 ----------------------------------------
395 use ieee.std_logic_1164.all;
403 res_n : in std_logic;
404 set_n : in std_logic;
407 d : in std_logic_vector (dsize - 1 downto 0);
408 q : out std_logic_vector (dsize - 1 downto 0)
412 architecture rtl of srff is
413 signal val : std_logic_vector (dsize - 1 downto 0);
416 q <= val when oe_n = '0' else
419 main_p : process (clk, res_n, set_n, d)
421 if ( clk'event and clk = '1'and we_n = '0') then
424 if (res_n'event and res_n = '0') then
425 val <= (others => '0');
427 if (set_n = '0') then
433 ----------------------------------------
434 --- status register component
435 ----------------------------------------
438 use ieee.std_logic_1164.all;
440 entity processor_status is
446 res_n : in std_logic;
447 dec_oe_n : in std_logic;
448 bus_oe_n : in std_logic;
449 set_flg_n : in std_logic;
450 flg_val : in std_logic;
451 load_bus_all_n : in std_logic;
452 load_bus_nz_n : in std_logic;
453 alu_we_n : in std_logic;
454 alu_n : in std_logic;
455 alu_v : in std_logic;
456 alu_z : in std_logic;
457 alu_c : in std_logic;
458 decoder : inout std_logic_vector (dsize - 1 downto 0);
459 int_dbus : inout std_logic_vector (dsize - 1 downto 0)
461 end processor_status;
463 architecture rtl of processor_status is
464 signal val : std_logic_vector (dsize - 1 downto 0);
466 decoder <= val when dec_oe_n = '0' else
468 int_dbus <= val when bus_oe_n = '0' else
472 main_p : process (clk, res_n)
473 variable tmp : std_logic_vector (dsize - 1 downto 0);
475 -- SR Flags (bit 7 to bit 0):
481 -- D .... Decimal (use BCD for arithmetics)
482 -- I .... Interrupt (IRQ disable)
486 ---only interrupt flag is set on reset.
487 if (res_n'event and res_n = '0') then
491 if ( clk'event and clk = '1') then
492 ---from flag set/clear instructions
493 if (set_flg_n = '0') then
494 if flg_val = '1' then
495 tmp := (decoder and "11111111");
499 val <= tmp or (val and not decoder);
501 ---status flag set from the data on the internal data bus.
502 ---interpret the input data by the decoder input.
503 ---load/pop/rti/t[asxy]
504 elsif (load_bus_all_n = '0') then
505 ---set the data bus data as they are.
507 elsif (load_bus_nz_n = '0') then
508 ---other case: n/z data must be interpreted.
510 if int_dbus(7) = '1' then
516 ---nor outputs 1 when all inputs are 0.
517 if (int_dbus(7) or int_dbus(6) or
518 int_dbus(5) or int_dbus(4) or int_dbus(3) or
519 int_dbus(2) or int_dbus(1) or int_dbus(0)) = '0' then
525 ---status set from alu/inx/iny etc.
526 elsif (alu_we_n = '0') then
528 val (5 downto 2) <= tmp (5 downto 2);
531 if (decoder(7) = '1') then
537 if (decoder(6) = '1') then
543 if (decoder(1) = '1') then
549 if (decoder(0) = '1') then
554 end if; --if (set_flg_n = '0') then
560 ----------------------------------------
562 ----------------------------------------
565 use ieee.std_logic_1164.all;
573 d : in std_logic_vector (dsize - 1 downto 0);
574 q : out std_logic_vector (dsize - 1 downto 0)
578 architecture rtl of tsb is
579 signal val : std_logic_vector (dsize - 1 downto 0);
581 q <= d when oe_n = '0' else
586 ----------------------------------------
588 ----------------------------------------
591 use ieee.std_logic_1164.all;
593 entity accumulator is
599 d_we_n : in std_logic;
600 alu_we_n : in std_logic;
601 d_oe_n : in std_logic;
602 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
603 alu_out : in std_logic_vector (dsize - 1 downto 0);
604 alu_in : out std_logic_vector (dsize - 1 downto 0)
608 architecture rtl of accumulator is
617 d : in std_logic_vector (dsize - 1 downto 0);
618 q : out std_logic_vector (dsize - 1 downto 0)
622 signal we_n : std_logic;
623 signal d : std_logic_vector (dsize - 1 downto 0);
624 signal q : std_logic_vector (dsize - 1 downto 0);
627 we_n <= (d_we_n and alu_we_n);
628 d <= int_dbus when d_we_n = '0' else
629 alu_out when alu_we_n = '0' else
631 int_dbus <= q when d_oe_n = '0' else
635 --read from i/o to cpu
636 dff_inst : dff generic map (dsize)
637 port map(clk, we_n, '0', d, q);
640 ----------------------------------------
641 --- index register x/y
642 ----------------------------------------
645 use ieee.std_logic_1164.all;
653 d_we_n : in std_logic;
654 d_oe_n : in std_logic;
655 ea_oe_n : in std_logic;
656 inc_n : in std_logic;
657 dec_n : in std_logic;
658 int_dbus : inout std_logic_vector (dsize - 1 downto 0);
659 ea_bus : out std_logic_vector (dsize - 1 downto 0);
665 architecture rtl of index_reg is
674 d : in std_logic_vector (dsize - 1 downto 0);
675 q : out std_logic_vector (dsize - 1 downto 0)
679 use ieee.std_logic_1164.all;
680 use ieee.std_logic_unsigned.all;
682 signal we_n : std_logic;
683 signal q : std_logic_vector (dsize - 1 downto 0);
684 signal d : std_logic_vector (dsize - 1 downto 0);
687 int_dbus <= q when d_oe_n = '0' else
689 ea_bus <= q when ea_oe_n = '0' else
692 --for inx/iny/dex/dey instructions...
693 inc_dec_p : process (clk, int_dbus, inc_n, dec_n)
694 variable inc_work : std_logic_vector (dsize downto 0);
695 variable dec_work : std_logic_vector (dsize downto 0);
697 inc_work := ('0' & q) + 1;
698 dec_work := ('0' & q) - 1;
700 d <= inc_work(dsize - 1 downto 0);
701 z <= not (inc_work(7) or inc_work(6) or
702 inc_work(5) or inc_work(4) or inc_work(3) or
703 inc_work(2) or inc_work(1) or inc_work(0));
704 n <= inc_work(dsize);
705 elsif dec_n = '0' then
706 d <= dec_work(dsize - 1 downto 0);
707 z <= not (dec_work(7) or dec_work(6) or
708 dec_work(5) or dec_work(4) or dec_work(3) or
709 dec_work(2) or dec_work(1) or dec_work(0));
710 n <= dec_work(dsize);
719 --read from i/o to cpu
720 we_n <= d_we_n and inc_n and dec_n;
721 dff_inst : dff generic map (dsize)
722 port map(clk, we_n, '0', d, q);