Пример манчестерского приемника показывает, как использовать Verifier™ HDL для проектирования, тестирования и проверки модели манчестерского приемника VHDL с возможностями восстановления часов.
Передача цифровых данных часто требует некоторой формы модуляции для преодоления ограничений в физическом канале сигнала. Одной из методик, используемых для модуляции цифровых данных, является манчестерское кодирование. Этот метод имеет следующие полезные характеристики:
Тактовый сигнал передачи может быть легко извлечен из принятых данных.
Кодированный сигнал никогда не создает частотные компоненты вблизи постоянного тока, независимо от данных, которые полезны для передачи по каналам, которые требуют связи переменного тока.
Схема кодирования очень проста и не имеет состояния.
С отрицательной стороны, манчестерское кодирование требует существенной полосы пропускания (выше предела Шеннона), что имеет тенденцию ограничивать его полезность в беспроводных приложениях. Однако для подключенных приложений, таких как ближнее оптическое волокно и Ethernet, это часто является хорошим решением.
В следующих разделах рассматриваются:
Манчестерское кодирование включает в себя передатчик, который кодирует тактовые сигналы и сигналы данных в синхронном битовом потоке, так что каждый бит представляет собой переход сигнала. В следующей таблице показано, как каждый бит задается для кодирования:

Переходы в кодировке Манчестера происходят в центре и начале каждого бита. Переход в центре определяется битовым значением, в то время как переход в начале зависит от значения предыдущего бита. Рассмотрим следующую схему:

Как показывают предшествующие манчестерские кодированные сигналы:
Значение 1 для первого бита вынуждает переход от высокого к низкому в центре этого бита.
Значение 0 для второго бита вынуждает переход от низкого к высокому в центре этого бита, и, поскольку первый бит переходил от высокого к низкому, переход не происходит в начале этого бита.
Значение 0 для третьего бита вынуждает переход от низкого к высокому в центре этого бита, и поскольку второй бит переходил от низкого к высокому, переход от высокого к низкому происходит в начале этого бита.
Значение 1 для четвертого бита вынуждает переход от высокого к низкому в центре этого бита, и, поскольку третий бит переходил от низкого к высокому, переход не происходит в начале этого бита.
Значение 0 для пятого бита вынуждает переход от низкого к высокому в центре этого бита, и, поскольку четвертый бит переходил от высокого к низкому, переход не происходит в начале этого бита.
Устройство, которое принимает кодированный битовый поток, отвечает за декодирование битового потока путем разделения тактового сигнала и информации данных. В большинстве случаев приемник должен извлечь исходный поток данных, используя только кодированный сигнал. Это упрощает канал связи, но означает, что приемник должен преодолеть следующее:
Различия между тактовым сигналом, используемым для кодирования сигнала, и тактовым сигналом в приемнике (см. рисунок ниже).
Эти часы могут быть близки по частоте, но возникают небольшие частотные ошибки.
Фаза между часами будет произвольной.

