An FIR filter has a very simple and regular structure, and hand coding a
basic one is a very easy project. As a first step, create one with no
more taps than your target FPGA has multipliers. (Hint : use the
"Transpose Form")
Later you can learn tricks such as KCM (constant coefficient multipliers)
and other ways to economise on hardware (many taps will have very small
coefficients so their multiplications can reduce to a few additions).
Creating the filter coefficients is a bit more involved but you can use a
little mathematical knowledge instead of the expensive tools. For
example, the "window method" is as follows:
1) Decide the frequency response you want.
2) Convert that to an impulse response via Discrete Fourier Transform (DFT
or Fast FT:FFT) or from knowledge of common results (perfect LPF =
rectangle in frequency domain = sin(t)/t in time domain)
3) Shorten that impulse response to something finite, and with no. of
time steps <= no. of available filter taps.
This degrades the freq response in different ways according to the method
used; hence there are different methods.
Simplest is the Window Method with variants that shallow the filter slope
or degrade the stopband attenuation : Hamming window, Hanning, or
Blackman windows are common with about 40dB, 45 dB or 75dB stopband
attenuation respectively.
For a better but more compute intensive approach, the Remez Exchange
Algorithm is available. Thirty years ago you had to type ten pages of
Fortran from a listing in a book, and it took 5 hours on a Z80, but I bet
you can quickly find it in a more convenient form now.
4) Scale the coefficients into fixed point (ie scaled integer) form and
enter them in a VHDL constant array.
5) Plug said array of coefficients into the filter you coded earlier.
The above is not QUITE enough info to DIY but I think it gives you enough
outline and search terms to get you going. Step 2 or 3 are where Matlab
(or the open source Octave or your own Python or Ada* program) can help
most.
* Ada has fixed-point built in, as easy to use as floating point. Sweet...
Other DSP algorithms are also amenable to hand coding treatment so don't
be put off trying them. IMO you'll ultimately do a better job through
knowing the internals better than you could if you just "plug and play"
with Matlab.
- Brian