The concern with clock signals is that their edges define when other signals are sampled. The edges of non-clock signals can bounce all they want with no negative effects as long as they settle to a valid state for at least the minimum set-up period before they're sampled. A clock edge, on the other hand, needs to make a clean transition with no significant noise.

This site has a nice graphical depiction of transmission line reflections based on how the ends are terminated.
Why is this a problem? Consider a clock that causes a counter to advance. If a clock line has a bounce in it that cause the receiver advance the counter twice instead of once, the count will be off. This is especially a problem when the two ends must remain in sync, such as when they're transferring bits serially.
In most circuits, the driver really doesn't care what its output pin does as long as the receiver only sees one clock edge. With an unterminated clock like my 50 MHz oscillator output, the driver actually sees its output pin rise to about half the intended output voltage and hang there briefly. It's the arriving reflected wave which pushes the pin up to its full output voltage. But that normally doesn't matter because the driver doesn't care.
The Spartan 6 FPGA's configuration clock, CCLK, is different. It's configured as both an input and an output. In "master mode" the internal clock generator drives the external I/O pin to transfer data from the Flash ROM to the FPGA's configuration RAM. However, the FPGA's SPI receiver circuitry senses the external I/O pin directly, rather than a buffered output from the clock generator. This means it's sensitive to the wiggles and bounces caused by these reflected waves.
Xilinx knows this is a problem, and has changed the design in the 7-series chips to address this, but I'm using a Spartan 6 because the 7-series FPGAs only come in BGAs. To avoid problems the Spartan‑6 FPGA Configuration User's Guide (UG380) is very specific when it comes to the routing and termination of CCLK:
- Route the CCLK net as a 50Ω controlled impedance transmission line.
- Always route the CCLK net without any branching; do not use a star topology.
- Stubs, if necessary, must be shorter than 8 mm (0.3 inches).
- Terminate the end of the CCLK transmission line with a parallel termination of 100Ω to VCCO and 100Ω to GND (the Thevenin equivalent of VCCO/2, and assuming a trace characteristic impedance of 50Ω).
- After configuration in master mode, the CCLK pin is not driven unless it is used in the user design. If unused in the design, it is recommended to drive this pin to a logic level to prevent the pin from floating after configuration has completed.
So what's this "Thevenin equivalent" jargon? Here's Figure 2-22 from this document, which shows the desired configuration for one CCLK driver (the FPGA in Master mode) driving one CCLK receiver (the Flash chip):
The two resistors across the transmission line, one to VCCO_2 and the other to ground, comprise the Thevenin equivalent termination. Basically the idea is to make the transmission line look like it's infinitely long, so there is never a reflection.
However, I have issues with this. On my board, VCCO_2 is 3.3 volts. Ohm's Law says these resistors are going to draw 16.5mA just sitting there. After configuration the CCLK pin becomes a user I/O, and this arrangement will bias the pin smack in the middle of the digital no-man's land voltage range. That's a major no-no, and driving it to either 3.3V or ground per the fifth bullet's recommendation will double the current to 33mA. That's 109 milliwatts. To give perspective on how much that is, the typical 0402 chip resistor is only rated for a maximum dissipation of 100 mW, so that's right out. A typical 0603 chip resistor is rated for 128 mW, so that's 85% of its rated maximum.
I'm not an electrical engineer, so I went searching for good references on transmission line termination. There are a lot of good references, but the single reference I found most helpful is this article (PDF) by Douglas Brooks of UltraCAD Design, Inc. Another is this textbook supplement (PDF) I found at Portland State University. Through these and other articles I came to the conclusion that source termination was likely to be sufficient for my needs, and running some simplistic simulations with LTspice supports that. My layout includes a footprint for a series termination resistor next to the FPGA's CCLK pin. I then hedged my bets by placing footprints for a pair of 0603 resistors at the Flash ROM, just in case.
It may turn out that neither of these steps are necessary. As I understand it (and I may be wrong), reflections and transmission line effects only become problems if the transmission line is longer, time-wise, than a "critical length" equal to half the rise time of the signal. A signal propagates on a stripline transmission line at about 167ps per inch, which gives rise to the "rule of thumb" that any clock track longer than about 3 inches (1 ns round-trip) requires termination. I've placed the Flash ROM so that the CCLK signal is a bit under one inch in length from the FPGA.
No comments:
Post a Comment