15.01.2013 Views

designfeature DSP assembly language - EDN

designfeature DSP assembly language - EDN

designfeature DSP assembly language - EDN

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>designfeature</strong> By NS Manju Nath, Technical Editor<br />

C compilers and development tools<br />

SIMPLIFY<br />

<strong>DSP</strong> <strong>assembly</strong>-<strong>language</strong><br />

programming<br />

www.ednmag.com<br />

PROGRAMMING <strong>DSP</strong>s IN ASSEMBLY LANGUAGE IS NOTO-<br />

RIOUSLY HARD. WITH MULTIPLE EXECUTION UNITS OPER-<br />

ATING IN PARALLEL, <strong>DSP</strong>s DEMAND A LEVEL OF PROGRAM-<br />

MING DEXTERITY THAT IS DIFFICULT TO ACHIEVE. THANKS<br />

TO EVER-IMPROVING C COMPILERS AND DEVELOPMENT<br />

TOOLS, YOUR TASK IS GETTING SIMPLER.<br />

At a glance........................104<br />

For more information ....108<br />

The best way to start developing<br />

<strong>DSP</strong>-<strong>assembly</strong> applications<br />

is to run your C source<br />

code and look at the resulting<br />

intermediate <strong>assembly</strong> code. But<br />

beware: You still have to contend with<br />

rounding and saturation arithmetic in<br />

the eventual application. Because standard<br />

ANSI C does not directly support<br />

the fixed-point fractional data type that<br />

most <strong>DSP</strong> applications require, you have<br />

no choice but to develop your demanding<br />

algorithms in assembler.<br />

A common metric in <strong>DSP</strong> applications<br />

is that control code occupies 80% of the<br />

code space but consumes only 10% of<br />

the MIPS. <strong>DSP</strong> kernel code occupies only<br />

20% of the code space but consumes<br />

90% of the MIPS. You can use the compiler<br />

to quickly generate the <strong>assembly</strong> for<br />

the control code and focus your effort on<br />

the kernel code.<br />

WHY ASSEMBLY?<br />

Assembly <strong>language</strong> is a must in <strong>DSP</strong><br />

applications for several reasons. One is<br />

that high-level <strong>language</strong>s (HLLs) don’t<br />

address timing.<br />

“Some control applications require<br />

small sections of code to run in an exact<br />

number of cycles—not too many or too<br />

few,” says Andy Fritsch, C6000 fixedpoint<br />

program manager at Texas Instruments.“Today,<br />

HLLs don’t have a way to<br />

express this feature, and the user is often<br />

required to write the code by hand.”<br />

Coding in <strong>assembly</strong> also makes sense<br />

from an efficiency standpoint. According<br />

to Steve Kafka at Analog Devices, some<br />

more intensive computations, such as<br />

butterflies and convolutions, always sug-<br />

January 21, 1999 | edn 103


<strong>designfeature</strong> <strong>DSP</strong> <strong>assembly</strong> <strong>language</strong><br />

gest themselves as logical candidates for<br />

coding in <strong>assembly</strong>. In digital-communication<br />

applications, FIR or IIR filters lend<br />

themselves well to C with intrinsic functions,<br />

but you still need to program Viterbi<br />

or Reed-Solomon decoders in <strong>assembly</strong>,<br />

according to Kevin Stone, product<br />

engineer at ZSP Corp.<br />

<strong>DSP</strong> ARCHITECTURES INFLUENCE CODE<br />

Detailed knowledge of the target architecture<br />

is a must for developing efficient<br />

application code, especially knowing<br />

which “dirty tricks” you can use to<br />

take advantage of the architecture’s<br />

strengths. Programming <strong>DSP</strong>s becomes<br />

easy when the architecture and programming<br />

model of a <strong>DSP</strong> are wellstructured.<br />

For example, a <strong>DSP</strong> that has<br />

a very orthogonal instruction set (that is,<br />

all commands work on all registers) is<br />

easier to program and optimize than a<br />

<strong>DSP</strong> whose commands work only on specific<br />

ALU registers. For example, Analog<br />

Devices’A<strong>DSP</strong>-21062 Super Harvard Architecture<br />

Computer (SHARC) <strong>DSP</strong> features<br />

three independent parallel computation<br />

units: the ALU, the multiplier, and<br />

the shifter. Single multifunction instructions<br />

