Introduction 1
1 – 7
All three units contain input and output registers which are accessible
from the internal data memory data (DMD) bus. Computational
operations generally take their operands from input registers and load the
result into an output register. The registers act as a stopover point for data
between memory and the computational circuitry. This feature introduces
one level of pipelining on input, and one level on output. The R bus allows
the result of a previous computation to be used directly as the input to
another computation. This avoids excessive pipeline delays when a series
of different operations are performed.
1.2.2
Address Generators & Program Sequencer
Two dedicated data address generators and a powerful program
sequencer ensure efficient use of the computational units. The data
address generators (DAGs) provide memory addresses when memory
data is transferred to or from the input or output registers. Each DAG
keeps track of up to four address pointers. When a pointer is used for
indirect addressing, it is post-modified by a value in a specified register.
With two independent DAGs, the processor can generate two addresses
simultaneously for dual operand fetches.
A length value may be associated with each pointer to implement
automatic modulo addressing for circular buffers. (The circular buffer
feature is also used by the serial ports for automatic data transfers. Refer
to the Serial Ports chapter for additional information.)
DAG1 can supply addresses to data memory only; DAG2 can supply
addresses to either data memory or program memory. When the
appropriate mode bit is set in the mode status register (MSTAT), the
output address of DAG1 is bit-reversed before being driven onto the
address bus. This feature facilitates addressing in radix-2 Fast Fourier
Transform (FFT) algorithms.
The program sequencer supplies instruction addresses to the program
memory. The sequencer is driven by the instruction register which holds
the currently executing instruction. The instruction register introduces a
single level of pipelining into the program flow. Instructions are fetched
and loaded into the instruction register during one processor cycle, and
executed during the following cycle while the next instruction is
prefetched. To minimize overhead cycles, the sequencer supports
conditional jumps, subroutine calls and returns in a single cycle. With an
internal loop counter and loop stack, the processor executes looped code
with zero overhead. No explicit jump instructions are required to loop.