Основанная на PLL генерация прерывания от входа FPGA

В этом примере показано, как Simulink® Real-Time™ может управлять целевым приложением не только с прерываниями на основе его внутреннего таймера, но также и с прерываниями на основе внешнего сигнала.

В самом простом варианте использования мы хотели бы запуститься, приложение реального времени синхронизировалось 1-1 с внешним сигналом; например, каждый раз, когда мы получаем возрастающее ребро от внешнего сигнала, прерывание сгенерировано, который затем запускает один шаг приложения. Используя замкнутый цикл фазы (PLL), мы можем управлять приложением реального времени на частоте, которая отличается от входной частоты, но в то же время синхронизировалась с внешним сигналом. Например, у нас может быть внешний сигнал на уровне 600 Гц, но мы хотели бы запустить приложение на уровне 2 кГц.

Этот пример использует основанный на FPGA модуль ввода-вывода Speedgoat (Speedgoat IO331) и цифровой PLL, смоделированный в Simulink®. Из модели HDL Coder™ генерирует и синтезирует HDL-код. Можно использовать любой модуль ввода-вывода FPGA, поддержанный Simulink Real-Time и HDL Coder, который встречает скорости, размеру и требованиям схемы контактов модели.

Требования и предусловия

  • HDL Coder™

  • DSP System Toolbox™

Для платы IO331 HDL Workflow Advisor требует комплекта инструментальных средств Xilinx® ISE. Чтобы установить этот комплект инструментальных средств, в Командном окне, введите:

hdlsetuptoolpath('ToolName', 'Xilinx ISE', 'ToolPath', toolpath)

где toolpath полный путь к исполняемому файлу инструмента синтеза.

Для требований комплекта инструментальных средств других плат смотрите Поддерживаемые Сторонние программы и Оборудование (HDL Coder).

PLL и синтез частоты

PLL требуется, чтобы блокировать сгенерированную частоту, поскольку желаемая частота является любым произвольным отношением (synN/synM в некоторой области значений) входной частоты. Мы сначала создадим модель с PLL в 'Подсистеме' синтеза частоты. Модель содержит блоки верхнего уровня, которые помогают симуляции модели на рабочем столе, а также предоставляют входные параметры FPGA для того, чтобы к настройкам параметров при выполнении в режиме реального времени на цели.

Внешний сигнал франка частоты вводится в одну из линий ввода-вывода TTL, сконфигурированных, как введено. Мы хотим управлять моделью на частоте$$ Fd = Fr * (synN/synM) $$. synN и synM являются целыми числами, которые могут варьироваться, чтобы получить частоты, отличающиеся от франка. Модель dslrtExtDIOInt использует замкнутый цикл фазы (PLL), чтобы заблокировать частоту, сгенерированную блоком NCO HDL Optimized к желаемой частоте Fd.

open_system(fullfile(matlabroot,'toolbox','rtw','targets','xpc','xpcdemos','dslrtExtDIOInt'))

Синтез частоты

Подсистема синтеза Частоты состоит из подсистемы детектора Фазы, генератора с программным управлением (NCO) и делителей частоты. HDL-код будет сгенерирован для этой подсистемы.

Детектор фазы

Подсистема детектора фазы сравнивает фазу двух сигналов при помощи блока XOR. 'countDutyCycle' функциональный блок реализует контурный фильтр в форме подсчета количества высоких выборок между двумя возрастающими ребрами XOR выход. Это также сравнивает вхождение возрастающих ребер этих двух входных сигналов к подсистеме для того, чтобы предоставить знак разности фаз.

Передаточная функция функции 'countDutyCycle':

x = [-5/4 -1 -(1/2+eps) -1/2 0 1/2 (1/2+eps) 1 5/4];
y = [   -.5  0      1          -1  0  1       -1     0     .5];
h = plot(x,y);
a=get(h, 'parent');
a.XTickLabel = {  ''   '-\pi'   '-\pi/2'  '0'  '\pi/2' '\pi' ''};
a.YTick = [-1 0 1];
a.YTickLabel = {'-N' '0' 'N'};
a.XGrid ='on';
a.YGrid ='on';
xlabel('Phase difference (rad)');
ylabel('Output (Duty cycle in number of samples)');
title('Phase Detector output');
snapnow;