execute parallel ALU and multiplier<br />

operations.<br />

The <strong>DSP</strong> features an enhanced Harvard<br />

architecture in which the datamemory<br />

bus transfers data and the program-memory<br />

bus transfers both<br />

instructions and data. A general-purpose,<br />

10-port, 32-bit data-register file, combined<br />

with the A<strong>DSP</strong>-<br />

21000 Harvard architec-<br />

ture, allows unrestricted<br />

data flow between<br />

computation units<br />

and internal memory. The<br />

A<strong>DSP</strong>-21062 includes an<br />

on-chip instruction cache<br />

that enables three-bus operation<br />

for fetching an instruction<br />

and two data values.<br />

The cache selectively<br />

caches only those instructions<br />

whose fetch operations<br />

conflict with program-memory-bus<br />

data<br />

accesses.<br />

This scheme allows fast<br />

execution of core, looped<br />

operations, such as multiply-accumulate<br />

(MAC) instructions<br />

and FFT butterfly<br />

processing. The device’s<br />

Figure 1<br />

AT A GLANCE<br />

3Programming <strong>DSP</strong>s in mnemonics or<br />

algebraic <strong>assembly</strong> <strong>language</strong> is a necessity<br />

because no better way exists to generate<br />

compact code and ensure faster execution<br />

of application software.<br />

3Depending on the application and timeto-market<br />

considerations, you have to<br />

proceed carefully with your <strong>DSP</strong> application<br />

development.<br />

3Now, rather than develop <strong>assembly</strong><strong>language</strong><br />

modules from the ground up, you<br />

can use a C compiler to generate <strong>assembly</strong><br />

code.<br />

3You can further optimize and debug the<br />

C compiler-generated <strong>assembly</strong> code by<br />

using development tools supplied by <strong>DSP</strong><br />

vendors and third-party developers.<br />

48-bit instruction word accommodates a<br />

variety of parallel operations for concise<br />

coding. For example, the A<strong>DSP</strong>-21062<br />

can execute a multiply, an add, a subtract,<br />

and a branch all in a single instruction.<br />

ZSP Corp’s ZSP16401 is a 16-bit fixedpoint<br />

<strong>DSP</strong> based on a superscalar architecture<br />

(register-based with multiple execution<br />

units) that employs a five-stage<br />

pipeline. The <strong>DSP</strong> features two ALUs and<br />

two MAC units, which use a 16-bit register-operand<br />

file for their source and<br />

The integrated development environment debugger window of the ZSP164xx<br />

<strong>DSP</strong> lets you quickly complete code debugging. ZSP’s Profiler (also known<br />

as Simulator) gives you valuable information about how the instructions are<br />

grouped so that you can optimize the code and thus achieve maximum<br />

performance.<br />

destination. This register-rich architecture<br />

avoids accumulator bottlenecks and<br />

helps reduce immediate memory accesses.<br />

Further, you can use data memory as<br />

a general-purpose, scratchpad resource<br />

while reading and writing to device registers.<br />

There are no restrictions on reading<br />

and writing to data memory, unlike<br />

the segregated read and read/write memory<br />

scheme found in traditional <strong>DSP</strong>s.<br />

Code development for the device has<br />

the look and feel of development for a �C<br />

<strong>assembly</strong> code (Figure 1). For example,<br />

you can write <strong>assembly</strong>-<strong>language</strong> routines<br />

as a linear sequence of instructions.<br />

You can also combine instructions that<br />

specify one or two operations with other<br />

instructions for parallel execution, but<br />

the code contains no scheduling information.<br />

Thanks to the device’s pipelinecontrol<br />

unit, which schedules as many as<br />

four instructions for execution within the<br />

same clock cycle, you need not worry<br />

about scheduling parallel execution. This<br />

feature is a major benefit, because it allows<br />

you to concentrate on the algorithm<br />

and its implementation rather than on<br />

the <strong>DSP</strong>’s architecture.<br />

THE SKILL FACTOR<br />

The inherent nature of <strong>DSP</strong> applications<br />

means that certain programming<br />

skills are unique to <strong>DSP</strong>-<strong>assembly</strong> programming.<br />

Coding <strong>DSP</strong> algorithms is<br />

mathematically intensive. Mapping those<br />

models onto a <strong>DSP</strong>’s architecture is a skill<br />

unique to <strong>DSP</strong> <strong>assembly</strong> programmers.<br />

