OpenCores
URL https://opencores.org/ocsvn/v6502/v6502/trunk

Subversion Repositories v6502

[/] [v6502/] [trunk/] [pr.vhd] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 Valerio63
library IEEE;
2
use IEEE.std_logic_1164.all;  -- defines std_logic types
3
use IEEE.STD_LOGIC_unsigned.all;
4
use IEEE.STD_LOGIC_arith.all;
5
 
6
-- 8 bit processor status register P
7
-- NV1BDIZC    
8
-- 76543210
9
-- ||||||||
10
-- ||||||||--- C = carry/borrow flag
11
-- |||||||---- Z = zero flag
12
-- ||||||----- I = interrupt mask
13
-- |||||------ D = decimal/binary alu mode
14
-- ||||------- B = break opcode flag
15
-- |||-------- 1 = always "1'
16
-- ||--------- V = overflow flag
17
-- |---------- N = negative flag
18
entity pr is
19
  port(      clk:  in STD_LOGIC;                        -- clock
20
             clr:  in STD_LOGIC;                        -- clear
21
           fwait:  in STD_LOGIC;
22
               n:  in STD_LOGIC;                        -- N input
23
               v:  in STD_LOGIC;                        -- V input
24
               z:  in STD_LOGIC;                        -- Z input
25
               c:  in STD_LOGIC;                        -- C input
26
               b:  in STD_LOGIC;                        -- B input
27
              sv:  in STD_LOGIC;                        -- set overflow (by external pin SO) 
28
          acr_in:  in STD_LOGIC;                        -- auxiliary carry in   
29
              fc:  in STD_LOGIC_VECTOR(3 downto 0);     -- function code 
30
             din:  in STD_LOGIC_VECTOR(7 downto 0);     -- input
31
            dout: out STD_LOGIC_VECTOR(7 downto 0);     -- output
32
         acr_out: out STD_LOGIC                         -- auxiliary carry out   
33
      );
34
end pr;
35
 
36
architecture rtl of pr is
37
constant NOP_P: STD_LOGIC_VECTOR(3 downto 0) := "0000"; -- PR no operation
38
constant PLD_P: STD_LOGIC_VECTOR(3 downto 0) := "0001"; -- PR load
39 6 Valerio63
constant FLD_P: STD_LOGIC_VECTOR(3 downto 0) := "0010"; -- NZ load
40
constant FLC_P: STD_LOGIC_VECTOR(3 downto 0) := "0011"; -- NZC load
41
constant FLV_P: STD_LOGIC_VECTOR(3 downto 0) := "0100"; -- NVZC load
42
constant SEC_P: STD_LOGIC_VECTOR(3 downto 0) := "0101"; -- 1 => C 
43
constant CLC_P: STD_LOGIC_VECTOR(3 downto 0) := "0110"; -- 0 => C 
44
constant SEI_P: STD_LOGIC_VECTOR(3 downto 0) := "0111"; -- 1 => I 
45
constant CLI_P: STD_LOGIC_VECTOR(3 downto 0) := "1000"; -- 0 => I 
46
constant SED_P: STD_LOGIC_VECTOR(3 downto 0) := "1001"; -- 1 => D 
47
constant CLD_P: STD_LOGIC_VECTOR(3 downto 0) := "1010"; -- 0 => D 
48
constant CLV_P: STD_LOGIC_VECTOR(3 downto 0) := "1011"; -- 0 => V 
49
constant AUC_P: STD_LOGIC_VECTOR(3 downto 0) := "1100"; -- auc => ACR 
50
constant HAC_P: STD_LOGIC_VECTOR(3 downto 0) := "1101"; -- hold ACR 
51
constant SID_P: STD_LOGIC_VECTOR(3 downto 0) := "1110"; -- 1 => I/D 
52
constant LDZ_P: STD_LOGIC_VECTOR(3 downto 0) := "1111"; -- Z load
53 4 Valerio63
 
54
signal  reg: STD_LOGIC_VECTOR(7 downto 0);
55
signal  acr: STD_LOGIC;                                                   -- carry/borrow used for effectve address calculation 
56
signal i_so: STD_LOGIC;
57
 
