Performs clock data recovery function
object™ provides clock sampling times and estimates data symbols at the receiver using a
first order phase tracking CDR model. For more information, see
Clock and Data Recovery in SerDes System.
To provide clock data locations:
serdes.CDR object and set its properties.
Call the object with arguments, as if it were a function.
To learn more about how System objects work, see What Are System Objects? (MATLAB).
returns a CDR object that
determines the clock sampling times and estimates the data symbol according to the
Bang-Bang CDR algorithm. It does not return or modify the incoming
cdr = serdes.CDR
cdr = serdes.CDR(
returns a CDR object with each specified property set to specific value. Unspecified
properties have default values.
cdr = serdes.CDR('Count',8)
Unless otherwise indicated, properties are nontunable, which means you cannot change their
values after calling the object. Objects lock when you call them, and the
release function unlocks them.
If a property is tunable, you can change its value at any time.
For more information on changing property values, see System Design in MATLAB Using System Objects (MATLAB).
Count— Early or late CDR count threshold to trigger phase update
16(default) | real positive integer ≥4
Early or late CDR count threshold to trigger a phase update, specified as a
unitless real positive integer ≥4. Increasing the value of
provides a more stable output clock phase at the expense of convergence speed. Because
the bit decisions are made at the clock phase output, a more stable clock phase has a
better bit error rate (BER).
Early/late count threshold also controls the bandwidth of the CDR which is approximately calculated by using the equation:
Step— Clock phase resolution
0.0078(default) | real scalar
Clock phase resolution, specified as a real scalar in fraction of symbol time.
Step is the inverse of the number of phase adjustments in
PhaseOffset— Clock phase offset
0(default) | real scalar in the range [-0.5,0.5]
Clock phase offset, specified as a real scalar in the range [-0.5,0.5] in fraction
of symbol time.
PhaseOffset is used to manually shift clock
probability distribution function (PDF) for better bit error rate (BER).
ReferenceOffset— Reference clock offset impairment
0(default) | real scalar ≤300
Reference clock offset impairment, specified as a real scalar ≤300 in parts per
ReferenceOffset is the deviation between
transmitter oscillator frequency and receiver oscillator frequency.
Sensitivity— Sampling latch meta-stability voltage
0(default) | real scalar
Sampling latch meta-stability voltage, specified as a real scalar in volts. If the
data sample voltage lies within the region (+/-
there is a 50% probability of bit error..
SymbolTime— Time of single symbol duration
1e-10(default) | real scalar
Time of a single symbol duration, specified as a real scalar in s.
SampleInterval— Uniform time step of waveform
6.25e-12(default) | real scalar
Uniform time step of the waveform, specified as a real scalar in s.
Modulation— Modulation scheme
Modulation scheme, specified as
|Modulation Value||Modulation Scheme|
|Non-return to zero (NRZ)|
|Four-level pulse amplitude modulation (PAM4)|
WaveType— Input wave type form
Input wave type form:
'Sample' — A sample-by-sample input signal.
'Impulse' — An impulse response input signal.
x— Input baseband signal
Input baseband signal. The input to the CDR must be applied as one sample at a time and not as a vector.
To use an object function, specify the
object as the first input argument. For
example, to release system resources of a System
This example shows how to recover clock distribution using
serdes.CDR system object™.
Use a symbol time of
100 ps and
16 samples per symbol. The channel has
5 dB loss.
SymbolTime = 100e-12; SamplesPerSymbol = 16; dt = SymbolTime/SamplesPerSymbol; loss = 5; chan = serdes.ChannelLoss('Loss',loss,'dt',dt,... 'TargetFrequency',1/SymbolTime/2,'RiseTime',SamplesPerSymbol/4*dt);
Create a random data pattern using a pseudorandom binary sequence of order 10.
ord = 10; %PRBS order nrz=prbs(ord,2^ord-1); nrzPattern = nrz(:)' - 0.5; %[0,1] --> [-0.5,0.5]; ChannelPulseResponse = impulse2pulse(chan.impulse, SamplesPerSymbol, dt); waveprbs = pulse2wave(ChannelPulseResponse(:,1),nrzPattern,SamplesPerSymbol); wave2 = [waveprbs; waveprbs];
Create the CDR object that utilizes NRZ modulation scheme.
CDR1 = serdes.CDR('Modulation',2,'Count',8,'Step',1/64,... 'SymbolTime',SymbolTime,'SampleInterval',dt);
Initialize the outputs.
phase = zeros(1,length(wave2)); CDRearlyLateCount = zeros(1,length(wave2));
Feed the waveform one sample at a time through the CDR object.
for ii = 1:length(wave2) [phase(ii), ~, optional] = CDR1(wave2(ii)); CDRearlyLateCount(ii) = optional.CDRearlyLateCount; end
Plot the eye diagram with recovered clock distribution, clock phase vs. time, and early/late count threshold vs. time.
t = (0:length(wave2)-1)/SamplesPerSymbol; teye = (0:SamplesPerSymbol-1)/SamplesPerSymbol; eyed = reshape(wave2,SamplesPerSymbol,); figure, subplot(2,2,[1,3]), yyaxis left, plot(teye,eyed, '-b'), title('Eye Diagram with Recovered Clock Distribution') xlabel('Symbol Time'), ylabel('Voltage') yyaxis right, histogram(phase,SamplesPerSymbol/2) set(gca,'YTick',) subplot(2,2,2), plot(t,phase) xlabel('Number of Symbols'), ylabel('Symbol Time'); title('Clock Phase vs. Time') subplot(224), plot(t,CDRearlyLateCount) xlabel('Number of Symbols'), ylabel('Count') title('Early/Late Count Threshold vs. Time')
Usage notes and limitations:
IBIS-AMI codegen is not supported in MAC.