В примере Приемник Манчестерского Кода показано, как использовать HDL- Verifier™ для разработки, тестирования и проверки модели VHDL Manchester Receiver с возможностями восстановления часов.
Передача цифровых данных часто требует некоторой формы модуляции, чтобы преодолеть пределы в канале физического сигнала. Одним из методов, используемых для модуляции цифровых данных, является Manchester Encoding. Этот метод имеет следующие полезные характеристики:
Синхросигнал передачи может быть легко извлечен из принятых данных.
Закодированный сигнал никогда не производит частотные составляющие вблизи постоянного тока, независимо от данных, что полезно для передачи по каналам, которые требуют связи переменного тока.
Схема кодирования очень проста и безгосударственна.
С отрицательной стороны, кодирование Манчестер требует существенной полосы пропускания (выше предела Шеннона), что имеет тенденцию ограничивать его полезность в беспроводных приложениях. Однако для подключенных приложений, таких как оптическое волокно малой дальности и Ethernet, это часто является хорошим решением.
В следующих разделах обсуждаются:
Manchester Encoding включает передатчик, который кодирует синхроимпульсы и сигналы данных в синхронном битовом потоке, так что каждый бит представляет собой переход сигнала. В следующей таблице показано, как каждая битовая настройка определяется для кодирования:
Переходы в кодировке Манчестер происходят в центре и начале каждого бита. Переход в центре определяется битовым значением, в то время как переход в начале зависит от значения предыдущего бита. Рассмотрим следующую схему:
Как показывают предыдущие кодированные сигналы Манчестер:
Значение 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 значения коррекции фазы в формате plot. Такой график дает визуальное представление блока декодирования. На практике детали этого отображения оказывают сильное влияние на стабильность и эффективность приемника манчестерского кода.
В идеальном случае, когда приемник полностью заблокирован на входящем сигнале, цикл приема составляет 16 циклов, и измеренные значения свертки I/Q довольно легко интерпретировать. Однако циклы данных, которые составляют 15 или 17 циклов в течение длительного времени, создают некоторое смещение в измерении свертки IQ. Возможно настроить измерение I/Q во время этих циклов, но это увеличило бы размер и сложность приемника. Вместо этого цикл сбора данных расширяется или сокращается без изменения декодирования полученных значений. Однако это смещение декодера может создать проблемы с диферингом или снижением помехоустойчивости.
Особое внимание этого примера является VHDL- реализации Приемника манчестерского кода. Декодирование кодированного сигнала Манчестер представляет несколько проблем, наиболее заметной из которых является восстановление часов. Часы встроены в принятый сигнал и должны быть извлечены, чтобы воспроизвести исходный поток данных. Рисунок ниже показывает пример проекта, который разделен на три основных раздела кода VHDL:
Свертка IQ: Дискретизирует принятый сигнал и вычисляет свертку для форм входной (I) и квадратурной (Q) волны. Для каждой формы волны расчет реализуется как сумма операций XOR на выборке и декодированной форме волны, принятой от счетчика состояний.
Декодер: Моделирует комбинаторную схему, которая интерпретирует результаты свертки I/Q.
Счетчик состояний: Генерирует форму I/Q, которая свернута с принятыми сигналами, принимая во внимание фазы ошибки (лаги и выводы), по мере необходимости. Фаза генератора I/Q настраивается так, чтобы она совпадала с входящей кодированной формой волны Манчестер. Чтобы выполнить необходимую настройку, в начале нового цикла счетчик состояний проверяет значение корректировки, add, а затем изменяет период следующего цикла I/Q. Это значение регулировки ограничено добавлением или удалением одного тактового периода из 16 периодов, которые номинально используются для формы волны I/Q.
Следующая временная схема показывает синфазную форму волны, квадратурную форму волны и свернутые результаты без фазы ошибки, задержек данных и выводов данных.
Пример включает три функции MATLAB ®, которые тестируют модель VHDL. Функция MATLAB сопоставляется с каждым из трех компонентов VHDL:
Свертка I/Q: Проверяет, что код свертки I/Q VHDL вычисляет ожидаемый выход для случайным образом сгенерированного потока выборок. Функция MATLAB проверяет это, вычисляя свертку для инфазной и квадратурной формы волны (I_wf и Q_wf). Расчет реализован как XOR и накопление двоичных сигналов.
Декодер: Отображает график отображения 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 с портом сокета portnum. Чтобы установить канал между 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.
Аналогично для сверточника I/Q. Пример скрипта:
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 сущности, которые передаются на испытательный стенд в качестве данных oport. Первая команда силы задает, что clk должен быть установлен на 1 в момент времени равен 0, до 0 через 5 наносекунд, и повторяет цикл от высокого до низкого каждые 10 наносекунд. Вторая и третья команды силы устанавливают сигналы включения и сброса равными 1.
Запускает симуляцию ModelSim для 100 итераций текущего предела. По умолчанию симуляция выполняется в течение 100 наносекунд. Это учитывает фазу запуска.
Инициирует сеанс тестирования MATLAB для загруженного образца сущности iqconv с командой matlabtb. Эта команда является расширением набора команд ModelSim. Команда в примере задает образец сущности iqconv, событие, которое запускает вызов функции MATLAB, функцию MATLAB, которая должна протестировать сущность (manchester_iqconv.m) и коммуникацию сокета TCP с портом сокета portnum. Опция -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). Скрипт создаст выходы checks 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'};
Следующий список определяет каждую команду TCL в tclcmd:
Изменения в директории проекта с возможностью записи.
Корректирует размещение окна ModelSim так, чтобы оно не затеняло окно MATLAB.
Создает библиотеку проекта, если она еще не существует.
Компилирует файл VHDL. Пример скрипта задает опцию -performdefaultbinding, чтобы включить привязки по умолчанию в случае, если они были отключены в файле modelsim.ini. Загружает образец состояния сущности VHDL для тестирования MATLAB с помощью команды vsimmatlab. Эта команда является расширением HDL Verifier для набора команд ModelSim. Опция -t задает разрешение по времени симулятора ModelSim 1 наносекунда (по умолчанию). Применяет команду ModelSim force для управления сигналом clk сущности, который передается на испытательный стенд в качестве данных oport. Команда force задает, что значение clk должно быть установлено равным 1 в момент времени равным 0, до 0 через 5 наносекунд, и повторяет цикл от высокого до низкого каждые 10 наносекунд.
Инициирует сеанс тестирования MATLAB для загруженного образца statecnt сущности с помощью команды matlabtb. Эта команда является расширением набора команд ModelSim. Команда в примере задает statecnt образца сущности, функцию MATLAB, которая должна протестировать коммуникацию сущности (manchester_statecnt.m) и сокета TCP с портом сокета portnum. Чтобы установить связь между 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 завершена (Анализ полученного графика). На этом завершается Manchester руководства пример.