58
begin
59
  i_so <= reg(6) when sv = '1' else '1';                                  -- logic for external pin SO
60
  process(clk)
61
    begin
62
      if (clk'event and clk = '1') then
63
        if fwait = '1' then
64
          reg <= reg;
65
        else
66
          if clr = '1' then
67
            reg <= "00100100";
68
            acr <= '0';
69
          else
70
            case fc is
71 6 Valerio63
              when PLD_P  => reg(7 downto 6) <= din(7 downto 6);                      -- load NV1BDIZC 
72 4 Valerio63
                             reg(5)          <= '1';
73
                             reg(4 downto 0) <= din(4 downto 0);
74
                             acr <= '0';
75 6 Valerio63
              when FLD_P  => reg <= n & reg(6) & '1' & reg(4 downto 2) & z & reg(0);  -- load NZ
76 4 Valerio63
                             acr <= '0';
77 6 Valerio63
              when FLC_P  => reg <= n & reg(6) & '1' & reg(4 downto 2) & z & c;       -- load NZC
78
                             acr <= '0';
79
              when FLV_P  => reg <= n & v & '1' & reg(4 downto 2) & z & c;            -- load NZCV
80
                             acr <= '0';
81
              when SEC_P  => reg <= reg or  "00000001";                               -- 1 => C
82 4 Valerio63
                             acr <= acr;
83 6 Valerio63
              when CLC_P  => reg <= reg and "11111110";                               -- 0 => C
84 4 Valerio63
                             acr <= acr;
85 6 Valerio63
              when CLI_P  => reg <= reg and "11111011";                               -- 0 => I
86 4 Valerio63
                             acr <= acr;
87 6 Valerio63
              when SED_P  => reg <= reg or  "00001000";                               -- 1 => D
88 4 Valerio63
                             acr <= acr;
89 6 Valerio63
              when CLD_P  => reg <= reg and "11110111";                               -- 0 => D
90 4 Valerio63
                             acr <= acr;
91 6 Valerio63
                                  when LDZ_P  => reg(1) <= z;                                             -- z => Z
92 4 Valerio63
                             reg(7 downto 2) <= reg(7 downto 2);
93
                                            reg(0) <= reg(0);
94
              when SEI_P  => reg(7 downto 5) <= reg(7 downto 5);
95
                             reg(4) <= reg(4);
96
                             reg(3) <= reg(3);
97 6 Valerio63
                             reg(2) <= '1';                                           -- 1 => I
98 4 Valerio63
                             reg(1 downto 0) <= reg(1 downto 0);
99
                             acr <= acr;
100 6 Valerio63
              when SID_P  => reg(7 downto 5) <= reg(7 downto 5);                      -- set I and clear D decimal flag (used by interrupt sequence)
101
                             reg(4) <= b;                                             -- 1 => B (if BRK)
102
                             reg(3) <= '0';                                           -- 0 -> D                                 
103
                             reg(2) <= '1';                                           -- 1 => I
104 4 Valerio63
                             reg(1 downto 0) <= reg(1 downto 0);
105
                             acr <= acr;
106 6 Valerio63
              when CLV_P  => reg <= reg and "10111111";                               -- 0 => V
107 4 Valerio63
                             acr <= acr;
108 6 Valerio63
              when AUC_P  => acr    <= acr_in;                                        -- store auxiliary carry (ACR)
109 4 Valerio63
                             reg    <= reg;
110 6 Valerio63
              when HAC_P  => acr    <= acr;                                           -- holds auxiliary carry (ACR)
111 4 Valerio63
                             reg    <= reg;
112
              when others => reg(7) <= reg(7);
113 6 Valerio63
                             reg(6) <= i_so;                                          -- set overflow by pin SO
114
                             reg(5 downto 0) <= reg(5 downto 0);
115 4 Valerio63
                             acr    <= '0';
116
            end case;
117
          end if;
118
        end if;
119
      end if;
120
  end process;
121
  dout <= reg;
122
  acr_out <= acr;
123
end rtl;
124
 
125
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.