В примере манчестерского приемника проверяются вычисления, выполняемые устройством манчестерского приемника, которое моделируется в VHDL и моделируется в ModelSim ®. Имеются многочисленные подходы для реализации манчестерского приемника. В этом примере используется шлейф блокировки задержки (DLL), который требует, чтобы приемник использовал тактовый сигнал, очень близкий по частоте к тактовому сигналу передачи. Это приводит к простой схеме восстановления тактового сигнала, которая имеет ограниченный частотный диапазон блокировки.
Приемник выполняет избыточную выборку принятого потока данных с 16-кратной скоростью передачи данных. Таким образом, тактовый сигнал приема должен иметь номинальный период 1/16 периода данных. Для компенсации незначительных разностей между часами передачи и приема или сдвигов в задержке канала приемник корректирует свой период данных до одного такта (+/-) за период данных. Таким образом, приемник может использовать 15, 16 или 17 тактовых циклов для восстановления данных, закодированных из входящего дискретизированного сигнала. Например, если синхросигнал приемника немного быстрее, чем синхросигнал передатчика (ошибка частоты), циклу приема иногда необходимо добавить дополнительный тактовый цикл для компенсации.
Большие внезапные фазовые ошибки, такие как ошибки, возникающие во время запуска, требуют нескольких периодов данных для получения хорошей блокировки сигнала. Ограничивая максимальную фазовую коррекцию 1/16 от общего периода данных, приемник может быть медленным для коррекции больших фазовых ошибок.
Декодирование принятого манчестерского сигнала может происходить несколькими способами, но подход, принятый в этом примере, заключается в рассмотрении манчестерского кодирования как цифровой фазовой модуляции с двумя символами: + 180 и -180 градусов. Свернув входящий сигнал с опорной фазой (I) и квадратурной (Q) формой сигнала на частоте модуляции, можно извлечь данные и извлечь информацию о любых фазовых ошибках в принятой форме сигнала. После одного цикла данных приемник вычисляет два значения (называемые в коде VHDL как Isum и Qsum), которые являются измерениями значения свертки I/Q. Затем приемник декодирует значения для прогнозирования:
Исходное значение передаваемых данных для цикла
Оценка фазовой ошибки между входящим сигналом и периодом данных приемника
Критическим аспектом этой конструкции является интерпретация значений свертки I/Q. В конце цикла приема данных приемник преобразует значения I/Q в оценку передаваемых данных и фазовой ошибки. Одним из способов представления этой информации является отображение этих интерпретаций в виде графиков в сравнении с измеренными значениями I/Q.
Данные считаются недействительными, если измеренные I и Q полностью неоднозначны относительно закодированного значения данных.
Аналогичным образом можно создать отображение I/Q значения фазовой коррекции в формате графика. Такой график дает визуальное представление блока декодирования. На практике детали этого картирования оказывают сильное влияние на стабильность и производительность манчестерского приемника.
В идеальном случае, когда приемник полностью зафиксирован на входящем сигнале, цикл приема составляет 16 циклов, и измеренные значения I/Q свертки довольно легко интерпретировать. Однако циклы данных длиной 15 или 17 циклов создают некоторое смещение в измерении IQ свертки. Можно настроить измерение I/Q в течение этих циклов, но это увеличит размер и сложность приемника. Вместо этого цикл сбора данных расширяется или сокращается без изменения при декодировании результирующих значений. Однако это смещение декодера может создавать проблемы с искажением или уменьшенной помехоустойчивостью.
Основное внимание в этом примере уделяется реализации VHDL манчестерского приемника. Декодирование манчестерского кодированного сигнала представляет несколько проблем, наиболее заметной из которых является восстановление тактового сигнала. Тактовый сигнал встроен в принятый сигнал и должен быть извлечен для воспроизведения исходного потока данных. На рисунке ниже показан пример конструкции, разделенный на три основных раздела кода VHDL:
IQ-конвольвер: Отсчитывает принятый сигнал и вычисляет свертку для синфазных (I) и квадратурных (Q) сигналов. Для каждого сигнала вычисление выполняется как сумма операций исключающее ИЛИ над выборкой и декодированным сигналом, принятым от счетчика состояний.
Декодер: моделирует комбинаторную схему, которая интерпретирует результаты I/Q свертки.
Счетчик состояния: Генерирует сигналы I/Q, свернутые с принимаемыми сигналами, с учетом фазовых ошибок (задержки и выводы), при необходимости. Фаза генератора I/Q регулируется так, чтобы соответствовать входящей кодированной манчестерской форме сигнала. Чтобы выполнить необходимую регулировку, в начале нового цикла счетчик состояний проверяет значение регулировки, adj, а затем изменяет период следующего I/Q цикла. Это значение регулировки ограничено добавлением или удалением одного периода синхронизации из 16 периодов, которые номинально используются для формы сигнала I/Q.

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

