MAC_Unit.vhd


1
----------------------------------------------------------------------------------
2
-- Company: www.Circuit-Break.de
3
-- Engineer: Jens Weiss
4
-- 
5
-- Create Date:    10:49:11 02/27/2024 
6
-- Design Name: 
7
-- Module Name:    MAC_Unit - Behavioral 
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool versions: 
11
-- Description: 
12
--
13
-- Dependencies: 
14
--
15
-- Revision: 
16
-- Revision 0.01 - File Created
17
-- Additional Comments: 
18
--
19
----------------------------------------------------------------------------------
20
library IEEE;
21
use IEEE.STD_LOGIC_1164.ALL;
22
use IEEE.NUMERIC_STD.ALL;
23
24
25
entity MAC_Unit is
26
  Generic(  DATA_WIDTH : integer := 26;
27
        PARAMETER_WIDTH : integer := 16;
28
        SCALE_FACTOR : integer := 14;
29
        ACCU_WIDTH : integer := 43
30
        );
31
    Port (  clk : in  std_logic;
32
        MAC_preload : in  std_logic;
33
        MAC_exec : in std_logic;
34
        MAC_Load : in std_logic_vector(DATA_WIDTH-1 downto 0);
35
        MAC_Din_a : in  std_logic_vector(DATA_WIDTH-1 downto 0);
36
        MAC_Din_b : in std_logic_vector(PARAMETER_WIDTH-1 downto 0);
37
        MAC_Dout : out  std_logic_vector(DATA_WIDTH-1 downto 0));
38
           
39
end MAC_Unit;
40
41
architecture Behavioral of MAC_Unit is
42
signal MAC_Accu : signed(ACCU_WIDTH-1 downto 0);
43
44
begin
45
  process
46
  begin
47
    wait until rising_edge(clk);    
48
    if(MAC_preload = '1') then
49
      MAC_Accu <= resize(signed(MAC_Load), ACCU_WIDTH);
50
    else      
51
      if(MAC_exec = '1') then
52
        MAC_Accu <= (((signed(MAC_Din_a) * signed(MAC_Din_b)) / 2**SCALE_FACTOR)) + MAC_Accu;
53
      end if;
54
    end if;
55
  end process;
56
  
57
  MAC_DOUT <= std_logic_vector(resize(MAC_Accu, DATA_WIDTH));
58
  
59
end Behavioral;