circuitcellar.com
Magazine Support   Digital Library   Products & Services   Suppliers Directory 
 
 





 

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.