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;
|