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

Subversion Repositories avr_hp

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

powered by: WebSVN 2.1.0

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