ALU.vhd


1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
use IEEE.NUMERIC_STD.ALL;
6
7
USE work.LCSE.all;
8
9
entity ALU is
10
    Port ( reset : in std_logic;
11
           clk : in std_logic;
12
           u_instruction : in alu_op;
13
           flagZ : out std_logic;
14
           flagC : out std_logic;
15
           flagN : out std_logic;
16
           flagE : out std_logic;
17
     index_reg : out std_logic_vector (7 downto 0);
18
           Databus : inout std_logic_vector(7 downto 0));
19
end ALU;
20
21
architecture Behavioral of ALU is
22
23
  signal A_reg, B_reg, ACC_reg, A_tmp, B_tmp, ACC_temp, Index_tmp, internal_bus,
24
    ALU_out: std_logic_vector (7 downto 0);
25
  signal Flags_tmp : std_logic_vector (3 downto 0);
26
  signal Out_enable : std_logic;
27
28
begin
29
30
  ALU_OP : process (reset, A_reg, B_reg, ACC_reg, u_instruction, Databus,
31
    internal_bus)
32
  begin
33
34
    ALU_Out <= (others => '0');
35
    ACC_Temp <= ALU_out;
36
    A_tmp <= Databus;
37
    B_tmp <= Databus;
38
    Flags_tmp <= "0001";
39
    out_enable <= '0';
40
    Index_tmp <= ACC_reg;
41
42
    CASE u_instruction is
43
44
      when op_lda =>
45
        A_tmp <= databus;
46
      
47
      when op_ldb =>
48
        B_tmp <= Databus;
49
50
      when op_add =>
51
        ALU_out <= (A_reg + B_reg);
52
        ACC_temp <= ALU_out;
53
        if (ALU_Out = "00000000") then
54
          Flags_tmp (0) <= '1';   -- Z = 1
55
        end if;
56
        if (( (A_reg(7) OR B_reg(7)) AND (NOT ALU_Out (7))) =  '1') then
57
          Flags_tmp (1) <= '1';   -- C = 1
58
        end if;
59
        if (( (A_reg(3) OR B_reg(3)) AND (NOT ALU_Out (3))) =  '1') then
60
          Flags_tmp (2) <= '1';   -- N = 1
61
        end if;
62
63
--------------------------------------------------------------------------
64
65
-- Noch mehr uinstrutions
66
67
--------------------------------------------------------------------------  
68
      
69
        
70
      when others => ALU_Out <= (others => '0'); 
71
72
    end CASE;
73
74
  end process ALU_OP;
75
76
  process (reset, clk)
77
  begin
78
79
    if(reset = '0') then
80
81
      A_reg <= (others => '0');
82
      B_reg <= (others => '0');
83
      ACC_reg <= (others => '0');
84
      Index_reg <= (others => '0');
85
      internal_bus <= (others => '0');
86
      Databus <= (others => 'Z');
87
  
88
    elsif (clk'event and clk ='1') then
89
90
      flagZ <= Flags_tmp (0);
91
      flagC <= Flags_tmp (1);
92
      flagN <= Flags_tmp (2);
93
      flagE <= Flags_tmp (3);
94
95
      if(out_enable = '1') then
96
        Databus <= ACC_reg;
97
      end if;
98
      
99
      A_reg <= A_tmp;
100
      B_reg <= B_tmp;
101
102
      ACC_reg <= ACC_Temp;
103
      Index_reg <= Index_tmp;
104
105
    end if;
106
107
  end process;
108
109
end Behavioral;