@@ -19,76 +19,68 | |||
|
19 | 19 | -- Author : Alexis Jeandet |
|
20 | 20 | -- Mail : alexis.jeandet@lpp.polytechnique.fr |
|
21 | 21 | ---------------------------------------------------------------------------- |
|
22 | library IEEE; | |
|
23 |
|
|
|
24 |
|
|
|
25 | library lpp; | |
|
26 |
|
|
|
22 | LIBRARY IEEE; | |
|
23 | USE IEEE.numeric_std.ALL; | |
|
24 | USE IEEE.std_logic_1164.ALL; | |
|
25 | LIBRARY lpp; | |
|
26 | USE lpp.general_purpose.ALL; | |
|
27 | 27 | --TODO |
|
28 | 28 | --terminer le testbensh puis changer le resize dans les instanciations |
|
29 | 29 | --par un resize sur un vecteur en combi |
|
30 | 30 | |
|
31 | 31 | |
|
32 | ||
|
33 | ||
|
34 | ||
|
35 | entity MAC is | |
|
36 | generic( | |
|
37 | Input_SZ_A : integer := 8; | |
|
38 | Input_SZ_B : integer := 8 | |
|
32 | ENTITY MAC IS | |
|
33 | GENERIC( | |
|
34 | Input_SZ_A : INTEGER := 8; | |
|
35 | Input_SZ_B : INTEGER := 8 | |
|
39 | 36 | |
|
40 | ); | |
|
41 | port( | |
|
42 |
clk : |
|
|
43 |
reset : |
|
|
44 |
clr_MAC |
|
|
45 | MAC_MUL_ADD : in std_logic_vector(1 downto 0); | |
|
46 |
OP1 : |
|
|
47 |
OP2 : |
|
|
48 |
RES : |
|
|
49 | ); | |
|
50 |
|
|
|
51 | ||
|
52 | ||
|
53 | ||
|
54 | ||
|
55 | architecture ar_MAC of MAC is | |
|
56 | ||
|
37 | ); | |
|
38 | PORT( | |
|
39 | clk : IN STD_LOGIC; | |
|
40 | reset : IN STD_LOGIC; | |
|
41 | clr_MAC : IN STD_LOGIC; | |
|
42 | MAC_MUL_ADD : IN STD_LOGIC_VECTOR(1 DOWNTO 0); | |
|
43 | OP1 : IN STD_LOGIC_VECTOR(Input_SZ_A-1 DOWNTO 0); | |
|
44 | OP2 : IN STD_LOGIC_VECTOR(Input_SZ_B-1 DOWNTO 0); | |
|
45 | RES : OUT STD_LOGIC_VECTOR(Input_SZ_A+Input_SZ_B-1 DOWNTO 0) | |
|
46 | ); | |
|
47 | END MAC; | |
|
57 | 48 | |
|
58 | 49 | |
|
59 | 50 | |
|
60 | 51 | |
|
61 | signal add,mult : std_logic; | |
|
62 | signal MULTout : std_logic_vector(Input_SZ_A+Input_SZ_B-1 downto 0); | |
|
52 | ARCHITECTURE ar_MAC OF MAC IS | |
|
63 | 53 | |
|
64 | signal ADDERinA : std_logic_vector(Input_SZ_A+Input_SZ_B-1 downto 0); | |
|
65 | signal ADDERinB : std_logic_vector(Input_SZ_A+Input_SZ_B-1 downto 0); | |
|
66 | signal ADDERout : std_logic_vector(Input_SZ_A+Input_SZ_B-1 downto 0); | |
|
54 | SIGNAL add, mult : STD_LOGIC; | |
|
55 | SIGNAL MULTout : STD_LOGIC_VECTOR(Input_SZ_A+Input_SZ_B-1 DOWNTO 0); | |
|
56 | ||
|
57 | SIGNAL ADDERinA : STD_LOGIC_VECTOR(Input_SZ_A+Input_SZ_B-1 DOWNTO 0); | |
|
58 | SIGNAL ADDERinB : STD_LOGIC_VECTOR(Input_SZ_A+Input_SZ_B-1 DOWNTO 0); | |
|
59 | SIGNAL ADDERout : STD_LOGIC_VECTOR(Input_SZ_A+Input_SZ_B-1 DOWNTO 0); | |
|
67 | 60 | |
|
68 | 61 | |
|
69 | signal MACMUXsel : std_logic; | |
|
70 |
|
|
|
71 |
|
|
|
62 | SIGNAL MACMUXsel : STD_LOGIC; | |
|
63 | SIGNAL OP1_D_Resz : STD_LOGIC_VECTOR(Input_SZ_A+Input_SZ_B-1 DOWNTO 0); | |
|
64 | SIGNAL OP2_D_Resz : STD_LOGIC_VECTOR(Input_SZ_A+Input_SZ_B-1 DOWNTO 0); | |
|
72 | 65 | |
|
73 | 66 | |
|
74 | 67 | |
|
75 | signal MACMUX2sel : std_logic; | |
|
68 | SIGNAL MACMUX2sel : STD_LOGIC; | |
|
76 | 69 | |
|
77 | signal add_D : std_logic; | |
|
78 | signal OP1_D : std_logic_vector(Input_SZ_A-1 downto 0); | |
|
79 | signal OP2_D : std_logic_vector(Input_SZ_B-1 downto 0); | |
|
80 |
|
|
|
81 | signal MACMUXsel_D : std_logic; | |
|
82 | signal MACMUX2sel_D : std_logic; | |
|
83 | signal MACMUX2sel_D_D : std_logic; | |
|
84 | signal clr_MAC_D : std_logic; | |
|
85 | signal clr_MAC_D_D : std_logic; | |
|
70 | SIGNAL add_D : STD_LOGIC; | |
|
71 | SIGNAL OP1_D : STD_LOGIC_VECTOR(Input_SZ_A-1 DOWNTO 0); | |
|
72 | SIGNAL OP2_D : STD_LOGIC_VECTOR(Input_SZ_B-1 DOWNTO 0); | |
|
73 | SIGNAL MULTout_D : STD_LOGIC_VECTOR(Input_SZ_A+Input_SZ_B-1 DOWNTO 0); | |
|
74 | SIGNAL MACMUXsel_D : STD_LOGIC; | |
|
75 | SIGNAL MACMUX2sel_D : STD_LOGIC; | |
|
76 | SIGNAL MACMUX2sel_D_D : STD_LOGIC; | |
|
77 | SIGNAL clr_MAC_D : STD_LOGIC; | |
|
78 | SIGNAL clr_MAC_D_D : STD_LOGIC; | |
|
86 | 79 | |
|
87 | ||
|
88 | ||
|
80 | SIGNAL load_mult_result : STD_LOGIC; | |
|
81 | SIGNAL load_mult_result_D : STD_LOGIC; | |
|
89 | 82 | |
|
90 | ||
|
91 | begin | |
|
83 | BEGIN | |
|
92 | 84 | |
|
93 | 85 | |
|
94 | 86 | |
@@ -96,15 +88,16 begin | |||
|
96 | 88 | --============================================================== |
|
97 | 89 | --=============M A C C O N T R O L E R========================= |
|
98 | 90 | --============================================================== |
|
99 | MAC_CONTROLER1 : MAC_CONTROLER | |
|
100 | port map( | |
|
101 |
ctrl => |
|
|
102 |
MULT => |
|
|
103 |
ADD => |
|
|
104 | MACMUX_sel => MACMUXsel, | |
|
105 |
MACMUX |
|
|
91 | MAC_CONTROLER1 : MAC_CONTROLER | |
|
92 | PORT MAP( | |
|
93 | ctrl => MAC_MUL_ADD, | |
|
94 | MULT => mult, | |
|
95 | ADD => add, | |
|
96 | LOAD_ADDER => load_mult_result, | |
|
97 | MACMUX_sel => MACMUXsel, | |
|
98 | MACMUX2_sel => MACMUX2sel | |
|
106 | 99 | |
|
107 | ); | |
|
100 | ); | |
|
108 | 101 | --============================================================== |
|
109 | 102 | |
|
110 | 103 | |
@@ -113,166 +106,157 port map( | |||
|
113 | 106 | --============================================================== |
|
114 | 107 | --=============M U L T I P L I E R============================== |
|
115 | 108 | --============================================================== |
|
116 | Multiplieri_nst : Multiplier | |
|
117 | generic map( | |
|
118 |
Input_SZ_A |
|
|
119 |
Input_SZ_B |
|
|
120 | ) | |
|
121 | port map( | |
|
122 |
clk |
|
|
123 |
reset |
|
|
124 |
mult |
|
|
125 |
OP1 |
|
|
126 |
OP2 |
|
|
127 |
RES |
|
|
128 | ); | |
|
129 | ||
|
109 | Multiplieri_nst : Multiplier | |
|
110 | GENERIC MAP( | |
|
111 | Input_SZ_A => Input_SZ_A, | |
|
112 | Input_SZ_B => Input_SZ_B | |
|
113 | ) | |
|
114 | PORT MAP( | |
|
115 | clk => clk, | |
|
116 | reset => reset, | |
|
117 | mult => mult, | |
|
118 | OP1 => OP1, | |
|
119 | OP2 => OP2, | |
|
120 | RES => MULTout | |
|
121 | ); | |
|
130 | 122 | --============================================================== |
|
131 | 123 | |
|
132 | ||
|
133 | ||
|
134 | ||
|
124 | PROCESS (clk, reset) | |
|
125 | BEGIN -- PROCESS | |
|
126 | IF reset = '0' THEN -- asynchronous reset (active low) | |
|
127 | load_mult_result_D <= '0'; | |
|
128 | ELSIF clk'event AND clk = '1' THEN -- rising clock edge | |
|
129 | load_mult_result_D <= load_mult_result; | |
|
130 | END IF; | |
|
131 | END PROCESS; | |
|
132 | ||
|
135 | 133 | --============================================================== |
|
136 | 134 | --======================A D D E R ============================== |
|
137 | 135 | --============================================================== |
|
138 | adder_inst : Adder | |
|
139 | generic map( | |
|
140 |
Input_SZ_A |
|
|
141 |
Input_SZ_B |
|
|
142 | ) | |
|
143 | port map( | |
|
144 |
clk |
|
|
145 |
reset |
|
|
146 |
clr |
|
|
147 | add => add_D, | |
|
148 | OP1 => ADDERinA, | |
|
149 |
|
|
|
150 |
|
|
|
151 | ); | |
|
152 | ||
|
136 | adder_inst : Adder | |
|
137 | GENERIC MAP( | |
|
138 | Input_SZ_A => Input_SZ_A+Input_SZ_B, | |
|
139 | Input_SZ_B => Input_SZ_A+Input_SZ_B | |
|
140 | ) | |
|
141 | PORT MAP( | |
|
142 | clk => clk, | |
|
143 | reset => reset, | |
|
144 | clr => clr_MAC_D, | |
|
145 | load => load_mult_result_D, | |
|
146 | add => add_D, | |
|
147 | OP1 => ADDERinA, | |
|
148 | OP2 => ADDERinB, | |
|
149 | RES => ADDERout | |
|
150 | ); | |
|
153 | 151 | --============================================================== |
|
154 | 152 | |
|
155 | 153 | |
|
156 |
clr_MACREG1 : MAC_REG |
|
|
157 | generic map(size => 1) | |
|
158 | port map( | |
|
159 |
reset |
|
|
160 |
clk |
|
|
161 |
D(0) |
|
|
162 |
Q(0) |
|
|
163 | ); | |
|
154 | clr_MACREG1 : MAC_REG | |
|
155 | GENERIC MAP(size => 1) | |
|
156 | PORT MAP( | |
|
157 | reset => reset, | |
|
158 | clk => clk, | |
|
159 | D(0) => clr_MAC, | |
|
160 | Q(0) => clr_MAC_D | |
|
161 | ); | |
|
164 | 162 | |
|
165 |
|
|
|
166 | generic map(size => 1) | |
|
167 | port map( | |
|
168 |
reset |
|
|
169 |
clk |
|
|
170 |
D(0) |
|
|
171 |
Q(0) |
|
|
172 | ); | |
|
163 | addREG : MAC_REG | |
|
164 | GENERIC MAP(size => 1) | |
|
165 | PORT MAP( | |
|
166 | reset => reset, | |
|
167 | clk => clk, | |
|
168 | D(0) => add, | |
|
169 | Q(0) => add_D | |
|
170 | ); | |
|
173 | 171 | |
|
174 |
|
|
|
175 | generic map(size => 1) | |
|
176 | port map( | |
|
177 |
reset |
|
|
178 |
clk |
|
|
179 |
D |
|
|
180 |
Q |
|
|
181 | ); | |
|
172 | OP1REG : MAC_REG | |
|
173 | GENERIC MAP(size => Input_SZ_A) | |
|
174 | PORT MAP( | |
|
175 | reset => reset, | |
|
176 | clk => clk, | |
|
177 | D => OP1, | |
|
178 | Q => OP1_D | |
|
179 | ); | |
|
182 | 180 | |
|
183 |
|
|
|
184 | generic map(size => Input_SZ_A) | |
|
185 | port map( | |
|
186 |
reset |
|
|
187 |
clk |
|
|
188 |
D |
|
|
189 |
Q |
|
|
190 | ); | |
|
191 | ||
|
181 | OP2REG : MAC_REG | |
|
182 | GENERIC MAP(size => Input_SZ_B) | |
|
183 | PORT MAP( | |
|
184 | reset => reset, | |
|
185 | clk => clk, | |
|
186 | D => OP2, | |
|
187 | Q => OP2_D | |
|
188 | ); | |
|
192 | 189 | |
|
193 |
|
|
|
194 | generic map(size => Input_SZ_B) | |
|
195 | port map( | |
|
196 |
reset |
|
|
197 |
clk |
|
|
198 |
D |
|
|
199 |
Q |
|
|
200 | ); | |
|
201 | ||
|
190 | MULToutREG : MAC_REG | |
|
191 | GENERIC MAP(size => Input_SZ_A+Input_SZ_B) | |
|
192 | PORT MAP( | |
|
193 | reset => reset, | |
|
194 | clk => clk, | |
|
195 | D => MULTout, | |
|
196 | Q => MULTout_D | |
|
197 | ); | |
|
202 | 198 | |
|
203 |
|
|
|
204 | generic map(size => Input_SZ_A+Input_SZ_B) | |
|
205 | port map( | |
|
206 |
reset |
|
|
207 |
clk |
|
|
208 | D => MULTout, | |
|
209 | Q => MULTout_D | |
|
210 | ); | |
|
211 | ||
|
199 | MACMUXselREG : MAC_REG | |
|
200 | GENERIC MAP(size => 1) | |
|
201 | PORT MAP( | |
|
202 | reset => reset, | |
|
203 | clk => clk, | |
|
204 | D(0) => MACMUXsel, | |
|
205 | Q(0) => MACMUXsel_D | |
|
206 | ); | |
|
212 | 207 | |
|
213 |
MACMUXselREG : MAC_REG |
|
|
214 | generic map(size => 1) | |
|
215 | port map( | |
|
216 |
reset |
|
|
217 |
clk |
|
|
218 |
D(0) |
|
|
219 |
Q(0) |
|
|
220 | ); | |
|
208 | MACMUX2selREG : MAC_REG | |
|
209 | GENERIC MAP(size => 1) | |
|
210 | PORT MAP( | |
|
211 | reset => reset, | |
|
212 | clk => clk, | |
|
213 | D(0) => MACMUX2sel, | |
|
214 | Q(0) => MACMUX2sel_D | |
|
215 | ); | |
|
221 | 216 | |
|
222 |
MACMUX2selREG : MAC_REG |
|
|
223 | generic map(size => 1) | |
|
224 | port map( | |
|
225 |
reset |
|
|
226 |
clk |
|
|
227 |
D(0) |
|
|
228 |
Q(0) |
|
|
229 | ); | |
|
230 | ||
|
231 | MACMUX2selREG2 : MAC_REG | |
|
232 | generic map(size => 1) | |
|
233 | port map( | |
|
234 | reset => reset, | |
|
235 | clk => clk, | |
|
236 | D(0) => MACMUX2sel_D, | |
|
237 | Q(0) => MACMUX2sel_D_D | |
|
238 | ); | |
|
217 | MACMUX2selREG2 : MAC_REG | |
|
218 | GENERIC MAP(size => 1) | |
|
219 | PORT MAP( | |
|
220 | reset => reset, | |
|
221 | clk => clk, | |
|
222 | D(0) => MACMUX2sel_D, | |
|
223 | Q(0) => MACMUX2sel_D_D | |
|
224 | ); | |
|
239 | 225 | |
|
240 | 226 | --============================================================== |
|
241 | 227 | --======================M A C M U X =========================== |
|
242 | 228 | --============================================================== |
|
243 |
MACMUX_inst : MAC_MUX |
|
|
244 | generic map( | |
|
245 |
Input_SZ_A |
|
|
246 |
Input_SZ_B |
|
|
229 | MACMUX_inst : MAC_MUX | |
|
230 | GENERIC MAP( | |
|
231 | Input_SZ_A => Input_SZ_A+Input_SZ_B, | |
|
232 | Input_SZ_B => Input_SZ_A+Input_SZ_B | |
|
247 | 233 | |
|
248 | ) | |
|
249 | port map( | |
|
250 |
sel |
|
|
251 |
INA1 |
|
|
252 |
INA2 |
|
|
253 |
INB1 |
|
|
254 |
INB2 |
|
|
255 |
OUTA |
|
|
256 |
OUTB |
|
|
257 | ); | |
|
258 |
OP1_D_Resz |
|
|
259 |
OP2_D_Resz |
|
|
234 | ) | |
|
235 | PORT MAP( | |
|
236 | sel => MACMUXsel_D, | |
|
237 | INA1 => ADDERout, | |
|
238 | INA2 => OP2_D_Resz, | |
|
239 | INB1 => MULTout, | |
|
240 | INB2 => OP1_D_Resz, | |
|
241 | OUTA => ADDERinA, | |
|
242 | OUTB => ADDERinB | |
|
243 | ); | |
|
244 | OP1_D_Resz <= STD_LOGIC_VECTOR(resize(SIGNED(OP1_D), Input_SZ_A+Input_SZ_B)); | |
|
245 | OP2_D_Resz <= STD_LOGIC_VECTOR(resize(SIGNED(OP2_D), Input_SZ_A+Input_SZ_B)); | |
|
260 | 246 | --============================================================== |
|
261 | 247 | |
|
262 | 248 | |
|
263 | 249 | --============================================================== |
|
264 | 250 | --======================M A C M U X2 ========================== |
|
265 | 251 | --============================================================== |
|
266 |
MAC_MUX2_inst |
|
|
267 |
|
|
|
268 | port map( | |
|
269 |
sel |
|
|
270 |
RES2 |
|
|
271 |
RES1 |
|
|
272 |
RES |
|
|
273 | ); | |
|
274 | ||
|
275 | ||
|
252 | MAC_MUX2_inst : MAC_MUX2 | |
|
253 | GENERIC MAP(Input_SZ => Input_SZ_A+Input_SZ_B) | |
|
254 | PORT MAP( | |
|
255 | sel => MACMUX2sel_D_D, | |
|
256 | RES2 => MULTout_D, | |
|
257 | RES1 => ADDERout, | |
|
258 | RES => RES | |
|
259 | ); | |
|
276 | 260 | --============================================================== |
|
277 | 261 | |
|
278 |
|
|
|
262 | END ar_MAC; |
@@ -34,6 +34,7 port( | |||
|
34 | 34 | ctrl : in std_logic_vector(1 downto 0); |
|
35 | 35 | MULT : out std_logic; |
|
36 | 36 | ADD : out std_logic; |
|
37 | LOAD_ADDER : out std_logic; | |
|
37 | 38 | MACMUX_sel : out std_logic; |
|
38 | 39 | MACMUX2_sel : out std_logic |
|
39 | 40 | |
@@ -52,8 +53,12 begin | |||
|
52 | 53 | |
|
53 | 54 | MULT <= '0' when (ctrl = "00" or ctrl = "11") else '1'; |
|
54 | 55 | ADD <= '0' when (ctrl = "00" or ctrl = "10") else '1'; |
|
55 | MACMUX_sel <= '0' when (ctrl = "00" or ctrl = "01") else '1'; | |
|
56 | MACMUX2_sel <= '0' when (ctrl = "00" or ctrl = "01"or ctrl = "11") else '1'; | |
|
56 | LOAD_ADDER <= '1' when (ctrl = "10") else '0'; -- PATCH JC : mem mult result | |
|
57 | -- to permit to compute a | |
|
58 | -- MULT follow by a MAC | |
|
59 | --MACMUX_sel <= '0' when (ctrl = "00" or ctrl = "01") else '1'; | |
|
60 | MACMUX_sel <= '0' when (ctrl = "00" or ctrl = "01" OR ctrl = "10") else '1'; | |
|
61 | MACMUX2_sel <= '0' when (ctrl = "00" or ctrl = "01" or ctrl = "11") else '1'; | |
|
57 | 62 | |
|
58 | 63 | |
|
59 | 64 | end ar_MAC_CONTROLER; |
General Comments 0
You need to be logged in to leave comments.
Login now