00001 ------------------------------------------------------------------------------ 00002 -- This file is a part of the LPP VHDL IP LIBRARY 00003 -- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS 00004 -- 00005 -- This program is free software; you can redistribute it and/or modify 00006 -- it under the terms of the GNU General Public License as published by 00007 -- the Free Software Foundation; either version 3 of the License, or 00008 -- (at your option) any later version. 00009 -- 00010 -- This program is distributed in the hope that it will be useful, 00011 -- but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 -- GNU General Public License for more details. 00014 -- 00015 -- You should have received a copy of the GNU General Public License 00016 -- along with this program; if not, write to the Free Software 00017 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00018 ------------------------------------------------------------------------------- 00019 -- Author : Alexis Jeandet 00020 -- Mail : alexis.jeandet@lpp.polytechnique.fr 00021 ---------------------------------------------------------------------------- 00022 library IEEE; 00023 use IEEE.numeric_std.all; 00024 use IEEE.std_logic_1164.all; 00025 library lpp; 00026 use lpp.general_purpose.all; 00027 --TODO 00028 --terminer le testbensh puis changer le resize dans les instanciations 00029 --par un resize sur un vecteur en combi 00030 00031 00032 00033 00034 00035 entity MAC is 00036 generic( 00037 Input_SZ_A : integer := 8; 00038 Input_SZ_B : integer := 8 00039 00040 ); 00041 port( 00042 clk : in std_logic; 00043 reset : in std_logic; 00044 clr_MAC : in std_logic; 00045 MAC_MUL_ADD : in std_logic_vector(1 downto 0); 00046 OP1 : in std_logic_vector(Input_SZ_A-1 downto 0); 00047 OP2 : in std_logic_vector(Input_SZ_B-1 downto 0); 00048 RES : out std_logic_vector(Input_SZ_A+Input_SZ_B-1 downto 0) 00049 ); 00050 end MAC; 00051 00052 00053 00054 00055 architecture ar_MAC of MAC is 00056 00057 00058 00059 00060 00061 signal add,mult : std_logic; 00062 signal MULTout : std_logic_vector(Input_SZ_A+Input_SZ_B-1 downto 0); 00063 00064 signal ADDERinA : std_logic_vector(Input_SZ_A+Input_SZ_B-1 downto 0); 00065 signal ADDERinB : std_logic_vector(Input_SZ_A+Input_SZ_B-1 downto 0); 00066 signal ADDERout : std_logic_vector(Input_SZ_A+Input_SZ_B-1 downto 0); 00067 00068 00069 signal MACMUXsel : std_logic; 00070 signal OP1_D_Resz : std_logic_vector(Input_SZ_A+Input_SZ_B-1 downto 0); 00071 signal OP2_D_Resz : std_logic_vector(Input_SZ_A+Input_SZ_B-1 downto 0); 00072 00073 00074 00075 signal MACMUX2sel : std_logic; 00076 00077 signal add_D : std_logic; 00078 signal OP1_D : std_logic_vector(Input_SZ_A-1 downto 0); 00079 signal OP2_D : std_logic_vector(Input_SZ_B-1 downto 0); 00080 signal MULTout_D : std_logic_vector(Input_SZ_A+Input_SZ_B-1 downto 0); 00081 signal MACMUXsel_D : std_logic; 00082 signal MACMUX2sel_D : std_logic; 00083 signal MACMUX2sel_D_D : std_logic; 00084 signal clr_MAC_D : std_logic; 00085 signal clr_MAC_D_D : std_logic; 00086 00087 00088 00089 00090 00091 begin 00092 00093 00094 00095 00096 --============================================================== 00097 --=============M A C C O N T R O L E R========================= 00098 --============================================================== 00099 MAC_CONTROLER1 : MAC_CONTROLER 00100 port map( 00101 ctrl => MAC_MUL_ADD , 00102 MULT => mult, 00103 ADD => add, 00104 MACMUX_sel => MACMUXsel, 00105 MACMUX2_sel => MACMUX2sel 00106 00107 ); 00108 --============================================================== 00109 00110 00111 00112 00113 --============================================================== 00114 --=============M U L T I P L I E R============================== 00115 --============================================================== 00116 Multiplieri_nst : Multiplier 00117 generic map( 00118 Input_SZ_A => Input_SZ_A , 00119 Input_SZ_B => Input_SZ_B 00120 ) 00121 port map( 00122 clk => clk, 00123 reset => reset, 00124 mult => mult, 00125 OP1 => OP1, 00126 OP2 => OP2, 00127 RES => MULTout 00128 ); 00129 00130 --============================================================== 00131 00132 00133 00134 00135 --============================================================== 00136 --======================A D D E R ============================== 00137 --============================================================== 00138 adder_inst : Adder 00139 generic map( 00140 Input_SZ_A => Input_SZ_A+Input_SZ_B , 00141 Input_SZ_B => Input_SZ_A+Input_SZ_B 00142 ) 00143 port map( 00144 clk => clk, 00145 reset => reset, 00146 clr => clr_MAC_D, 00147 add => add_D, 00148 OP1 => ADDERinA , 00149 OP2 => ADDERinB , 00150 RES => ADDERout 00151 ); 00152 00153 --============================================================== 00154 00155 00156 clr_MACREG1 : MAC_REG 00157 generic map(size => 1 ) 00158 port map( 00159 reset => reset , 00160 clk => clk, 00161 D(0) => clr_MAC, 00162 Q(0) => clr_MAC_D 00163 ); 00164 00165 clr_MACREG2 : MAC_REG 00166 generic map(size => 1 ) 00167 port map( 00168 reset => reset , 00169 clk => clk, 00170 D(0) => clr_MAC_D, 00171 Q(0) => clr_MAC_D_D 00172 ); 00173 00174 addREG : MAC_REG 00175 generic map(size => 1 ) 00176 port map( 00177 reset => reset , 00178 clk => clk, 00179 D(0) => add, 00180 Q(0) => add_D 00181 ); 00182 00183 OP1REG : MAC_REG 00184 generic map(size => Input_SZ_A) 00185 port map( 00186 reset => reset , 00187 clk => clk, 00188 D => OP1, 00189 Q => OP1_D 00190 ); 00191 00192 00193 OP2REG : MAC_REG 00194 generic map(size => Input_SZ_B) 00195 port map( 00196 reset => reset , 00197 clk => clk, 00198 D => OP2, 00199 Q => OP2_D 00200 ); 00201 00202 00203 MULToutREG : MAC_REG 00204 generic map(size => Input_SZ_A+Input_SZ_B ) 00205 port map( 00206 reset => reset , 00207 clk => clk, 00208 D => MULTout , 00209 Q => MULTout_D 00210 ); 00211 00212 00213 MACMUXselREG : MAC_REG 00214 generic map(size => 1 ) 00215 port map( 00216 reset => reset, 00217 clk => clk, 00218 D(0) => MACMUXsel, 00219 Q(0) => MACMUXsel_D 00220 ); 00221 00222 MACMUX2selREG : MAC_REG 00223 generic map(size => 1 ) 00224 port map( 00225 reset => reset , 00226 clk => clk, 00227 D(0) => MACMUX2sel, 00228 Q(0) => MACMUX2sel_D 00229 ); 00230 00231 MACMUX2selREG2 : MAC_REG 00232 generic map(size => 1 ) 00233 port map( 00234 reset => reset , 00235 clk => clk, 00236 D(0) => MACMUX2sel_D , 00237 Q(0) => MACMUX2sel_D_D 00238 ); 00239 00240 --============================================================== 00241 --======================M A C M U X =========================== 00242 --============================================================== 00243 MACMUX_inst : MAC_MUX 00244 generic map( 00245 Input_SZ_A => Input_SZ_A+Input_SZ_B , 00246 Input_SZ_B => Input_SZ_A+Input_SZ_B 00247 00248 ) 00249 port map( 00250 sel => MACMUXsel_D , 00251 INA1 => ADDERout , 00252 INA2 => OP2_D_Resz , 00253 INB1 => MULTout , 00254 INB2 => OP1_D_Resz , 00255 OUTA => ADDERinA , 00256 OUTB => ADDERinB 00257 ); 00258 OP1_D_Resz <= std_logic_vector(resize(signed(OP1_D),Input_SZ_A+Input_SZ_B)); 00259 OP2_D_Resz <= std_logic_vector(resize(signed(OP2_D),Input_SZ_A+Input_SZ_B)); 00260 --============================================================== 00261 00262 00263 --============================================================== 00264 --======================M A C M U X2 ========================== 00265 --============================================================== 00266 MAC_MUX2_inst : MAC_MUX2 00267 generic map(Input_SZ => Input_SZ_A+Input_SZ_B ) 00268 port map( 00269 sel => MACMUX2sel_D_D , 00270 RES2 => MULTout_D, 00271 RES1 => ADDERout , 00272 RES => RES 00273 ); 00274 00275 00276 --============================================================== 00277 00278 end ar_MAC;
© Copyright 2011 LPP-CNRS | Design by Alexis Jeandet