Моделируйте циклы восстановления синхроимпульса в SerDes Toolbox

В этом примере показано, как создать подробные модели различных типов циклов восстановления синхроимпульса последовательного канала, таких как Alexander (bang-bang), Meuller-Muller и Hogg & Chu.

Блок тактового дискретизатора

Чтобы точно смоделировать цикл восстановления синхроимпульса, представление времени ребра синхроимпульса и связанной дискретизации сигнала данных должно быть максимально точным. Этот пример демонстрирует метод для достижения этого в модели, которая использует фиксированный дискретный шаг расчета шага. Этот метод упакован внутри блока Clocked Sampler, который моделирует как тактовый генератор, так и фиксатор дискретизации данных.

Поведение генератора синхроимпульса и фиксатора дискретизации данных очень сходно для различных типов циклов восстановления синхроимпульса. Но поведение и реализация детектора фазы и цикла фильтра могут варьироваться гораздо шире. Для примера, для цикла восстановления синхроимпульса Александра, обнаружение фазы подавляется при сравнении логических значений, фиксируемых в ребра подъема и падения синхроимпульса. В отличие от этого, обнаружение фазы Хогга и Чу сравнивает синхронизацию ребра падения синхроимпульса со временем пересечения порога данных, и обнаружение фазы Муллера-Мюллера зависит исключительно от дискретизации напряжения со скоростью бод. Структура модели цикла восстановления синхроимпульса делает максимально простой, чтобы учесть эти различия.

Откройте модель SerDesClockRecovery, присоединенную к этому примеру.

open('SerDesClockRecovery.slx');

Чтобы сгенерировать сигнал данных для восстановления синхроимпульса, эта модель использует генератор данных, управляющий аналоговым каналом с потерями. Вставляют дополнительную задержку, чтобы ввести смещение задержки относительно стимула. Сигнал задержки данных управляет одним блоком Clocked Sampler, который подает тактовые частоты и выборки данных на три различных циклических фильтра: фильтр цикла Александра, фильтр цикла Меуллера-Миллера и фильтр цикла Хогга и Чу. Можно отсечь выход любого из этих трех циклических фильтров в качестве сигнала обратной связи для управления тактированным дискретизатором с помощью предоставленных переключателей. Вставьте задержку на одну выборку, чтобы избежать алгебраического цикла.

Используйте возможности отображений, чтобы просмотреть сигнал данных и сигнал обратной связи восстановления синхроимпульса.

В качестве системных объектов реализованы Sampler, Alexander Loop Filter, Meuller-Muller Loop Filter и Hogg & Chu Loop Filter. Пример содержит исходный код для этих классов системных объектов. Эта структура кода была выбрана, чтобы максимально четко представить алгоритмическую зависимость между Clocked Sampler и циклическим фильтром. Чтобы реализовать эту функциональность в приемнике SerDes Toolbox, вы должны объединить алгоритмическое содержимое в один класс объектов, который более похож на класс объектов serdes.cdr.

В пределах Тактируемого Дискретизатора время нарастания и ребра синхроимпульса представлено как число с плавающей точкой, которое вычисляется, чтобы включать фазу себя эффекты частоты шума и смещения синхроимпульса, а также сигнал управления смещением периода. Когда время на фронте синхроимпульса больше, чем время предыдущей выборки, но меньше, чем время текущей выборки, сигнал данных во времени на фронте синхроимпульса дискретизируется с помощью линейной интерполяции между текущим и предыдущим значениями сигнала данных. Увеличение значения выборки ребра, падение значения выборки ребра, тактовые значения сигналов и записанное тактовое время обновляются в шаг расчета после каждого тактового ребра. Синхронизация в цикл фильтре не является критической, и обработка цикла фильтра может быть выполнена в шаг расчета, когда цикл фильтр получает переход синхроимпульса.

Восстановление часов Александра (Bang-Bang)

Цикл восстановления синхроимпульса Александра обнаруживает фазу синхроимпульса путем определения, совпадает ли знак сигнала данных на падающем ребре синхроимпульса со знаком сигнала данных на подъемном фронте синхроимпульса, который произошел либо до, либо после падающего ребра. Если знак на падающем ребре совпадает со знаком на предыдущем поднимающемся ребре, но не последующий поднимающееся ребро, то часы ранние. И наоборот, если знак на падающем ребре совпадает со знаком на последующем поднимающемся ребре, но не со знаком на предыдущем поднимающемся ребре, то часы опаздывают. Фильтр цикла является счетчиком вверх-вниз, который производит или положительный (ранний) или отрицательный (поздний) импульс, когда он переполнен. Для получения подробного объяснения цикла восстановления синхроимпульса Александра смотрите Часы и Восстановление данных в системе SerDes.

