Here's a 1st order IIR Lowpass (also known as an exponential average) in C, using only shifts and no multiply:
//1st-order IIR lowpass
//2^(-SHIFT) = 1 - e^(-2*pi * Fc/Fs)
//Fc = Fs * (-ln(1 - 2^(-SHIFT)) / (2*pi))
//Fs = sample rate, Fc = -3dB cutoff frequency
void IIR_lowpass_1(int in, *out, SHIFT)
*out -= (*out >> SHIFT);
*out += ( in >> SHIFT);
It's become a standard block of code that I've used in a bunch of different projects now. You can do the math to see that this sequential operation has the exact same effect as the canonical version.
It must be atomic though - no task switching in the middle of it!
I'll leave it to the reader, both to optimize it as needed, and to translate it from a microcontroller to an FPGA. My point is simply that it can be done without a multiply.
For higher orders, you can cascade a bunch of 1st orders:
void IIR_lowpass_2(int in, *mid, *out, SHIFT)
IIR_lowpass_1( in, *mid, SHIFT);
IIR_lowpass_1(*mid, *out, SHIFT);
void IIR_lowpass_3(int in, *mid1, *mid2, *out, SHIFT)
IIR_lowpass_1( in, *mid1, SHIFT);
IIR_lowpass_1(*mid1, *mid2, SHIFT);
IIR_lowpass_1(*mid2, *out, SHIFT);
mid_ must each have their own dedicated storage.