Детектор фазы выход повторяется за пределами области значений$$ [-\pi/2, \pi/2] $$, указывающей на рабочий диапазон детектора XOR. Из-за этого входная частота должна быть в определенном рабочем диапазоне PLL. Значение N на оси Y зависит от мгновенной частоты входного сигнала и центральной частоты ФК. Область значений выведена в разделе 'PLL working frequency range'.

Оптимизированный HDL NCO: генератор с программным управлением генерирует статическую частоту, как определено входом 'Center freq'. Когда входной сигнал 'Касательно В' варьируется от центральной частоты, 'Phase Detector', выход генерирует сигнал восполнить различие в частоте. Сгенерированный сигнал коррекции добавляется к значению для центральной частоты, чтобы произвести соответствующую частоту. Эта подсистема используется только в отладке и контроле и может быть безопасно упущена из приложения.

Делители частоты: Они делят частоту входа прямоугольной волны в 'Касательно В' и сгенерированный сигнал произвести необходимое преобразование частоты.

'Распечатайте Целевую Частоту' подсистема

Эта подсистема содержит блоки, которые решают, что временной интервал между последовательной выборкой поражает и распечатывает мгновенную частоту выполнения модели в килогерце. Для точного измерения блок 'CPU Clk Freq' должен быть установлен в частоту тактовой частоты ЦП цели, разделенной на 1e3 (для преобразования в kHz).

PLL, работающий частотный диапазон

Следующее является списком переменных и значений по умолчанию, используемых моделью (заданный в коллбэке модели PreLoadFcn):

   synN = 3;       % frequency division ratio
   synM = 2;       % frequency division ratio
   Fs = 33e6;      % Sampling Frequency
   Fr = 16.5e3;    % Input frequency = 16.5 kHz
   df = .5;        % Frequency resolution = .5 Hz
   minSFDR = 96;   % Spurious free dynamic range >= 96 dB
   Ts = 1/Fs;                  % Sample period = 3.0303e-08 seconds
   Fc = Fr * synN / synM;      % Oscillator Center frequency = 24.75 kHz
   % For simulation only:
   inputPeriod = round(Fs/Fr);
   % Ensure period is even for the pulse generator to produce 50% duty cycle
   inputPeriod = inputPeriod + mod(inputPeriod, 2);
   % 'Period' parameter of Pulse Generator block = 1334
   % Calculate number of accumulator bits required for the frequency resolution.
   Nacc = ceil(log2(1/(df*Ts))); % NCO Accumulator word length = 26
   actdf = 1/(Ts*2^Nacc); % Actual frequency resolution achieved = 0.4917 Hz
   % Calculate number of quantizer accumulator bits required from the SFDR requirement.
   Nqacc = ceil((minSFDR-12)/6); % number of quantizer accumulator bits = 14
   % Calculate the phase increment.
   inc = round(Fc*Ts*2^Nacc); % inc = 75497

Рабочий диапазон этого PLL может быть выведен можно следующим образом:

Пределы в-$\pi$/2 и$\pi$/2 достигнуты, когда задержка сгенерированного сигнала соответствует половине количества выборок в один период сигналов. Это может произойти на частоте$F_h$ и$F_l$ выше и ниже центральной частоты, соответственно. Рассмотрите более низкую частоту$F_l$. Чтобы симулировать эту частоту с помощью импульсного генератора блокируются, переменная 'inputPeriod' должна быть увеличена на значение 'x'. В результате:

$$F_l = {Fs \over (inputPeriod + x)} $$

Детектор Фазы производит выход, равный рабочему циклу в области значений$$ [-\pi/2, \pi/2] $$ или одном периоде сравниваемой прямоугольной волны. Поправочный коэффициент =$$ -({inputPeriod + x}) $$. Это объединено со значением шага фазы, соответствующим центральной частоте, чтобы произвести частоту, равную входу. Приравнивание двух предыдущих результатов дает:

$${Fs \over (inputPeriod + x)} . {synN \over synM} = (inc - (inputPeriod + x)) .
{Fs \over 2^{Nacc}}$$

