OpenCores
URL https://opencores.org/ocsvn/avr_hp/avr_hp/trunk

Subversion Repositories avr_hp

[/] [avr_hp/] [trunk/] [rtl/] [rtl_s3_cm4/] [alu_avr.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 tobil
--************************************************************************************************
2
--  ALU(internal module) for AVR core
3
--      Version 1.2
4
--  Designed by Ruslan Lepetenok 
5
--      Modified 02.08.2003 
6
-- (CPC/SBC/SBCI Z-flag bug found)
7
--  H-flag with NEG instruction found
8
--************************************************************************************************
9
 
10
library IEEE;
11
use IEEE.std_logic_1164.all;
12
 
13
 
14
entity alu_avr_cm4 is port(
15
                cp2_cml_1 : in std_logic;
16
                cp2_cml_2 : in std_logic;
17
                cp2_cml_3 : in std_logic;
18
 
19
 
20
              alu_data_r_in   : in std_logic_vector(7 downto 0);
21
              alu_data_d_in   : in std_logic_vector(7 downto 0);
22
 
23
              alu_c_flag_in   : in std_logic;
24
              alu_z_flag_in   : in std_logic;
25
 
26
 
27
-- OPERATION SIGNALS INPUTS
28
              idc_add         :in std_logic;
29
              idc_adc         :in std_logic;
30
              idc_adiw        :in std_logic;
31
              idc_sub         :in std_logic;
32
              idc_subi        :in std_logic;
33
              idc_sbc         :in std_logic;
34
              idc_sbci        :in std_logic;
35
              idc_sbiw        :in std_logic;
36
 
37
              adiw_st         : in std_logic;
38
              sbiw_st         : in std_logic;
39
 
40
              idc_and         :in std_logic;
41
              idc_andi        :in std_logic;
42
              idc_or          :in std_logic;
43
              idc_ori         :in std_logic;
44
              idc_eor         :in std_logic;
45
              idc_com         :in std_logic;
46
              idc_neg         :in std_logic;
47
 
48
              idc_inc         :in std_logic;
49
              idc_dec         :in std_logic;
50
 
51
              idc_cp          :in std_logic;
52
              idc_cpc         :in std_logic;
53
              idc_cpi         :in std_logic;
54
              idc_cpse        :in std_logic;
55
 
56
              idc_lsr         :in std_logic;
57
              idc_ror         :in std_logic;
58
              idc_asr         :in std_logic;
59
              idc_swap        :in std_logic;
60
 
61
 
62
-- DATA OUTPUT
63
              alu_data_out    : out std_logic_vector(7 downto 0);
64
 
65
-- FLAGS OUTPUT
66
              alu_c_flag_out  : out std_logic;
67
              alu_z_flag_out  : out std_logic;
68
              alu_n_flag_out  : out std_logic;
69
              alu_v_flag_out  : out std_logic;
70
              alu_s_flag_out  : out std_logic;
71
              alu_h_flag_out  : out std_logic
72
);
73
 
74
end alu_avr_cm4;
75
 
76
architecture rtl of alu_avr_cm4 is
77
 
78
-- ####################################################
79
-- INTERNAL SIGNALS
80
-- ####################################################
81
 
82
signal alu_data_out_int             : std_logic_vector (7 downto 0);
83
 
84
-- ALU FLAGS (INTERNAL)
85
signal alu_z_flag_out_int       : std_logic;
86
signal alu_c_flag_in_int        : std_logic;            -- INTERNAL CARRY FLAG
87
 
88
signal alu_n_flag_out_int       : std_logic;
89
signal alu_v_flag_out_int       : std_logic;
90
signal alu_c_flag_out_int       : std_logic;
91
 
92
-- ADDER SIGNALS --
93
signal adder_nadd_sub : std_logic;        -- 0 -> ADD ,1 -> SUB
94
signal adder_v_flag_out : std_logic;
95
 
96
signal adder_carry : std_logic_vector(8 downto 0);
97
signal adder_d_in  : std_logic_vector(8 downto 0);
98
signal adder_r_in  : std_logic_vector(8 downto 0);
99
signal adder_out   : std_logic_vector(8 downto 0);
100
 
101
-- NEG OPERATOR SIGNALS 
102
signal neg_op_in    : std_logic_vector(7 downto 0);
103
signal neg_op_carry : std_logic_vector(8 downto 0);
104
signal neg_op_out   : std_logic_vector(8 downto 0);
105
 
106
-- INC, DEC OPERATOR SIGNALS 
107
signal incdec_op_in    : std_logic_vector (7 downto 0);
108
signal incdec_op_carry : std_logic_vector(7 downto 0);
109
signal incdec_op_out   : std_logic_vector(7 downto 0);
110
 
111
 
112
signal com_op_out : std_logic_vector(7 downto 0);
113
signal and_op_out : std_logic_vector(7 downto 0);
114
signal or_op_out : std_logic_vector(7 downto 0);
115
signal eor_op_out : std_logic_vector(7 downto 0);
116
 
117
-- SHIFT SIGNALS
118
signal right_shift_out : std_logic_vector(7 downto 0);
119
 
120
-- SWAP SIGNALS
121
signal swap_out : std_logic_vector(7 downto 0);
122
 
123
signal alu_data_r_in_cml_2 :  std_logic_vector ( 7 downto 0 );
124
signal alu_data_d_in_cml_3 :  std_logic_vector ( 7 downto 0 );
125
signal alu_data_d_in_cml_2 :  std_logic_vector ( 7 downto 0 );
126
signal alu_h_flag_out_cml_out :  std_logic;
127
signal idc_add_cml_3 :  std_logic;
128
signal idc_adc_cml_3 :  std_logic;
129
signal idc_adc_cml_2 :  std_logic;
130
signal idc_adc_cml_1 :  std_logic;
131
signal idc_sub_cml_3 :  std_logic;
132
signal idc_sub_cml_2 :  std_logic;
133
signal idc_sub_cml_1 :  std_logic;
134
signal idc_subi_cml_3 :  std_logic;
135
signal idc_subi_cml_2 :  std_logic;
136
signal idc_subi_cml_1 :  std_logic;
137
signal alu_z_flag_out_cml_out :  std_logic;
138
signal idc_sbc_cml_3 :  std_logic;
139
signal idc_sbc_cml_2 :  std_logic;
140
signal idc_sbc_cml_1 :  std_logic;
141
signal idc_sbci_cml_3 :  std_logic;
142
signal idc_sbci_cml_2 :  std_logic;
143
signal idc_sbci_cml_1 :  std_logic;
144
signal idc_sbiw_cml_2 :  std_logic;
145
signal idc_sbiw_cml_1 :  std_logic;
146
signal adiw_st_cml_3 :  std_logic;
147
signal adiw_st_cml_2 :  std_logic;
148
signal adiw_st_cml_1 :  std_logic;
149
signal sbiw_st_cml_3 :  std_logic;
150
signal sbiw_st_cml_2 :  std_logic;
151
signal sbiw_st_cml_1 :  std_logic;
152
signal idc_neg_cml_3 :  std_logic;
153
signal idc_inc_cml_3 :  std_logic;
154
signal idc_dec_cml_3 :  std_logic;
155
signal idc_dec_cml_2 :  std_logic;
156
signal idc_cp_cml_3 :  std_logic;
157
signal idc_cp_cml_2 :  std_logic;
158
signal idc_cp_cml_1 :  std_logic;
159
signal idc_cpc_cml_3 :  std_logic;
160
signal idc_cpc_cml_2 :  std_logic;
161
signal idc_cpc_cml_1 :  std_logic;
162
signal idc_cpi_cml_3 :  std_logic;
163
signal idc_cpi_cml_2 :  std_logic;
164
signal idc_cpi_cml_1 :  std_logic;
165
signal idc_cpse_cml_2 :  std_logic;
166
signal idc_cpse_cml_1 :  std_logic;
167
signal idc_lsr_cml_3 :  std_logic;
168
signal idc_ror_cml_3 :  std_logic;
169
signal idc_ror_cml_2 :  std_logic;
170
signal idc_ror_cml_1 :  std_logic;
171
signal idc_asr_cml_3 :  std_logic;
172
signal alu_data_out_cml_out :  std_logic_vector ( 7 downto 0 );
173
signal alu_data_out_int_cml_3 :  std_logic_vector ( 7 downto 0 );
174
signal alu_z_flag_out_int_cml_3 :  std_logic;
175
signal alu_c_flag_in_int_cml_2 :  std_logic;
176
signal alu_c_flag_in_int_cml_1 :  std_logic;
177
signal alu_c_flag_out_cml_out :  std_logic;
178
signal alu_c_flag_out_int_cml_3 :  std_logic;
179
signal adder_nadd_sub_cml_3 :  std_logic;
180
signal adder_nadd_sub_cml_2 :  std_logic;
181
signal adder_nadd_sub_cml_1 :  std_logic;
182
signal adder_carry_cml_3 :  std_logic_vector ( 8 downto 0 );
183
signal adder_d_in_cml_3 :  std_logic_vector ( 8 downto 0 );
184
signal adder_d_in_cml_2 :  std_logic_vector ( 8 downto 0 );
185
signal adder_r_in_cml_3 :  std_logic_vector ( 8 downto 0 );
186
signal adder_r_in_cml_2 :  std_logic_vector ( 8 downto 0 );
187
signal adder_out_cml_3 :  std_logic_vector ( 8 downto 0 );
188
signal neg_op_carry_cml_3 :  std_logic_vector ( 8 downto 0 );
189
signal incdec_op_carry_cml_3 :  std_logic_vector ( 7 downto 0 );
190
 
191
begin
192
 
193
 
194
 
195
process(cp2_cml_1) begin
196
if (cp2_cml_1 = '1' and cp2_cml_1'event) then
197
        idc_adc_cml_1 <= idc_adc;
198
        idc_sub_cml_1 <= idc_sub;
199
        idc_subi_cml_1 <= idc_subi;
200
        idc_sbc_cml_1 <= idc_sbc;
201
        idc_sbci_cml_1 <= idc_sbci;
202
        idc_sbiw_cml_1 <= idc_sbiw;
203
        adiw_st_cml_1 <= adiw_st;
204
        sbiw_st_cml_1 <= sbiw_st;
205
        idc_cp_cml_1 <= idc_cp;
206
        idc_cpc_cml_1 <= idc_cpc;
207
        idc_cpi_cml_1 <= idc_cpi;
208
        idc_cpse_cml_1 <= idc_cpse;
209
        idc_ror_cml_1 <= idc_ror;
210
        alu_c_flag_in_int_cml_1 <= alu_c_flag_in_int;
211
        adder_nadd_sub_cml_1 <= adder_nadd_sub;
212
end if;
213
end process;
214
 
215
process(cp2_cml_2) begin
216
if (cp2_cml_2 = '1' and cp2_cml_2'event) then
217
        alu_data_r_in_cml_2 <= alu_data_r_in;
218
        alu_data_d_in_cml_2 <= alu_data_d_in;
219
        idc_adc_cml_2 <= idc_adc_cml_1;
220
        idc_sub_cml_2 <= idc_sub_cml_1;
221
        idc_subi_cml_2 <= idc_subi_cml_1;
222
        idc_sbc_cml_2 <= idc_sbc_cml_1;
223
        idc_sbci_cml_2 <= idc_sbci_cml_1;
224
        idc_sbiw_cml_2 <= idc_sbiw_cml_1;
225
        adiw_st_cml_2 <= adiw_st_cml_1;
226
        sbiw_st_cml_2 <= sbiw_st_cml_1;
227
        idc_dec_cml_2 <= idc_dec;
228
        idc_cp_cml_2 <= idc_cp_cml_1;
229
        idc_cpc_cml_2 <= idc_cpc_cml_1;
230
        idc_cpi_cml_2 <= idc_cpi_cml_1;
231
        idc_cpse_cml_2 <= idc_cpse_cml_1;
232
        idc_ror_cml_2 <= idc_ror_cml_1;
233
        alu_c_flag_in_int_cml_2 <= alu_c_flag_in_int_cml_1;
234
        adder_nadd_sub_cml_2 <= adder_nadd_sub_cml_1;
235
        adder_d_in_cml_2 <= adder_d_in;
236
        adder_r_in_cml_2 <= adder_r_in;
237
end if;
238
end process;
239
 
240
process(cp2_cml_3) begin
241
if (cp2_cml_3 = '1' and cp2_cml_3'event) then
242
        alu_data_d_in_cml_3 <= alu_data_d_in_cml_2;
243
        idc_add_cml_3 <= idc_add;
244
        idc_adc_cml_3 <= idc_adc_cml_2;
245
        idc_sub_cml_3 <= idc_sub_cml_2;
246
        idc_subi_cml_3 <= idc_subi_cml_2;
247
        idc_sbc_cml_3 <= idc_sbc_cml_2;
248
        idc_sbci_cml_3 <= idc_sbci_cml_2;
249
        adiw_st_cml_3 <= adiw_st_cml_2;
250
        sbiw_st_cml_3 <= sbiw_st_cml_2;
251
        idc_neg_cml_3 <= idc_neg;
252
        idc_inc_cml_3 <= idc_inc;
253
        idc_dec_cml_3 <= idc_dec_cml_2;
254
        idc_cp_cml_3 <= idc_cp_cml_2;
255
        idc_cpc_cml_3 <= idc_cpc_cml_2;
256
        idc_cpi_cml_3 <= idc_cpi_cml_2;
257
        idc_lsr_cml_3 <= idc_lsr;
258
        idc_ror_cml_3 <= idc_ror_cml_2;
259
        idc_asr_cml_3 <= idc_asr;
260
        alu_data_out_int_cml_3 <= alu_data_out_int;
261
        alu_z_flag_out_int_cml_3 <= alu_z_flag_out_int;
262
        alu_c_flag_out_int_cml_3 <= alu_c_flag_out_int;
263
        adder_nadd_sub_cml_3 <= adder_nadd_sub_cml_2;
264
        adder_carry_cml_3 <= adder_carry;
265
        adder_d_in_cml_3 <= adder_d_in_cml_2;
266
        adder_r_in_cml_3 <= adder_r_in_cml_2;
267
        adder_out_cml_3 <= adder_out;
268
        neg_op_carry_cml_3 <= neg_op_carry;
269
        incdec_op_carry_cml_3 <= incdec_op_carry;
270
end if;
271
end process;
272
alu_h_flag_out <= alu_h_flag_out_cml_out;
273
alu_z_flag_out <= alu_z_flag_out_cml_out;
274
alu_data_out <= alu_data_out_cml_out;
275
alu_c_flag_out <= alu_c_flag_out_cml_out;
276
 
277
 
278
 
279
-- ########################################################################
280
-- ###############              ALU
281
-- ########################################################################
282
 
283
adder_nadd_sub <=(idc_sub or idc_subi or idc_sbc or idc_sbci or idc_sbiw or sbiw_st or
284
                  idc_cp or idc_cpc or idc_cpi or idc_cpse ); -- '0' -> '+'; '1' -> '-' 
285
 
286
-- SREG C FLAG (ALU INPUT)
287
alu_c_flag_in_int <= alu_c_flag_in and
288
(idc_adc or adiw_st or idc_sbc or idc_sbci or sbiw_st or
289
idc_cpc or
290
idc_ror);
291
 
292
-- SynEDA CoreMultiplier
293
-- assignment(s): alu_z_flag_out
294
-- replace(s): idc_sbc, idc_sbci, adiw_st, sbiw_st, idc_cpc, alu_z_flag_out_int
295
 
296
-- SREG Z FLAG ()
297
-- alu_z_flag_out <= (alu_z_flag_out_int and not(adiw_st or sbiw_st)) or 
298
--                   ((alu_z_flag_in and alu_z_flag_out_int) and (adiw_st or sbiw_st));
299
alu_z_flag_out_cml_out <= (alu_z_flag_out_int_cml_3 and not(adiw_st_cml_3 or sbiw_st_cml_3 or idc_cpc_cml_3 or idc_sbc_cml_3 or idc_sbci_cml_3)) or
300
                  ((alu_z_flag_in and alu_z_flag_out_int_cml_3) and (adiw_st_cml_3 or sbiw_st_cml_3))or
301
                                  (alu_z_flag_in and alu_z_flag_out_int_cml_3 and(idc_cpc_cml_3 or idc_sbc_cml_3 or idc_sbci_cml_3));   -- Previous value (for CPC/SBC/SBCI instructions)
302
 
303
-- SREG N FLAG
304
alu_n_flag_out <= alu_n_flag_out_int;
305
 
306
-- SREG V FLAG
307
alu_v_flag_out <= alu_v_flag_out_int;
308
 
309
 
310
-- SynEDA CoreMultiplier
311
-- assignment(s): alu_c_flag_out
312
-- replace(s): alu_c_flag_out_int
313
 
314
alu_c_flag_out_cml_out <= alu_c_flag_out_int_cml_3;
315
 
316
-- SynEDA CoreMultiplier
317
-- assignment(s): alu_data_out
318
-- replace(s): alu_data_out_int
319
 
320
alu_data_out_cml_out <= alu_data_out_int_cml_3;
321
 
322
-- #########################################################################################
323
 
324
adder_d_in <= '0'&alu_data_d_in;
325
adder_r_in <= '0'&alu_data_r_in;
326
 
327
--########################## ADDEER ###################################
328
 
329
adder_out(0) <= adder_d_in_cml_2(0) xor adder_r_in_cml_2(0) xor alu_c_flag_in_int_cml_2;
330
 
331
summator:for i in 1 to 8 generate
332
-- SynEDA CoreMultiplier
333
-- assignment(s): adder_out
334
-- replace(s): alu_c_flag_in_int, adder_d_in, adder_r_in
335
 
336
adder_out(i) <= adder_d_in_cml_2(i) xor adder_r_in_cml_2(i) xor adder_carry(i-1);
337
end generate;
338
 
339
 
340
adder_carry(0) <= ((adder_d_in_cml_2(0) xor adder_nadd_sub_cml_2) and adder_r_in_cml_2(0)) or
341
                (((adder_d_in_cml_2(0) xor adder_nadd_sub_cml_2) or adder_r_in_cml_2(0)) and alu_c_flag_in_int_cml_2);
342
 
343
summator2:for i in 1 to 8 generate
344
-- SynEDA CoreMultiplier
345
-- assignment(s): adder_carry
346
-- replace(s): alu_c_flag_in_int, adder_nadd_sub, adder_d_in, adder_r_in
347
 
348
adder_carry(i) <= ((adder_d_in_cml_2(i) xor adder_nadd_sub_cml_2) and adder_r_in_cml_2(i)) or
349
                (((adder_d_in_cml_2(i) xor adder_nadd_sub_cml_2) or adder_r_in_cml_2(i)) and adder_carry(i-1));
350
end generate;
351
 
352
-- FLAGS  FOR ADDER INSTRUCTIONS: 
353
-- CARRY FLAG (C) -> adder_out(8)
354
-- HALF CARRY FLAG (H) -> adder_carry(3)
355
-- TOW'S COMPLEMENT OVERFLOW  (V) -> 
356
 
357
-- SynEDA CoreMultiplier
358
-- assignment(s): adder_v_flag_out
359
-- replace(s): adder_nadd_sub, adder_d_in, adder_r_in, adder_out
360
 
361
adder_v_flag_out <= (((adder_d_in_cml_3(7) and adder_r_in_cml_3(7) and not adder_out_cml_3(7)) or
362
                    (not adder_d_in_cml_3(7) and not adder_r_in_cml_3(7) and adder_out_cml_3(7))) and not adder_nadd_sub_cml_3) or -- ADD
363
                    (((adder_d_in_cml_3(7) and not adder_r_in_cml_3(7) and not adder_out_cml_3(7)) or
364
                                        (not adder_d_in_cml_3(7) and adder_r_in_cml_3(7) and adder_out_cml_3(7))) and adder_nadd_sub_cml_3);
365
                                                                                                                                                                                                                   -- SUB
366
--#####################################################################
367
 
368
 
369
-- LOGICAL OPERATIONS FOR ONE OPERAND
370
 
371
--########################## NEG OPERATION ####################
372
 
373
neg_op_out(0)   <= not alu_data_d_in_cml_2(0) xor '1';
374
neg_op:for i in 1 to 7 generate
375
neg_op_out(i)   <= not alu_data_d_in_cml_2(i) xor neg_op_carry(i-1);
376
end generate;
377
-- SynEDA CoreMultiplier
378
-- assignment(s): neg_op_out
379
-- replace(s): alu_data_d_in
380
 
381
neg_op_out(8) <= neg_op_carry(7) xor '1';
382
 
383
 
384
neg_op_carry(0) <= not alu_data_d_in_cml_2(0) and '1';
385
neg_op2:for i in 1 to 7 generate
386
neg_op_carry(i) <= not alu_data_d_in_cml_2(i) and neg_op_carry(i-1);
387
end generate;
388
-- SynEDA CoreMultiplier
389
-- assignment(s): neg_op_carry
390
-- replace(s): alu_data_d_in
391
 
392
neg_op_carry(8) <= neg_op_carry(7);                            -- ??!!
393
 
394
 
395
-- CARRY FLAGS  FOR NEG INSTRUCTION: 
396
-- CARRY FLAG -> neg_op_out(8)
397
-- HALF CARRY FLAG -> neg_op_carry(3)
398
-- TOW's COMPLEMENT OVERFLOW FLAG -> alu_data_d_in(7) and neg_op_carry(6) 
399
--############################################################################  
400
 
401
 
402
--########################## INC, DEC OPERATIONS ####################
403
 
404
incdec_op_out(0)      <=  alu_data_d_in_cml_2(0) xor '1';
405
inc_dec:for i in 1 to 7 generate
406
-- SynEDA CoreMultiplier
407
-- assignment(s): incdec_op_out
408
-- replace(s): alu_data_d_in
409
 
410
incdec_op_out(i)   <= alu_data_d_in_cml_2(i) xor incdec_op_carry(i-1);
411
end generate;
412
 
413
 
414
incdec_op_carry(0)    <=  alu_data_d_in_cml_2(0) xor idc_dec_cml_2;
415
inc_dec2:for i in 1 to 7 generate
416
-- SynEDA CoreMultiplier
417
-- assignment(s): incdec_op_carry
418
-- replace(s): alu_data_d_in, idc_dec
419
 
420
incdec_op_carry(i) <= (alu_data_d_in_cml_2(i) xor idc_dec_cml_2) and incdec_op_carry(i-1);
421
end generate;
422
 
423
-- TOW's COMPLEMENT OVERFLOW FLAG -> (alu_data_d_in(7) xor idc_dec) and incdec_op_carry(6) 
424
--####################################################################
425
 
426
 
427
-- SynEDA CoreMultiplier
428
-- assignment(s): com_op_out
429
-- replace(s): alu_data_d_in
430
 
431
--########################## COM OPERATION ###################################
432
com_op_out <= not alu_data_d_in_cml_2;
433
-- FLAGS 
434
-- TOW's COMPLEMENT OVERFLOW FLAG (V)  -> '0'
435
-- CARRY FLAG (C) -> '1' 
436
--############################################################################
437
 
438
-- LOGICAL OPERATIONS FOR TWO OPERANDS  
439
 
440
-- SynEDA CoreMultiplier
441
-- assignment(s): and_op_out
442
-- replace(s): alu_data_r_in, alu_data_d_in
443
 
444
--########################## AND OPERATION ###################################
445
and_op_out <= alu_data_d_in_cml_2 and alu_data_r_in_cml_2;
446
-- FLAGS 
447
-- TOW's COMPLEMENT OVERFLOW FLAG (V)  -> '0'
448
--############################################################################
449
 
450
-- SynEDA CoreMultiplier
451
-- assignment(s): or_op_out
452
-- replace(s): alu_data_r_in, alu_data_d_in
453
 
454
--########################## OR OPERATION ###################################
455
or_op_out <= alu_data_d_in_cml_2 or alu_data_r_in_cml_2;
456
-- FLAGS 
457
-- TOW's COMPLEMENT OVERFLOW FLAG (V)  -> '0'
458
--############################################################################
459
 
460
-- SynEDA CoreMultiplier
461
-- assignment(s): eor_op_out
462
-- replace(s): alu_data_r_in, alu_data_d_in
463
 
464
--########################## EOR OPERATION ###################################
465
eor_op_out <= alu_data_d_in_cml_2 xor alu_data_r_in_cml_2;
466
-- FLAGS 
467
-- TOW's COMPLEMENT OVERFLOW FLAG (V)  -> '0'
468
--############################################################################
469
 
470
-- SHIFT OPERATIONS 
471
 
472
-- ########################## RIGHT(LSR, ROR, ASR) #######################
473
 
474
right_shift_out(7) <= (idc_ror_cml_2 and alu_c_flag_in_int_cml_2) or (idc_asr and alu_data_d_in_cml_2(7)); -- right_shift_out(7)
475
shift_right:for i in 6 downto 0 generate
476
-- SynEDA CoreMultiplier
477
-- assignment(s): right_shift_out
478
-- replace(s): alu_data_d_in, idc_ror, alu_c_flag_in_int
479
 
480
right_shift_out(i) <= alu_data_d_in_cml_2(i+1);
481
end generate;
482
 
483
-- FLAGS 
484
-- CARRY FLAG (C)                      -> alu_data_d_in(0) 
485
-- NEGATIVE FLAG (N)                   -> right_shift_out(7)
486
-- TOW's COMPLEMENT OVERFLOW FLAG (V)  -> N xor C  (left_shift_out(7) xor alu_data_d_in(0))
487
 
488
-- #######################################################################
489
 
490
 
491
-- ################################## SWAP ###############################
492
 
493
swap_h:for i in 7 downto 4 generate
494
swap_out(i) <= alu_data_d_in_cml_2(i-4);
495
end generate;
496
swap_l:for i in 3 downto 0 generate
497
-- SynEDA CoreMultiplier
498
-- assignment(s): swap_out
499
-- replace(s): alu_data_d_in
500
 
501
swap_out(i) <= alu_data_d_in_cml_2(i+4);
502
end generate;
503
-- #######################################################################
504
 
505
-- ALU OUTPUT MUX
506
 
507
alu_data_out_mux:for i in alu_data_out_int'range generate
508
-- SynEDA CoreMultiplier
509
-- assignment(s): alu_data_out_int
510
-- replace(s): idc_adc, idc_sub, idc_subi, idc_sbc, idc_sbci, idc_sbiw, adiw_st, sbiw_st, idc_dec, idc_cp, idc_cpc, idc_cpi, idc_cpse, idc_ror
511
 
512
alu_data_out_int(i) <= (adder_out(i) and (idc_add or idc_adc_cml_2 or (idc_adiw or adiw_st_cml_2) or    -- !!!!!
513
                                     idc_sub_cml_2 or idc_subi_cml_2 or idc_sbc_cml_2 or idc_sbci_cml_2 or
514
                                     (idc_sbiw_cml_2 or sbiw_st_cml_2) or    -- !!!!!
515
                                     idc_cpse_cml_2 or idc_cp_cml_2 or idc_cpc_cml_2 or idc_cpi_cml_2)) or
516
                                     (neg_op_out(i) and idc_neg) or                               -- NEG
517
                                     (incdec_op_out(i) and (idc_inc or idc_dec_cml_2)) or               -- INC/DEC
518
                                     (com_op_out(i) and idc_com) or                               -- COM
519
                                     (and_op_out(i) and (idc_and or idc_andi)) or                 -- AND/ANDI                                   
520
                                     (or_op_out(i)  and (idc_or or idc_ori)) or                   -- OR/ORI                                   
521
                                     (eor_op_out(i) and idc_eor) or                               -- EOR
522
                                     (right_shift_out(i) and (idc_lsr or idc_ror_cml_2 or idc_asr)) or  -- LSR/ROR/ASR
523
                                     (swap_out(i) and idc_swap);                                  -- SWAP
524
 
525
 
526
end generate;
527
 
528
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALU FLAGS OUTPUTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
529
 
530
-- SynEDA CoreMultiplier
531
-- assignment(s): alu_h_flag_out
532
-- replace(s): idc_add, idc_adc, idc_sub, idc_subi, idc_sbc, idc_sbci, idc_neg, idc_cp, idc_cpc, idc_cpi, adder_carry, neg_op_carry
533
 
534
alu_h_flag_out_cml_out <= (adder_carry_cml_3(3) and                                                      -- ADDER INSTRUCTIONS
535
             (idc_add_cml_3 or idc_adc_cml_3 or idc_sub_cml_3 or idc_subi_cml_3 or idc_sbc_cml_3 or idc_sbci_cml_3 or idc_cp_cml_3 or idc_cpc_cml_3 or idc_cpi_cml_3)) or
536
             (not neg_op_carry_cml_3(3) and idc_neg_cml_3); -- H-flag problem with NEG instruction fixing                                         -- NEG
537
 
538
 
539
alu_s_flag_out <= alu_n_flag_out_int xor alu_v_flag_out_int;
540
 
541
-- SynEDA CoreMultiplier
542
-- assignment(s): alu_v_flag_out_int
543
-- replace(s): alu_data_d_in, idc_add, idc_adc, idc_sub, idc_subi, idc_sbc, idc_sbci, adiw_st, sbiw_st, idc_neg, idc_inc, idc_dec, idc_cp, idc_cpc, idc_cpi, idc_lsr, idc_ror, idc_asr, alu_c_flag_out_int, neg_op_carry, incdec_op_carry
544
 
545
alu_v_flag_out_int <= (adder_v_flag_out and
546
             (idc_add_cml_3 or idc_adc_cml_3 or idc_sub_cml_3 or idc_subi_cml_3 or idc_sbc_cml_3 or idc_sbci_cml_3 or adiw_st_cml_3 or sbiw_st_cml_3 or idc_cp_cml_3 or idc_cpi_cml_3 or idc_cpc_cml_3)) or
547
             ((alu_data_d_in_cml_3(7) and neg_op_carry_cml_3(6)) and idc_neg_cml_3) or                                       -- NEG
548
                     (not alu_data_d_in_cml_3(7) and incdec_op_carry_cml_3(6) and idc_inc_cml_3) or -- INC
549
                     (alu_data_d_in_cml_3(7) and incdec_op_carry_cml_3(6) and idc_dec_cml_3) or   -- DEC
550
                         ((alu_n_flag_out_int xor alu_c_flag_out_int_cml_3) and (idc_lsr_cml_3 or idc_ror_cml_3 or idc_asr_cml_3));            -- LSR,ROR,ASR
551
 
552
 
553
-- SynEDA CoreMultiplier
554
-- assignment(s): alu_n_flag_out_int
555
-- replace(s): alu_data_out_int
556
 
557
alu_n_flag_out_int <= alu_data_out_int_cml_3(7);
558
 
559
alu_z_flag_out_int <= '1' when alu_data_out_int="00000000" else '0';
560
 
561
-- SynEDA CoreMultiplier
562
-- assignment(s): alu_c_flag_out_int
563
-- replace(s): alu_data_d_in, idc_adc, idc_sub, idc_subi, idc_sbc, idc_sbci, idc_sbiw, adiw_st, sbiw_st, idc_cp, idc_cpc, idc_cpi, idc_ror
564
 
565
alu_c_flag_out_int <= (adder_out(8) and
566
                       (idc_add or idc_adc_cml_2 or (idc_adiw or adiw_st_cml_2) or idc_sub_cml_2 or idc_subi_cml_2 or idc_sbc_cml_2 or idc_sbci_cml_2 or (idc_sbiw_cml_2 or sbiw_st_cml_2) or idc_cp_cml_2 or idc_cpc_cml_2 or idc_cpi_cml_2)) or -- ADDER
567
                                           (not alu_z_flag_out_int and idc_neg) or    -- NEG
568
                                           (alu_data_d_in_cml_2(0) and (idc_lsr or idc_ror_cml_2 or idc_asr)) or idc_com;
569
 
570
-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
571
 
572
 
573
end rtl;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.