Высокопроизводительный канализатор для ПЛИС

Этот пример показывает, как реализовать высокопроизводительный (Gigasamples в секунду, GSPS) канализатор для оборудования с использованием полифазы фильтров.

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

Современные АЦП способны дискретизировать сигналы со скоростью дискретизации до нескольких Гигасамплес в секунду. Но тактовые частоты для самой быстрой FPGA не дотягивают до этой частоты дискретизации. FPGA обычно работают на сотнях МГц. Подход к выполнению обработки GSPS на FPGA состоит в том, чтобы перейти от скалярной обработки к векторной обработке и обработать несколько выборок одновременно с гораздо более низкой тактовой частотой. Многие современные FPGA поддерживают JESD204B стандартный интерфейс, который принимает скалярный вход с тактовой частотой ГГц и производит вектор выборок с более низкой тактовой частотой.

В этом примере мы покажем, как спроектировать приложение обработки сигналов для пропускной способности GSPS в Simulink. Входные данные векторизированы через интерфейс JESD204B и доступны с более низкой тактовой частотой в FPGA. Модель является полифазной группой фильтров, которая состоит из фильтра и БПФ, который обрабатывает 16 выборок за раз. Метод полифазы фильтров используется для минимизации неточности БПФ из-за утечек и потерь гребня. Смотрите Спектральный Анализ Высокого Разрешения (DSP System Toolbox) для получения дополнительной информации о банке полифазных фильтров.

В первой части примера реализована полифаза фильтров с 4-контактным фильтром.

Во второй части примера используется блок Channelizer HDL Optimized, настроенный для 12-контактного фильтра. Блок Channelizer HDL Optimized использует метод полифазы фильтров.

Полифаза фильтров

modelname = 'PolyphaseFilterBankHDLExample_4tap';
open_system(modelname);

The InitFcn коллбэк (свойства модели > коллбэки > InitFcn) настраивает модель. Эта модель использует БПФ с 512 точками с четырьмя фильтрами отвода для каждой полосы. Используйте dsp.Channelizer (DSP System Toolbox) Системные object™ для генерации коэффициентов. Полифазный метод объекта Channelizer генерирует матрицу 512 на 4. Каждая строка представляет коэффициенты для каждой полосы. Коэффициенты приводятся в фиксированную точку с тем же размером слова, что и входной сигнал.

FFTLength  = 512;
h = dsp.Channelizer;
h.NumTapsPerBand = 4;
h.NumFrequencyBands = FFTLength;
h.StopbandAttenuation = 60;
coef =fi(polyphase(h),1,15,14,'RoundingMethod','Convergent');

Алгоритм требует 512 фильтров (по одному фильтру для каждой полосы). Для векторного входа из 16 выборок мы можем повторно использовать 16 фильтров, 32 раза.

InVect      = 16;
ReuseFactor = FFTLength/InVect;

Чтобы синтезировать фильтр к более высокой тактовой частоте, мы вводим умножитель и банк коэффициентов. Эти значения поясняются в разделе «Оптимизированные аппаратные факторы».

Multiplication_PipeLine = 2;
CoefBank_PipeLine       = 1;

Источник данных

Входные данные состоят из двух синусоид, 200 кГц и 250 кГц.

Результаты симуляции

Чтобы визуализировать результат спектра, откройте средства просмотра спектра и запустите модель.

open_system('PolyphaseFilterBankHDLExample_4tap/FFT Spectrum Viewer/Power Spectrum viewer (FFT)');
open_system('PolyphaseFilterBankHDLExample_4tap/PFB Spectrum Viewer/Power Spectrum viewer (PFB)');
sim(modelname);

Полифаза фильтров Power Spectrum Viewer показывает улучшение спектра степени и минимизацию утечек частоты и масштабирования по сравнению с использованием только БПФ. Сравнивая два спектра и увеличивая частоту между 100 кГц и 300 кГц, можно заметить, что банк полифазных фильтров имеет меньше peaks на -40 дБ, чем классический БПФ.