“You often trade off when<br />

coding an algorithm that requires<br />

41 MIPS onto an architecture<br />

that can deliver<br />

only 40 MIPS,” says Analog<br />

Devices’ Kafka.“In such situations,<br />

a thorough understanding<br />

of the math involved<br />

in the algorithm will<br />

help the <strong>assembly</strong> programmer<br />

modify the algorithm so<br />

that it requires fewer MIPS<br />

while still delivering the desired<br />

results.”<br />

According to Kafka, <strong>DSP</strong><strong>assembly</strong><br />

programming also<br />

requires that you understand<br />

instruction stalls. Instruction<br />

stalling is important because<br />

it helps you optimize <strong>assembly</strong>.<br />

“Stalling” means that a<br />

previous instruction delays<br />

the next instruction because<br />

104 edn | January 21, 1999 www.ednmag.com


<strong>designfeature</strong> <strong>DSP</strong> <strong>assembly</strong> <strong>language</strong><br />

that instruction needs the previous result<br />

to execute. For example, in the following<br />

code fragment, the Motorola <strong>DSP</strong>56300<br />

introduces two clock cycles after the first<br />

instruction but before executing the second<br />

instruction to ensure that the address<br />

register “inputPtr” contains valid data.<br />

You can optimize the above software by<br />

inserting another instruction between<br />

the following two instructions:<br />

MOVE #InputBufferBase, inputPtr<br />

MOVE Input_Mem:(inputPtr)+,<br />

inputBuf<br />

Kafka believes that <strong>DSP</strong>-<strong>assembly</strong> programmers<br />

should also understand:<br />

● various code optimizations, for<br />

example, software pipelining (execution<br />

of operations from different<br />

iterations of the loops in parallel);<br />

● finite-arithmetic effects, such as<br />

overflow, saturation and cumulative<br />

effects;<br />

● memory architectures, such as<br />

modified-Harvard and banked, and<br />

how to exploit them;<br />

● special architectural features, such<br />

as circular buffers and bit-reverse<br />

addressing, and how to exploit<br />

them;<br />

● required accuracy and precision,<br />

which allows you to use look-up<br />

tables or seed values for iterative<br />

approximations;<br />

● math “tricks,” which can reduce<br />

explicit operations; for example,<br />

divide by 2 is a simple shift; and<br />

● how to represent scalar fractional<br />

data.<br />

ALGEBRAIC OR MNEMONICS?<br />

Two methods exist for developing<br />

assembler code: One is by traditional<br />

mnemonic-assemblers;<br />

the other is by algebraic assembler.<br />

Analog Devices asserts that its algebraic<br />

<strong>assembly</strong> syntax helps you<br />

develop a clear understanding of<br />

<strong>DSP</strong> algorithms and their underlying<br />

mathematical models. Kafka<br />

says that intuitive (algebraic) syntax<br />

is important in developing<br />

<strong>DSP</strong> applications. He asserts that<br />

the code is easier to write, easier to<br />

maintain, and easier to read than<br />

a mnemonics-based syntax. See<br />

the listing below for a quick comparison:<br />

Algebraic: A<strong>DSP</strong>-21060 instruc-<br />

tions to find the maximum of two<br />

operands:<br />

R7=MAX (R5, R6)<br />

Mnemonics: TMS320C40 instructions to<br />

find the maximum of two operands:<br />

LDF R6, R7<br />

CMPF R5, R7<br />

LDFLT R5, R7<br />

For more source code, comparing<br />

Analog Devices algebraic syntax for<br />

the SHARC with the mnemonic syntax<br />

for Texas Instruments’ TMS320C40,<br />

go to www.analog.com/techsupt/<br />

application_notes/AN-403.pdf. According<br />

to Reid Tatge, a distinguished member<br />

of the technical staff in the Software<br />

Development Systems Group at Texas Instruments,<br />

using algebraic-<strong>assembly</strong> code<br />

versus using mnemonics-<strong>assembly</strong> code<br />

is mostly a matter of personal preference.<br />

Tatge sees no inherent advantages of either<br />

approach, either in the implementation<br />

of the algorithm in the assembler<br />

or in the programmer’s use of or ability<br />

to read a program.<br />

Tatge argues that, although most of the<br />

instructions in RISC-like architectures<br />

map nicely to a familiar “algebraic”form,<br />

