[comp.dsp] FIR Chip Info Needed

jbm@celebr.uucp (John B. Milton) (05/25/90)

In article <56424@bbn.BBN.COM> moyarzun@BBN.COM (Miguel Oyarzun) writes:
>Greetings DSPeople,
>
>I'm trying to pick a FIR filter chip to implement a FIR with the following
>rough specs:
>
>	- 12 KHz sampling rate
>	- 127 tap FIR
>	- 12 or 16 bits of input 
>	- 12, 16 or more bits of coefficient
>	- 16 bits of output
>
>I have looked at the Motorola DSP56200, but it seems like an overkill for
>my application.  I would prefer a device that requires minimal 'glue'.
>If anyone out there in DSPland has recently looked at FIR chips, any info
>you could send my way would be greatly appreciated.

How about the Analog Devices ADSP210[15]. They have not yet been released, but
will prices of about $55 for the 2101 and, get this, $9.90 for the 2105. Both
parts are code and pin-for-pin compatible. The 2105 has half the on-chip memory
and 1 instead of two serial ports. With a 10MHz clock, they're 10 MIPS.

Below is the source to an FIR example on the 2101 simulator demo disk.

John
---
{******************************************************************************}
{This is the ADSP-2100 assembly subroutine that executes the core of an FIR    }
{filter.  This routine is called from a main program (MAIN.DSP) upon an	       }
{interrupt from the input A/D converter.  This routine takes its input from an }
{A/D and send its output to a D/A converter.                                   }
{******************************************************************************}

.module/ram/boot=0         FIR_ROUTINE;      {Relocatable FIR interrupt module}

{The following are some variable, I/O port and subroutine declarations}

.include        <const.h>;      {Include constant declaration file}
.port           AD_SAMPLE;      {Declare memory mapped A/D}
.port           DA_DATA;        {Declare memory mapped D/A}
.entry          FIR;            {Entry point to the FIR routine}
.external       DATA_BUFFER,COEFF,INPUT_DATA,OUTPUT_DATA,COEFP;

{The following is the main body of the program}

FIR:            AY0=TAPS;
                AR=AY0-1;
                CNTR=AR;        {Set counter to the # of taps minus 1}

                SI=DM(AD_SAMPLE);     {Read new sample from A/D}
                DM(I1,M1)=SI;         {Write sample to memory for}
                                      {later display purposes}
                DM(I0,M0)=SI;         {Write sample to circ. buffer}

{******The following section executes the convolution for the FIR filter******}

                MR=0,MX0=DM(I0,M0),MY0=PM(I4,M4);
                DO TAPLOOP UNTIL CE;
TAPLOOP:         MR=MR+MX0*MY0 (ss), MX0=DM(I0,M0),MY0=PM(I4,M4);
                MR=MR+MX0*MY0 (RND);   {Filtered output sample}
                IF MV SAT MR;          {If overflow occurred, saturate}
                                       {the output}
                DM(DA_DATA)=MR1;       {Write result to D/A}
                DM(I2,M2)=MR1;         {Write result to memory for}
                                       {later display purposes}
                RTI;
.endmod;
-- 
John Bly Milton IV, jbm@uncle.UUCP, n8emr!uncle!jbm@osu-cis.cis.ohio-state.edu
(614) h:252-8544, w:469-1990; N8KSN, AMPR: 44.70.0.52; Don't FLAME, inform!