Main Content


Performs clock data recovery function


The serdes.CDR System 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:

  1. Create the serdes.CDR object and set its properties.

  2. Call the object with arguments, as if it were a function.

To learn more about how System objects work, see What Are System Objects?



cdr = serdes.CDR 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 waveform.

cdr = serdes.CDR(Name,Value) sets properties using one or more name-value pairs. Enclose each property name in quotes. Unspecified properties have default values.

Example: cdr = serdes.CDR('Count',8) returns a CDR object with early or late CDR count threshold of 8.


expand all

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.


Determine the CDR order to enable phase and frequency tracking.

  • 1st order — Only tracks the phase.

  • 2nd order — Tracks both the phase and frequency.

Early or late CDR count threshold to trigger a phase update, specified as a unitless real positive integer ≥4. Increasing the value of Count 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).

Count also controls the bandwidth of the CDR which is approximately calculated by using the equation:

Bandwidth=1Symbol time · Early/late threshold count · Step

Data Types: double

Clock phase resolution, specified as a real scalar in fraction of symbol time. Step is the inverse of the number of phase adjustments in CDR.

Data Types: double

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).

Data Types: double

Reference clock offset impairment, specified as a real scalar ≤300 in parts per million (ppm). ReferenceOffset is the deviation between transmitter oscillator frequency and receiver oscillator frequency.

Data Types: double

Sampling latch meta-stability voltage, specified as a real scalar in volts. If the data sample voltage lies within the region (+/-Sensitivity), there is a 50% probability of bit error.

Data Types: double

Clock phase detector option used in the clock data recovery. You can choose between bang-bang (Alexander) or baud-rate type-A (Mueller-Muller).

Internal gain for the frequency tracking loop, specified as a nonnegative real scalar.

Data Types: double

Once every FrequencyCount symbols, update the system phase rotator clock with the frequency estimate.

Data Types: double


Time of a single symbol duration, specified as a real scalar in s.

Data Types: double

Uniform time step of the waveform, specified as a real scalar in s.

Data Types: double

Modulation value that specifies the modulation scheme, the number of logic levels in the encoded signal, specified as 2, 3, 4, 8, or 16.

Modulation ValueModulation Scheme
2Non-return to zero (NRZ)
3Three-level pulse amplitude modulation (PAM3)
4Four-level pulse amplitude modulation (PAM4)
8Eight-level pulse amplitude modulation (PAM8)
16Sixteen-level pulse amplitude modulation (PAM16)


According to IBIS BIRD (Buffer Issue Resolution Document) 213, IBIS-AMI models support any level of signaling from PAM2 (NRZ) to upwards, collectively known as PAMn. If your EDA tool supports it, you can export IBIS-AMI models supporting modulation schemes NRZ, PAM3, PAM4, PAM8, or PAM16.

Data Types: double

Input wave type form:

  • 'Sample' — A sample-by-sample input signal.

  • 'Impulse' — An impulse response input signal.

Data Types: char




y = cdr(x)

Input Arguments

expand all

Input baseband signal. The input to the CDR must be applied as one sample at a time and not as a vector.

Output Arguments

expand all

Relative recovered clock phase, returned as a units of Symbol Time in the range [0,1].

AMI clock bus, returned as a structure.

clockTimeTime taken to sample the data signal.
clockValidOnRisingValid clock time value on the rising edge of a signal.

Bus containing additional interior CDR signals, returned as a structure.

clockPhaseRelative clock phase in units of SymbolTime in the range of [0,1].
symbolRecoveredSymbol recovered from data signal at ClockTime.
voltageSampleVoltage observed from the data signal at ClockTime.
PAM4ThresholdThe estimated upper eye at PAM4 threshold.
CDRedgeVoltageThe voltage observed from the data signal at ClockTimeSymbolTime/2.
CDRCounterThe bang-bang CDR internal counter used to trigger samples.
CDREarlyLateCountThe bang-bang CDR accumulated (or filtered) signal used to trigger updated to the CDR phase.
PAMSymbolMiddleVoltageEstimated PAM4 symbol voltage of the inner eye outer envelope to estimate PAM threshold.
PAMSymbolOuterVoltageEstimated PAM4 outer envelope voltage to estimate PAM threshold.
EyeHeightAbsAveEstimates eye height.
PAMThresholdArray of PAM thresholds for each eye in the PAMn modulation. If the modulation scheme is PAMn, the first (n-1) eyes contain the valid thresholds. The rest of the entries are zero-padded.
PhaseErrorPhase detector error.
FreqEstimateFrequency estimate for the 2nd order or frequency tracking loop.

Object Functions

To use an object function, specify the System object as the first input argument. For example, to release system resources of a System object named obj, use this syntax:


expand all

stepRun System object algorithm
releaseRelease resources and allow changes to System object property values and input characteristics
resetReset internal states of System object


collapse all

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,...

Create a random data pattern using a pseudorandom binary sequence of order 10.

ord = 10;                       %PRBS order
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,...

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;

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,[]);
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,
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')

More About

expand all

Extended Capabilities

Version History

Introduced in R2019a