DSC IMPY.L how to saturate the result?

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

DSC IMPY.L how to saturate the result?

904 Views
agostinofacotti
Contributor III

Hi all,

I've a question about the simple integer multiplication.

I'm amplifying an ADC result with a gain factor: the problem is that I do the moltiplication with the simple integer multiplication "*"(with is translated to IMPY.L in asm) and the core does not saturate the output; if accidentally the original signal grow too much the moltiplication overflows. This happens even if I enable saturation on the core.

Attached you can find an example project that runs on DSC Full Chip Simulator and a screenshot of the overflowed result.

My question is: is there a way to do this multiplication with saturation?

The only alternative I've found till now is to calculate the limit of the unamplified signal and to limit it...

I'm using Codewarrior for MCU version 10.6; the target is a MC56F84763.

Thanks everyone for your help!

2020-03-25 01 Impy does not saturate.png

Labels (1)
2 Replies

802 Views
xiangjun_rong
NXP TechSupport
NXP TechSupport

Hi, Agostino,

From  the screenshot, I see that you have used the intrinsic function, for example the __turn_on_sat(), can you use the intrinsic function to compute the integer multiply function?

for example :

__turn_on_sat();

mult_r();

__turn_off_sat();

Hope it can help you

BR

XiangJun Rong

0 Kudos

802 Views
agostinofacotti
Contributor III

Hi XiangJun Rong,

thanks for your reply;

the intrinsics mult_r is a fractional multiplication: it doesn't suit my need of amplifying a number (that is FRAC16(0.2) * 2 = FRAC16(0.4))...

I tried with the mult_r_int() instruction with no result: it is translated as a IMPY.L which, as the DSP56800ERM says, does not use the MAC output limiter; and the code deployed on the target confirmed this...

2020-03-27 IMPYDoesNotSaturate.png

Yesterday I was trying to do it with no result forcing the use of the Data Limiter which I think is disabled in the example above because the result of the multiplication is read through the instruction move.w A0,A... (see below the example on the reference manual)

2020-03-27 Data Limiter Bypassing.png

It should be great to find such an easy solution to limit this operation...

Thanks everyone :-)

agostino

0 Kudos