Si5351: P1, P2, P3, what's it really all about?
Phil Frost <indigo@...>
Reading AN6918 <https://www.silabs.com/documents/public/application-notes/AN619.pdf>, in configuring the PLL it talks of a fractional multiplier a+b/c. It then has some calculations to arrive at P1, P2, and P3 which are written to the configuration registers. I've been trying to come to some understanding about why this transformation takes place and the consequences.
The equations are:
P1 = 128 x a + floor(128 * b/c) - 512
P2 = 128 * b - c * floor(128 * b / c)
P3 = c
My first observation is P2 can be written more clearly (I think) as:
P2 = (128 * b) mod c
Secondly, only P1 depends on a, and if b/c is allowed to be an improper fraction than it can be simplified to:
P1 = floor(128 * b/c) - 512
Finally, b is always multiplied by 128. If we just say:
f_PLL = f_xtal * b / c / 128
then the equations can be further simplified:
P1 = floor(b / c) - 512
P2 = b mod c
I had assumed "b" must be an integer, and thus the smallest increment that could be represented is 1/1048575. But I don't see that directly stated in the documentation.
If c == 1048575 (as it always is, in the example code) and b is an integer, then as b increases by 1, P2 increases by 128 until it is no longer less than c. Then P1 increments by one and P2 "wraps around".
To illustrate here is a sequence of values, each one incrementing b by 1:
a b c -> P1 P2 P3
30 8190 1048575 -> 3328 1048320 1048575
30 8191 1048575 -> 3328 1048448 1048575
30 8192 1048575 -> 3329 1 1048575
30 8193 1048575 -> 3329 129 1048575
30 8194 1048575 -> 3329 257 1048575
What happens if P1 is set to values between those increments of 128? Equivalently, what if we allow b to be something other than an integer, like 8191.9921875?
30 8191.9921875 1048575 -> 3329 0.0 1048575
This is mathematically valid, does it work? Is there anything in the datasheet or application notes which says we can't do this? Is there any effect on the jitter or other performance?