algebraic <strong>assembly</strong> gets complicated<br />

when you are handling instructions that<br />

affect status bits. Also, algebraic assemblers<br />

often use esoteric operations by inventing<br />

syntax for common types of <strong>DSP</strong><br />

operations, such as saturated math, bitreversed<br />

math, circular addressing, and<br />

add with carry. Algebraic assemblers typically<br />

revert to a mnemonics or functional<br />

form for these special instructions:<br />

r0 = add_saturate (r1,r2)<br />

With the TMS320C54x <strong>DSP</strong>s, you can<br />

generate code with either an algebraic or<br />

a mnemonics/assembler. Tatge says there<br />

is a 1-to-1 translation between mnemonics<br />

and algebraic <strong>assembly</strong> on the C54x,<br />

so users are not penalized in cycle count<br />

or code size, regardless of which format<br />

they prefer.<br />

DEVELOPMENT TOOLS FOR <strong>DSP</strong> ASSEMBLY<br />

Debugging tools for <strong>assembly</strong>-<strong>language</strong><br />

development are getting more sophisticated.<br />

The ZSP164xx <strong>DSP</strong> provides<br />

you with an integrated development environment<br />

(IDE) that allows you to<br />

rapidly and smoothly complete debugging.<br />

ZSP’s Profiler (also known as Simulator)<br />

gives valuable information on<br />

how the instructions are grouped so that<br />

an <strong>assembly</strong> programmer can optimize<br />

the code to the fullest extent and achieve<br />

maximum performance (Figure 1).<br />

Analog Devices’ Visual<strong>DSP</strong> (Figure 2)<br />

introduces an easy-to-use project management<br />

environment, comprising an<br />

IDE and a debugger. Visual<strong>DSP</strong> lets you<br />

manage projects from start to finish from<br />

within one integrated interface. Because<br />

the project-development and debugging<br />

environments are integrated, you can easily<br />

move between editing, building, and<br />

debugging activities.<br />

The IDE includes access to the SHARC<br />

<strong>DSP</strong> C compiler, C runtime library, assembler,<br />

linker, loader, simulator, and<br />

splitter. Visual<strong>DSP</strong>’s debugger has many<br />

features that greatly reduce debugging<br />

time. You can view C source interspersed<br />

with the resulting <strong>assembly</strong> code,<br />

profile execution of a range of in-<br />

Figure 2<br />

Visual<strong>DSP</strong>’s debugger session displays a locals window, a<br />

mixed C/<strong>assembly</strong> source window, an active-register-file<br />

window, and an active data-address-generator window. The<br />

debugger supports C, <strong>assembly</strong> and mixed C, and <strong>assembly</strong>expression<br />

evaluation.<br />

structions in a program, set<br />

simulated watch points on<br />

hardware and software registers,<br />

program and data memory, and<br />

trace instruction execution and<br />

memory accesses.<br />

The C compiler generates efficient<br />

code that is optimized for both<br />

code density and execution time.<br />

The compiler allows you to include<br />

<strong>assembly</strong>-<strong>language</strong> statements inline.<br />

This feature means that you<br />

can program in C and still use <strong>assembly</strong><br />

for time-critical loops. You<br />

can also use pretested math, <strong>DSP</strong>,<br />

and C runtime-library routines to<br />

shorten your time to market. A cy-<br />

106 edn | January 21, 1999 www.ednmag.com


<strong>designfeature</strong> <strong>DSP</strong> <strong>assembly</strong> <strong>language</strong><br />

cle-accurate, instructionlevel<br />

simulator lets you simulate<br />

your application in real<br />

time. Also, the Visual<strong>DSP</strong><br />

tool features a well-defined<br />

application programming<br />

interface (API). Third-party<br />

products, runtime operating<br />

systems, emulators, HLL<br />

compilers, and multiprocessor<br />

hardware can interface<br />

seamlessly with Visual<strong>DSP</strong><br />

and thereby simplify tool integration.Visual<strong>DSP</strong><br />

follows<br />

the COM API format. Two<br />

API tools, Target Wizard and<br />

API Tester, are also available.<br />

You can find links to third<br />

parties that support Analog’s<br />

<strong>DSP</strong> product lines at www.<br />

analog.com/support/3rd_<br />

party/third_party.html.<br />

Texas Instruments TMS-<br />

320C6x <strong>DSP</strong> features two<br />