Оптимизированные аппаратные факторы

  • Тип данных: Размер слова данных влияет как на точность результата, так и на ресурсы, используемые в оборудовании. Для этого примера мы проектируем фильтр с полной точностью. С типом входных данных fixdt(1,15,13), выход следующий fixdt(1,18,17). Абсолютные значения коэффициентов фильтра все меньше 1, поэтому данные не растут после каждого умножения, и нам нужно добавить один бит для каждого сложения. Чтобы сохранить точность в БПФ, нам нужно вырастить по одному биту для каждого этапа. Это делает умножение коэффициента twiddle больше на каждом этапе. Для многих FPGA желательно сохранить размер умножения меньше, чем 18x18. Поскольку БПФ с 512 точками имеет 9 каскадов, вход БПФ не может быть больше 11 биты. Исследуя коэффициенты фильтра, мы наблюдаем, что первые 8 двоичных цифр максимального коэффициента равны нулю, и поэтому мы можем привести коэффициенты к fixdt(1,7,14) вместо fixdt(1,15,14). Также мы наблюдаем, что максимальное значение вывода блока Datype внутри банка полифазных фильтров имеет 7 ведущих нулей после двоичной точки, и поэтому мы приводим выход фильтра к fixdt(1,11,17) вместо этого. Это сохраняет размер множителя внутри БПФ меньше, чем 18 на 18, и экономит аппаратные ресурсы.

  • Проект для скорости:

  1. Блок Госконтроля: блок Госконтроля используется в Синхронном способе, чтобы произвести оборудование, которое дружественный код для блока задержки с позволяет порту.

  2. Минимизация включения синхроимпульса: Модель настроена на генерацию HDL-кода с включенной опцией Минимизация включения синхроимпульса (В параметрах конфигурации выберите > Генерация HDL-кода > Глобальные настройки > Порты > Минимизация включения синхроимпульса). Эта опция поддерживается, когда модель является одной скоростью. Активация синхроимпульса является глобальным сигналом, который не рекомендуется для высокоскоростных проектов.

  3. Использование блока DSP в FPGA: В порядок для отображения множителей в блок DSP в FPGA, множители должны быть конвейерными. В этом примере мы конвейерируем множители (2 задержки до и 2 задержки после) путем установки Multiplication_PipeLine = 2; Эти регистры конвейера не должны иметь сброса. Установите тип сброса «нет» для каждого конвейера (щелкните правой кнопкой по блоку Delay и выберите HDL-код > Свойства HDL-блока > Тип сброса = Нет).

  4. Использование ПЗУ в FPGA: Блок Коэффициента внутри Банка Коэффициентов является комбинаторным блоком. В порядок для преобразования этого блока в ПЗУ добавьте регистр после блока. Длина задержки задается CoefBank_PipeLine. Установите тип сброса для этих задержек на нет (щелкните правой кнопкой по блоку Delay и выберите HDL-код > HDL Block Свойств > Reset Type = None).

Сгенерируйте HDL-код и испытательный стенд

Для генерации HDL-кода для этой модели HDL Coder™ необходимо иметь лицензию примера. Используйте эту команду для генерации HDL-кода. systemname = 'Polyphase Filter Bank HDLE xample _ 4tap/Poly Phase Filter Bank'; makehdl (systemname);

Используйте эту команду, чтобы сгенерировать испытательный стенд, которая сравнивает результаты HDL-симуляции с поведением симуляции Simulink. makehdltb (systemname);

Результаты синтеза

Синтезировали проект для Xilinx Virtex 7 (xc7vx550t-ffg1158, класс скорости 3) с использованием ISE. Проект достигает тактовой частоты 499,525 МГц (до места и маршрута). При 16 выборках на тактовый сигнал это преобразовывается в пропускную способность 8 GSPS. Обратите внимание, что эта подсистема имеет большое количество портов ввода-вывода, и она не подходит как автономный проект, предназначенная для FPGA.

Оптимизированный канал HDL

Чтобы улучшить частотную характеристику, используйте фильтр с большим количеством отводов. Следующая модель использует блок Channelizer HDL Optimized, сконфигурированный с 12-контактным фильтром, чтобы улучшить спектр. Использование встроенного блока Channelizer HDL Optimized облегчает изменение расчётных параметров.

modelname = 'PolyphaseFilterBankHDLExample_HDLChannelizer';
open_system(modelname);

Модель использует переменные рабочей области, чтобы сконфигурировать БПФ и фильтр. В этом случае модель использует БПФ с 512 точками и фильтр с 12 отводами для каждой полосы. Количество коэффициентов для канализатора составляет 512 частот, полосами умноженное на 12 отводов на полосу частоты. The tf(h) метод генерирует все коэффициенты.

InVect     = 16;
FFTLength  = 512;
h = dsp.Channelizer;
h.NumTapsPerBand = 12;
h.NumFrequencyBands = FFTLength;
h.StopbandAttenuation = 60;
coef12Tap = tf(h);

Источник данных

Входные данные состоят из двух синусоид, 200 кГц и 206,5 кГц. Частоты ближе друг к другу, чем в первом примере, чтобы проиллюстрировать различие между канализатором и 4-отводным фильтром в разрешении спектра.

Результаты симуляции

Чтобы визуализировать результат спектра, откройте средства просмотра спектра и запустите модель.

open_system('PolyphaseFilterBankHDLExample_HDLChannelizer/PFB_4tap Spectrum Viewer/Power Spectrum viewer (PFB_4tap)');
open_system('PolyphaseFilterBankHDLExample_HDLChannelizer/Channelizer Spectrum Viewer/Power Spectrum viewer (Channelizer_12tap)');
sim(modelname);

Power Spectrum Viewer для модели Channelizer_12tap показывает улучшение спектра степени полифазы фильтров с 12-отводным фильтром по сравнению с 4-отводным фильтром в предыдущей модели. Сравните результаты спектра для блоков каналообразующего и 4-контактного полифазного фильтров. Масштабирование между 100 кГц и 300 кГц, чтобы заметить, что каналообразующий элемент обнаруживает только два пика, в то время как 4-контактный полифазный фильтр обнаруживает более 2 peaks. Два пика являются ожидаемым результатом, поскольку входной сигнал имеет только две частотные составляющие.