Datasheet

Table Of Contents
0
1
MaskAccumulator 0
Add to BASE1
(for PEEK0/POP0)
Add to BASE2
(forms part of
PEEK2/POP2)
Result 0
Result 1
Accumulator 1
Right Shift
Sign-extend
fromMask
0
1
1
0
1
0
Figure 9. Each lane of
each interpolator can
be configured to
perform mask, shift
and sign-extension on
one of the
accumulators. This is
fed into adders which
produces final results,
which may optionally
be fed back into the
accumulators with
each read. The
datapath can be
configured using a
handful of 32-bit
multiplexers. From left
to right, these are
controlled by the
following CTRL flags:
CROSS_RESULT,
CROSS_INPUT,
SIGNED, ADD_RAW.
Each lane performs these three operations, in sequence:
A right shift by CTRL_LANEx_SHIFT (0 to 31 bits)
A mask of bits from CTRL_LANEx_MASK_LSB to CTRL_LANEx_MASK_MSB inclusive (each ranging from bit 0 to bit 31)
A sign extension from the top of the mask, i.e. take bit CTRL_LANEx_MASK_MSB and OR it into all more-significant bits, if
CTRL_LANEx_SIGNED is set
For example, if:
ACCUM0 = 0xdeadbeef
CTRL_LANE0_SHIFT = 8
CTRL_LANE0_MASK_LSB = 4
CTRL_LANE0_MASK_MSB = 7
CTRL_SIGNED = 1
Then lane 0 would produce the following results at each stage:
Right shift by 8 to produce 0x00deadbe
Mask bits 7 to 4 to produce 0x00deadbe & 0x000000f0 = 0x000000b0
Sign-extend up from bit 7 to produce 0xffffffb0
In software:
Pico Examples: https://github.com/raspberrypi/pico-examples/tree/pre_release/interp/hello_interp/hello_interp.c Lines 25 - 46
25 void moving_mask() {
26 interp_config cfg = interp_default_config();
27 interp0->accum[0] = 0x1234abcd;
28
29 puts("Masking:");
30 printf("ACCUM0 = %08x\n", interp0->accum[0]);
31 for (int i = 0; i < 8; ++i) {
32 // LSB, then MSB. These are inclusive, so 0,31 means "the entire 32 bit register"
33 interp_config_mask(&cfg, i * 4, i * 4 + 3);
34 interp_set_config(interp0, 0, &cfg);
35 // Reading from ACCUMx_ADD returns the raw lane shift and mask value, without BASEx
Ê added
36 printf("Nibble %d: %08x\n", i, interp0->add_raw[0]);
37 }
38
39 puts("Masking with sign extension:");
40 interp_config_signed(&cfg, true);
41 for (int i = 0; i < 8; ++i) {
42 interp_config_mask(&cfg, i * 4, i * 4 + 3);
43 interp_set_config(interp0, 0, &cfg);
44 printf("Nibble %d: %08x\n", i, interp0->add_raw[0]);
45 }
46 }
The above example should print:
RP2040 Datasheet
2.3. Processor subsystem 38