Решение этого квадратного уравнения и пущение меньшего корня дают$x$, от которого$F_l$ вычисляется:

   x_l = min(roots([1 -(inc - (2*inputPeriod)) - (inputPeriod*(inc - inputPeriod)) + (2^Nacc*(synN/synM))]));
   % The lower bound for the frequency range is:
   Fl = Fs / (inputPeriod + x_l);

Так же верхняя связанная частота$F_h$ может быть вычислена:

   x_h = min(roots([1 -(inc + (2*inputPeriod)) +(inputPeriod*(inc + inputPeriod))-(2^Nacc*(synN/synM))]));
   % The upper bound for the frequency range is:
   Fh = Fs / (inputPeriod - x_h);

Откройте модель

Щелкните здесь, чтобы открыть модель: dslrtExtDIOInt.

Сгенерируйте HDL-код с помощью HDL Workflow Advisor

Для этого примера используемое устройство является платой FPGA Speedgoat IO331. Процедура генерации HDL-кода является как описано в примере Цифровым вводом-выводом с Советом FPGA Speedgoat. Различия включают используемую плату и отображения контакта ввода и вывода, которые описаны в этом разделе.

Целевое устройство

Установите целевую платформу на FPGA Speedgoat IO331 и проверяйте, что HDL Workflow Advisor устанавливает инструмент синтеза на Xilinx® ISE Design Suite. Эта установка конфигурирует характеристики платы и инструмент синтеза, используемый в последующих задачах.

Целевой интерфейс

Ссылочный сигнал вводится в первом контакте (контакт 0). NCO выход сопоставлен как 'Прерывание от FPGA'. Этот сигнал становится прерыванием для управления выполнением модели на центральном процессоре.

Целевая частота

Модель создана с использованием фиксированный размер шага, соответствующий частоте дискретизации 33 МГц. Установите 'Целевую Частоту' на это значение. Это - частота, на которой 'Подсистема' синтеза частоты будет работать на FPGA.

Сгенерируйте модель FPGA

Модель, сгенерированная HDL Workflow Advisor, теперь готова быть созданной и загруженной на цель. Однако, поскольку намерение состоит в том, чтобы запустить приложение реального времени вокруг центральной частоты ФК, который уместно изменить шаг расчета сгенерированной модели к 1/ФК прежде, чем создать и загрузить. Это может быть сделано путем выполнения:

   Ts = 1/Fc;

После того, как вы установили Ts:

  1. В Редакторе Simulink откройте Параметры конфигурации. На вкладке Real-Time нажмите Hardware Settings.

  2. Выберите Code Generation> конечный файл System к grt.tlc.

  3. Щелкните правой кнопкой по Download to Target> Generate Simulink Real-Time Interface, и затем нажмите Run к выбранной задаче.

Это действие производит сгенерированную модель, gm_dslrtExtDIOInt_slrt.

Параметры конфигурации модели

В диалоговом окне Configuration Parameters сгенерированной модели сконфигурируйте целевой компьютер, который будет управляться прерыванием платы FPGA:

  1. В Редакторе Simulink откройте Параметры конфигурации. На вкладке Real-Time нажмите Hardware Settings.

  2. Выберите Code Generation> конечный файл System к slrt.tlc.

  3. Установите Опции Simulink Real-Time> источник Прерывания В реальном времени к Auto (PCI only).

  4. Установите плату ввода-вывода, генерирующую прерывание к Speedgoat IO331.

Можно теперь создать и загрузить сгенерированную модель на целевой компьютер как приложение реального времени.

Выполнение модели

Значения, используемые в этом примере, заставляют входную частоту быть сосредоточенной на уровне 16,5 кГц. Целевые осциллографы показывают сигнал коррекции и мгновенную частоту, когда частота входного сигнала увеличена с 16 кГц до 17 кГц. Приложение реального времени выполняется на частоте, которая является близко к$$ Fd = Fr * (synN/synM) $$.

  • Эта модель может обработать только квадратные импульсы, которые имеют аппроксимированный рабочий цикл 50%.

  • Операция PLL допустима только в частотном диапазоне, как выведено в более ранних разделах.

%
bdclose all;