January
2006, Issue 186
Third-Generation
Rabbit
A
Look at the Rabbit 4000
NEW
FEATURES
A
feature that transistor budgets wouldn’t allow in previous
generations was the ability to read and write the peripheral
control registers. These registers were mostly write-only,
which made keeping track of the register contents cumbersome
for the software because it meant keeping a shadow register
in memory.
The
first solution Rabbit proposed for this problem was
a dedicated, complex instruction that automatically
updated both the control register and the shadow register.
Although this instruction still exists in the Rabbit
4000, we ultimately decided to make nearly all of the
peripheral control registers read/write.
The
other major compromises that we removed were in the
serial ports. All six serial ports now fully support
parity generation and checking. Odd, even, mark, and
space parity are all supported. In addition, each serial
port now has its own dedicated 15-bit divider to generate
baud rates. Of course, for backwards compatibility,
the serial ports use the existing timer connections
as the default.
Engineering
is all about compromise, and even though we didn’t have
to compromise because of the transistor budget, a packaging
requirement led to a different kind of trade-off. These
days, high-pin-count packages that are a reasonable
size are all ball grid array (BGA). But BGA packages
require different tooling for a board manufacturer,
and most Rabbit customers don’t want to deal with this
requirement. So, the Rabbit 4000 had to be designed
for the same package as the Rabbit 3000. This wouldn’t
have been a problem if we could use the same power and
ground connections and if we weren’t adding new peripherals
that required dedicated pins.
The
end result was the loss of two parallel ports relative
to the Rabbit 3000 (or the same port count as the Rabbit
2000). To compensate for this reduction, each port pin
has up to four alternate output functions and two or
more alternate input functions. The end result is very
flexible. It enables nearly any combination of peripheral
connections.
One
unique feature of the Rabbit 3000 is the optional I/O
bus, which keeps external I/O devices from loading down
the memory bus. Rabbit has used this option to connect
to Wi-Fi cards, flash memory disks, and so on. However,
one thing that many of these devices require is either
slow access or long recovery times after a command is
issued. These requirements had to be handled in software
because there was no mechanism for externally generated
wait states.
To
deal with these issues, we added an optional I/O handshake
signal that holds off the completion of the I/O transaction
until the handshake is removed. To prevent this handshake
from halting the CPU forever, there’s also a timer that’s
triggered at the start of an I/O transaction. If this
programmable time limit is exceeded, the I/O transaction
is terminated independent of the handshake signal.
The
last change involves the input capture peripheral. We
added the option to count external events instead of
merely latching the state of a counter when the external
event occurs.