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

Subversion Repositories avr_hp

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

powered by: WebSVN 2.1.0

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