Высокая пропускная способность Channelizer для FPGA

В этом примере показано, как реализовать высокую пропускную способность (Gigasamples в секунду, GSPS) channelizer для оборудования при помощи многофазного набора фильтров.

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

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

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

Первая часть примера реализует многофазный набор фильтров с фильтром с 4 касаниями.

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

Многофазный набор фильтров

modelname = 'PolyphaseFilterBankHDLExample_4tap';
open_system(modelname);

InitFcn коллбэк (Свойства Модели> Коллбэки> InitFcn) настраивает модель. Эта модель использует БПФ с 512 точками с четырьмя фильтрами касания для каждой полосы. Используйте dsp.Channelizer Система 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;

Чтобы синтезировать фильтр к более высокой тактовой частоте, мы конвейерно обрабатываем множитель и содействующий банк. Эти значения объяснены в разделе "Optimized Hardware Considerations".

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);

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

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

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

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

  1. Блок Госконтроля: блок State Control (HDL Coder) используется в режиме Synchronous, чтобы сгенерировать оборудование, которое дружественный код для блока задержки с включает порту.

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

  3. Использование блока DSP в FPGA: Для того, чтобы сопоставить множители в блок DSP в FPGA, множители должны быть конвейерными. В этом примере мы конвейерно обрабатываем множители (2 задержки прежде и 2 задержки после) установкой Multiplication_PipeLine = 2; Эти конвейерные регистры не должны иметь сброса. Установите тип сброса ни на один для каждого конвейера (щелкните правой кнопкой по блоку Delay и выберите HDL Code> HDL Block Properties> Reset Type = Ни один).

  4. Использование ROM в FPGA: блок Coefficient в Содействующем Банке является комбинаторным блоком. Для того, чтобы сопоставить этот блок в ROM, добавьте регистр после блока. Длина задержки установлена CoefBank_PipeLine. Установите тип сброса для этих задержек ни с одним (щелкните правой кнопкой по блоку Delay и выберите HDL Code> HDL Block Properties> Reset Type = Ни один).

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

У вас должна быть лицензия HDL Coder™, чтобы сгенерировать HDL-код для этой модели в качестве примера. Используйте эту команду, чтобы сгенерировать HDL-код. systemname = 'PolyphaseFilterBankHDLExample_4tap/PolyPhaseFilterBank'; makehdl (systemname);

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

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

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

HDL оптимизированный Channelizer

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

modelname = 'PolyphaseFilterBankHDLExample_HDLChannelizer';
open_system(modelname);

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

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

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

Входные данные состоят из двух синусоид, 200 кГц и 206,5 кГц. Частоты ближе друг к другу, чем первый пример, чтобы проиллюстрировать различие между channelizer и фильтром с 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);

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