datapaths—each with 16 32-bit registers—shared<br />

by eight functional units.<br />

The C6x is a very-long-instructionword<br />

(VLIW) processor; a composite<br />

instruction (line), formed by concatenating<br />

n short instructions, controls its<br />

functional units. In the C6x, the short<br />

instructions are 32 bits wide, and the<br />

line consists of a maximum of eight<br />

32-bit instructions. Therefore,<br />

the C6x packs instructions to avoid inefficient<br />

use of program memory.<br />

FOR MORE INFORMATION...<br />

Instruction packing may result in<br />

alignment restrictions between lines and<br />

the physical-memory organization. In<br />

the C6x, the program is organized as<br />

eight instruction lines, or fetch packets.<br />

You may divide each fetch packet into<br />

groups of instructions or “execute packets,”which<br />

are issued in parallel. The C6x<br />

is restricted because the execute packet<br />

must be within an eight-word boundary.<br />

Every fetch packet must start with an execute<br />

packet. This stipulation implies that<br />

For information on products such as those discussed in this article, circle the appropriate numbers<br />

on the Information Retrieval Service card or use <strong>EDN</strong>’s InfoAccess service. When you contact<br />

any of the following manufacturers directly, please let them know you read about their products<br />

in <strong>EDN</strong>.<br />

Analog Devices<br />

Norwood, MA<br />

1-781-329-4700<br />

fax 1-781-326-8703<br />

www.analog.com/dsp/<br />

Circle No. 301<br />

<strong>DSP</strong>ecialists GmbH<br />

Berlin, Germany<br />

+49 30 467 805 60<br />

fax +49 30 467 805 99<br />

www.<strong>DSP</strong>ecialists.de<br />

Circle No. 302<br />

Texas Instruments<br />

Dallas, TX<br />

1-972-644-5580<br />

fax 1-972-480-7800<br />

www.ti.com<br />

Circle No. 303<br />

ZSP Corp<br />

Santa Clara, CA<br />

1-408-450-6207<br />

fax 1-408-986-1687<br />

www.zsp.com<br />

Circle No. 304<br />

The Code Composer IDE features the Assembly Optimizer tool. Using the<br />

Assembly Optimizer, you can write conventional-looking C6000 <strong>assembly</strong><br />

code without bothering with parallel instructions, instruction latencies, or<br />

register usage. The Assembly Optimizer then schedules the instructions,<br />

taking into account the C6000’s parallel architecture.<br />

SUPER CIRCLE NUMBER<br />

For more information on the<br />

products available from all of<br />

the vendors listed in this box,<br />

circle one number on the reader<br />

service card. Circle No. 305<br />

you must pad fetch packets<br />

that do not end with an execute<br />

packet with no-op-<br />

Figure 3<br />

eration instructions. Furthermore,<br />

the need to track<br />

various functional units in a<br />

VLIW architecture can rapidly<br />

overwhelm a <strong>DSP</strong> programmer.<br />

To help application developers,<br />

TI has introduced the<br />

concept of “linear” <strong>assembly</strong><br />

<strong>language</strong>. Linear <strong>assembly</strong> <strong>language</strong><br />

allows you to write <strong>assembly</strong><br />

<strong>language</strong> without regard<br />

to registers and pipeline<br />

behavior, significantly easing<br />

the task of writing low-level<br />

code. An Assembly Optimizer,<br />

which performs many compilerlike<br />

optimizations, processes<br />

linear <strong>assembly</strong> by assigning<br />

registers and scheduling<br />

the instructions, effectively<br />

handling all the “hard” problems<br />

associated with writing code for a<br />

pipelined processor (Figure 3).<br />

TI claims that the C6000 compiler offers<br />

an average improvement in execution<br />

speed; it is three times faster than<br />

state-of-the-art fixed-point <strong>DSP</strong> C compilers.<br />

The C compiler accepts ANSI C<br />

source code and produces efficient C6000<br />

<strong>assembly</strong>-<strong>language</strong> source code, performing<br />

a variety of optimizations to improve<br />

the efficiency of the compiled code.<br />

The compiler incorporates four levels of<br />

state-of-the-art generic and target-specific<br />

optimizations. The level of optimizations<br />

is selectable.<br />

Optimizations include those features<br />

specific to the TMS320C6201 processor,<br />

such as software pipelining, if conversion/predicated<br />