Пример включает три функции MATLAB ®, которые тестируют модель VHDL. Функция MATLAB соответствует каждому из трех компонентов VHDL:
Свертыватель I/Q: Проверяет, что код свертывателя I/Q VHDL вычисляет ожидаемый выходной сигнал для случайно сформированного потока выборок. Функция MATLAB проверяет это путем вычисления свертки для синфазных и квадратурных сигналов (I_wf и Q_wf). Вычисление реализуется как исключающее ИЛИ и накопление двоичных сигналов.
Декодер: Отображает график отображения I/Q, сгенерированный декодером для визуальной проверки.
Счетчик состояния: Генерирует синфазные и квадратурные сигналы. Во время испытательного стенда эта функция MATLAB полностью контролирует сигналы, подаваемые во время моделирования, включая генерацию синхросигналов, сброс и т.д.
Пример запускает сервер MATLAB, hdldaemon, так что он использует TCP-соединение сокета с номером порта сокета, идентифицированным как доступный операционной системой.
hdldaemon('socket',0) % Activate MATLAB server to accept foreign VHDL calls
HDLDaemon socket server is running on port 4040 with 0 connections
Затем в примере вызывается hdldaemon с опцией status, чтобы получить назначенный номер порта и сохранить его в portnum для использования в будущем.
dstat = hdldaemon('status');
portnum = dstat.ipc_id;
HDLDaemon socket server is running on port 4040 with 0 connections
Как серверная, так и клиентская части канала приложения должны использовать один и тот же номер порта. Таким образом, в какой-то момент примерной программе необходимо переслать номер порта в ModelSim.
Первым компонентом тестируемой модели манчестерского приемника является декодер. Сценарий создает 2 графика передаточной функции этого объекта. Этот тест является просто визуализацией поведения декодера. Пример сценария:
1. Устанавливает флаг testisdone равным 0 и отображает информационные сообщения.
global testisdone;
testisdone = 0;
2. Задает папку проекта, которая имеет доступ на запись и подходит для хранения проекта ModelSim.
projectdir = pwd;
3. Изменение формата каталога проекта и спецификации файла VHDL декодера на формат UNIX ®, используемый ModelSim и Tcl, путем замены обратных косых черт (\) на прямые косые черты (/).
unixprojectdir = ['"' strrep(projectdir,'\','/') '"']; unixsrcfile = ['"' ... strrep(fullfile(matlabroot,'toolbox','edalink','extensions','modelsim',... 'modelsimdemos','vhdl','manchester','decoder.vhd'),'\','/') ... '"'];
4. Определяет последовательность команд Tcl, выполняемых в контексте ModelSim.
tclcmd = { ['cd ' unixprojectdir ],...
'vlib work',...
['vcom -performdefaultbinding ' unixsrcfile],...
'vsimmatlab work.decoder',...
['matlabtb decoder -mfunc manchester_decoder -socket ',num2str(portnum)],...
'run 3000',...
'quit -f'};
Предыдущий список определяет каждую команду:
Изменения в каталоге проекта с возможностью записи.
Корректирует размещение окна ModelSim так, чтобы оно не скрывало окно MATLAB.
Создает работу библиотеки проекта, если она еще не существует.
Компилирует файл VHDL. Сценарий-пример задает параметр performdefaultbinding, чтобы включить привязки по умолчанию в случае, если они были отключены в файле modelsim.ini.
Загружает экземпляр декодера объектов VHDL для тестового стенда MATLAB с помощью команды vsimmatlab. Эта команда является расширением HDL Verifier для набора команд ModelSim.
Инициирует сеанс тестирования MATLAB для загруженного экземпляра декодера объектов с помощью команды matlabtb. Эта команда является расширением набора команд ModelSim. Команда в примере указывает экземпляр объекта, функцию MATLAB, которая должна тестировать объект (manchester_decoder.m), и связь сокета TCP с портом порта сокета. Чтобы установить связь между ModelSim и MATLAB, значение portnum должно соответствовать порту сокета, указанному при запуске сервера MATLAB (hdldaemon).
Выполняет моделирование ModelSim для 3000 итераций текущего предела разрешения. По умолчанию моделирование выполняется в течение 3000 наносекунд. Выход из ModelSim без запроса подтверждения.
5. Запускает ModelSim для использования с HDL Verifier с вызовом vsim.
vsim('startupfile','decoder.do','tclstart',tclcmd);
Эта команда запускает ModelSim с помощью сценария команды Tcl, который выполняет некоторые команды запуска общего назначения, а затем пользовательские команды, заданные свойством «tclstart». Свойство «» startfile «» заставляет vsim записать весь сценарий команды Tcl запуска для decoder.do для использования в будущем.
6. Отображает информационные сообщения и ожидает завершения выполнения (manchester_decoder.m).
disp('Waiting for testing of ''decoder.vhd'' to complete'); disp('(flag from manchester_decoder.m indicates completion)'); while testisdone == 0, pause(0.501); end disp('MATLAB test of decoder.vhd is complete!'); disp('Check the generated plot for results.');
Waiting for testing of 'decoder.vhd' to complete (flag from manchester_decoder.m indicates completion) done MATLAB test of decoder.vhd is complete! Check the generated plot for results.

Аналогично для сверточного устройства ввода/вывода. Пример сценария:
1. Устанавливает флаг testisdone равным 0 и отображает информационные сообщения.
testisdone = 0;
2. Задает папку проекта, которая имеет доступ на запись и подходит для хранения проекта ModelSim.
projectdir = pwd;
3. Изменение формата каталога проекта и спецификации файла VHDL декодера на формат UNIX, используемый ModelSim и Tcl, путем замены обратных косых черт (\) на прямые косые черты (/).
unixprojectdir = ['"' strrep(projectdir,'\','/') '"']; unixsrcfile = ['"' ... strrep(fullfile(matlabroot,'toolbox','edalink','extensions','modelsim',... 'modelsimdemos','vhdl','manchester','iqconv.vhd'),'\','/') ... '"'];
4. Определяет последовательность команд Tcl, выполняемых в контексте ModelSim.
tclcmd = { ['cd ' unixprojectdir ],...
'vlib work',...
['vcom -performdefaultbinding ' unixsrcfile],...
'vsimmatlab work.iqconv',...
'force /iqconv/clk 1 0, 0 5 ns -repeat 10 ns ',...
'force /iqconv/enable 1',...
'force /iqconv/reset 1',...
'run 100',...
['matlabtb iqconv -rising /iqconv/clk -mfunc manchester_iqconv -socket ',num2str(portnum)],...
'run 1000',...
'quit -f'};
Каждая команда определяется в следующем списке:
Изменения в каталоге проекта с возможностью записи.
Корректирует размещение окна ModelSim так, чтобы оно не скрывало окно MATLAB.
Создает работу библиотеки проекта, если она еще не существует.
Компилирует файл VHDL. Сценарий-пример задает параметр -performdefaultbinding, чтобы включить привязки по умолчанию в случае, если они были отключены в файле modelsim.ini.
Загружает экземпляр объекта VHDL iqconv для тестового стенда MATLAB с помощью команды vsimmatlab. Эта команда является расширением HDL Verifier для набора команд ModelSim.
Применяет команду ModelSim force для управления сигналами clk, enable и reset объекта, которые передаются на тестовый стенд в качестве данных порта. Первая команда силы указывает, что clk должен быть установлен в 1 в момент времени, равный 0, 0 через 5 наносекунд, и повторять цикл от высокого до низкого каждые 10 наносекунд. Вторая и третья команды силы устанавливают сигналы включения и сброса на 1.
Выполняет моделирование ModelSim для 100 итераций текущего предела. По умолчанию моделирование выполняется в течение 100 наносекунд. Это относится к фазе запуска.
Инициирует сеанс тестового стенда MATLAB для загруженного экземпляра объекта iqconv с помощью команды matlabtb. Эта команда является расширением набора команд ModelSim. Команда в примере указывает экземпляр объекта iqconv, событие, которое инициирует вызов функции MATLAB, функцию MATLAB, которая должна тестировать объект (manchester_iqconv.m), и связь TCP-сокета с портом порта сокета. Опция -rising указывает, что функция MATLAB вызывается, когда clk испытывает передний фронт. Чтобы установить связь между ModelSim и MATLAB, значение, указанное в -socket, должно соответствовать порту сокета, который был указан при запуске сервера MATLAB (hdldaemon).
Выполняет моделирование ModelSim для 1000 итераций текущего предела разрешения. По умолчанию моделирование выполняется в течение 1000 наносекунд.
Выход из ModelSim без запроса подтверждения.
5. Запускает ModelSim для использования с HDL Verifier с вызовом vsim.
vsim('startupfile','iqconv.do','tclstart',tclcmd);
Эта команда запускает ModelSim с помощью сценария команды Tcl, который выполняет некоторые команды запуска общего назначения, а затем пользовательские команды, заданные свойством «tclstart». Свойство «» startfile «» заставляет vsim записать весь сценарий команды Tcl запуска для iqconv.do для использования в будущем.
6. Отображает информационные сообщения и ожидает завершения выполнения (manchester_iqconv.m).
disp('Waiting for testing of ''iqconv.vhd'' to complete'); disp('(flag from manchester_iqconv.m indicates completion)'); while testisdone == 0, pause(0.501); end disp('Test of iqconv.vhd complete (If it failed, there would be an error message printed above)!');
Waiting for testing of 'iqconv.vhd' to complete (flag from manchester_iqconv.m indicates completion) Test of iqconv.vhd complete (If it failed, there would be an error message printed above)!
Теперь протестируем счетчик состояний (statecnt.vhd). Скрипт создает выходные сигналы проверочного isum и qsum для случайно сформированного потока выборок данных и устанавливает флаг testisdone равным 0 и отображает информационные сообщения.
testisdone = 0; projectdir = pwd; unixprojectdir = ['"' strrep(projectdir,'\','/') '"']; unixsrcfile = ['"' ... strrep(fullfile(matlabroot,'toolbox','edalink','extensions','modelsim','modelsimdemos',... 'vhdl','manchester','statecnt.vhd'),'\','/') ... '"']; tclcmd = { ['cd ' unixprojectdir ],... 'vlib work',... ['vcom -performdefaultbinding ' unixsrcfile],... 'vsimmatlab -t 1ns work.statecnt ',... 'force /statecnt/clk 1 0, 0 5 ns -repeat 10 ns ',... ['matlabtb statecnt -mfunc manchester_statecnt -socket ',num2str(portnum)],... 'run 30000',... 'quit -f'};
Каждая команда РУД в tclcmd определяется следующим списком:
Изменения в каталоге проекта с возможностью записи.
Корректирует размещение окна ModelSim так, чтобы оно не скрывало окно MATLAB.
Создает работу библиотеки проекта, если она еще не существует.
Компилирует файл VHDL. Сценарий-пример задает параметр -performdefaultbinding, чтобы включить привязки по умолчанию в случае, если они были отключены в файле modelsim.ini. Загружает экземпляр состояния объекта VHDL для тестового стенда MATLAB с помощью команды vsimmatlab. Эта команда является расширением HDL Verifier для набора команд ModelSim. Опция -t задает временное разрешение симулятора ModelSim, равное 1 наносекунде (по умолчанию). Применяет команду ModelSim force для управления сигналом clk объекта, который передается на тестовый стенд в качестве данных порта. Команда force указывает, что clk должен быть установлен в 1 в момент времени, равный 0, 0 через 5 наносекунд, и повторять цикл от высокого до низкого каждые 10 наносекунд.
Инициирует сеанс тестового стенда MATLAB для загруженного экземпляра объекта statecnt с помощью команды matlabtb. Эта команда является расширением набора команд ModelSim. Команда в примере указывает состояние экземпляра объекта, функцию MATLAB, которая должна тестировать объект (manchester_statecnt.m), и связь сокета TCP с портом порта сокета. Чтобы установить связь между ModelSim и MATLAB, значение, указанное в -socket, должно соответствовать порту сокета, который был указан при запуске сервера MATLAB (hdldaemon).
Выполняет моделирование ModelSim для 30000 итераций текущего предела разрешения. По умолчанию моделирование выполняется в течение 30000 наносекунд.
Выход из ModelSim без запроса подтверждения.
vsim('startupfile','statecnt.do','tclstart',tclcmd); disp('Waiting for testing of ''statecnt.vhd'' to complete'); disp('(flag from manchester_statecnt.m indicates completion)'); while testisdone == 0, pause(0.501); end disp('MATLAB test of statecnt.vhd is complete!'); disp('Check the generated plot for results.');
Waiting for testing of 'statecnt.vhd' to complete (flag from manchester_statecnt.m indicates completion) MATLAB test of statecnt.vhd is complete! Check the generated plot for results.

Убить hdldaemon
hdldaemon('KILL');
HDLDaemon server was shutdown
Проверка statecnt.vhd завершена (Проверить полученный график). На этом завершается пример манчестерского учебного пособия.