See
http://www.holmea.demon.co.uk/Ethernet/EthernetRx.htm for photos,
docs and schematics of a (just for fun) experimental 10BASE-T receiver
project. It's locking too slowly at the moment. Comments / advice /
suggestions welcome.
I don't think your problem is with your charge pump transistors.
I'm assuming the upper trace in your scope photo is your loop filter
voltage. If it is, then you have at least two problems.
1. At the start of the preamble, the voltage on your loop filter is hitting
its limit. As soon as it limits, the loop response is no longer linear.
2. At the end of the data, the loop is losing lock when it hits the
checksum. If it loses lock at the checksum, it will lose lock when you
replace the 0x55 data with real data. Your phase detector is supposed to
handle nonuniform data, but it looks as though it's not.
I have two suggestions:
1. Since you've got some programming experience, why not write a
time-domain simulator for your PLL? It's not that difficult, and with your
C++ knowledge, you can create classes for the phase detector, charge pump,
loop filter, and VCO. Adding nonlinearities is relatively easy, so you can
include saturation effects and such. Start with ideal models for the logic
and loop filter, and spend your time creating more detailed models for the
charge pump and VCO.
2. There is an initial frequency offset in your system which your step
response is ignoring. The actual input has a ramp (frequency error) in
addition to a step (phase error). The slope of the ramp is proportional to
the frequency offset: larger frequency errors will result in longer lock
times.
Data recovery systems like this are typically implemented with a reference
clock, which provides a frequency close to the data frequency until data
begins arriving. When the preamble begins, the PLL reference is switched
from the reference clock to the data. In many designs, the VCO is stopped
during the switchover time, then restarted in phase with the data. The
effect is that the initial frequency and phase errors are small, so the
loop can lock quickly.
-- Mike --