execution, memory-address<br />

cloning, memory-address-dependence<br />

elimination, branch optimizations/control-flow<br />

simplification, alias<br />

disambiguation, copy propagation, common<br />

subexpression elimination, redundant<br />

assignment elimination, loop-induction-variable<br />

optimizations/strength<br />

reduction, loop rotation, loop invariant<br />

code motion, inline expansion of function<br />

calls, register tracking/targeting, and<br />

cost-based register allocation. For more<br />

information, visit TI’s <strong>DSP</strong> third-party<br />

Web site (www.ti.com/sc/docs/dsps/<br />

develop/3party.htm).<br />

Even with all these development tools,<br />

108 edn | January 21, 1999 www.ednmag.com


<strong>designfeature</strong> <strong>DSP</strong> <strong>assembly</strong> <strong>language</strong><br />

you need a good design methodology to<br />

develop consistent, top-quality <strong>assembly</strong><br />

code. ZSP’s Stone suggests the following<br />

algorithm as a general method for generating<br />

consistent, top-quality <strong>assembly</strong><br />

code:<br />

Design for correctness:<br />

1. Clearly define and document<br />

problem. (Anticipate problems<br />

beforehand.)<br />

2. Start with a fixed-point C model.<br />

Document code and anticipate areas<br />

that you may need to write in <strong>assembly</strong>.<br />

3. Compile C code; generate <strong>assembly</strong>.<br />

4. Verify <strong>assembly</strong> in system.<br />

Possibility 1:<br />

5. Optimize C code by adding intrinsics,<br />

library functions, or <strong>assembly</strong><br />

routines with C wrappers.<br />

6. Verify C+ASM.<br />

7. Go to 5.<br />

Possibility 2:<br />

5. Write ASM.<br />

6. Verify ASM.<br />

7. Optimize ASM.<br />

8. Go to 6.<br />

For developing high-quality <strong>assembly</strong><br />

code, Raymond Horn, CEO of <strong>DSP</strong>ecialists,<br />

a German design house specializing<br />

in <strong>DSP</strong>5600 <strong>assembly</strong>-tool development,<br />

recommends the following procedures:<br />

● Optimize on the “planning level”<br />

when structuring an application in<br />

different modules and defining the<br />

interfaces.<br />

● Optimize data position in memory.<br />

● Use parallel data moves as often as<br />

possible.<br />

● Carefully plan which registers to use<br />

for certain operands.<br />

● Reuse existing code wherever possible<br />

when programming new software<br />

modules.<br />

● Use uniform rules and naming conventions.<br />

● Use macros for complex operations.<br />

● Use the DMA controller as often as<br />

possible.<br />

● Avoid double calculation of the same<br />

data by using intermediate results as<br />

input for different calculations.<br />

As HLL technology matures for the<br />

various <strong>DSP</strong> architectures, coding algorithms<br />

in HLL often becomes a more viable<br />

alternative. Libraries and intrinsics<br />

that target a specific architecture, com-<br />

bined with ever-improving HLL optimizations,<br />

help move HLL programming<br />

across the efficiency spectrum.<br />

Stone maintains that for applications<br />

that are based on a standard, such as a<br />

speech coder, it’s easier to justify development<br />

in <strong>assembly</strong> to maximize performance,<br />

because the standard will not<br />

change. However, Stone also says that for<br />

large applications with millions of lines<br />

of code and applications without a fixed<br />

standard, such as 3G Cellular Systems, it<br />

is better to adopt C.P<br />

You can reach NS Manju Nath at +852-<br />

2965-1534, fax +852-2976-0706,<br />

nsmanjnath@cahners.com.hk.<br />

References<br />

1. Woodthorpe, Chris, and Kevin<br />

Stone, “Wireless <strong>DSP</strong> development with<br />

C compilers,” Communication Systems<br />

Design, November 1998.<br />

2. Considerations for selecting a <strong>DSP</strong><br />

processor, A<strong>DSP</strong>-2115 Vs. TMS 320C5x,<br />

AN-393, Analog Devices.<br />

3. Algorithm Implementation Examples<br />

for Digital Cellular Communications,<br />

AN V1.0, Aug 6, 1998, ZSP Corp.<br />

110 edn | January 21, 1999 Circle 8 or visit www.ednmag.com/InfoAccess<br />

www.ednmag.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!