Начальное строение модели SerDesClockRecovery выбирает выход фильтра Alexander цикла, чтобы управлять фазой синхроимпульса в тактовом дискретизаторе.

Запустите симуляцию и постройте график истории времени и гистограммы восстановленной фазы синхроимпульса. Сохраните историю времени восстановленной фазы синхроимпульса в базовом рабочем пространстве, чтобы можно было анализировать ее по своему выбору.

simout = sim(gcs);
ctBB = plotClockTimes(simout);

Восстановление часов Meuller-Muller

Алгоритм восстановления синхроимпульса Меуллера-Мюллера принимает, что сигнал данных изменяется быстрее всего, когда происходит переход между значениями символов данных, такими как переход от единицы к нулю для сигнала данных NRZ. Это предположение позволяет циклу восстановления синхроимпульса использовать одно количественное напряжение на символ, что является преимуществом при высоких скоростях передачи данных. Оценка временной ошибки для контурного фильтра Меуллера-Мюллера в примере получена из ЧАСОВ И ВОССТАНОВЛЕНИЯ ДАННЫХ ДЛЯ ВЫСОКОСКОРОСТНЫХ ПРИЕМНИКОВ НА ОСНОВЕ АЦП, раздел 2.3.1

$$\tau_A = \left(y_{i-1}\hat{y}_i\right) -
\left(y_i\hat{y}_{i-1}\right)$$

где$y_{i-1}$ - предыдущая выборка напряжения$y_i$, - выборка напряжения тока, -$\hat{y}_{i-1}$ предыдущее фиксированное значение символа и -$\hat{y}_i$ текущее фиксированное значение символа.

Чтобы оценить ответ цикла восстановления синхроимпульса Meuller-Muller, переместите переключатель Filter Select 1 к своему второму входному порту. Запустите симуляцию и добавьте историю времени восстановленной фазы синхроимпульса и гистограмму фазы синхроимпульса к рисункам, которые уже были созданы для цикла восстановления синхроимпульса Александра. Сохраните историю времени фазы синхроимпульса в базовом рабочем пространстве, чтобы можно было анализировать ее позже.

set_param([gcs '/Filter Select 1'],'sw','0');
simout = sim(gcs);
ctMM = plotClockTimes(simout);

Восстановление часов Hogg & Chu

Алгоритм восстановления синхроимпульса Hogg & Chu выполняет относительно прямое измерение фазы синхроимпульса путем измерения времени между пороговым пересечением сигнала данных и падающим ребром восстановленного синхроимпульса. В то время как блоки могут быть добавлены к модели примера, чтобы измерить пороговое время пересечения сигнала данных непосредственно, фильтр цикла Hogg & Chu в этом примере использует упрощающее приближение, что наклон сигнала данных в области пересечения порога является постоянным. Как было оценено, когда пороговое пересечение было подтверждено выборкой на следующем ребре синхроимпульса, временная ошибка

$$\tau_A = \frac{\hat{y}_{i-1}v_{f,i}}{v_{max}}$$

где$\hat{y}_{i-1}$ является ранее обнаруженным значением символа данных$v_{f,i}$, является напряжением, записанным на предыдущем ребре синхроимпульса, и является$v_{max}$ максимальной амплитудой сигнала данных.

Чтобы оценить обратный вызов цикла восстановления синхроимпульса Hogg & Chu, переместите переключатель Fiter Select 2 к своему второму входному порту. Запустите симуляцию и добавьте историю времени восстановленной фазы синхроимпульса и гистограмму фазы синхроимпульса к рисункам, которые уже были созданы для циклов восстановления синхроимпульса Александра и Мюллера. Сохраните историю времени фазы синхроимпульса в базовом рабочем пространстве, чтобы можно было анализировать ее позже.

set_param([gcs '/Filter Select 2'],'sw','0');
simout = sim(gcs);
ctHC = plotClockTimes(simout);