Сгенерируйте HDL-код для высокой пропускной способности Channelizer

Сгенерируйте HDL-код для высокой пропускной способности (Gigasamples в секунду, GSPS) Channelizer с помощью Многофазного метода Набора фильтров.

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

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

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

Предпосылки

Лицензия HDL Coder™ требуется, чтобы генерировать HDL для этого примера.

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

Введите следующие команды, чтобы открыть модель в качестве примера:

modelname = 'PolyphaseFilterBankHDLExample_4tap';
open_system(modelname);

Настройка модели

Коллбэк InitFcn (Свойства Модели> Коллбэки> InitFcn) настраивает модель. В этом примере используется БПФ с 512 точками с четырьмя фильтрами касания для каждой полосы. Используйте dsp. Объект Channelizer сгенерировать коэффициенты:

FFTLength  = 512;
h = dsp.Channelizer;
h.NumTapsPerBand = 4;
h.NumFrequencyBands = FFTLength;
h.StopbandAttenuation = 60;

Многофазный метод объекта Channelizer генерирует 512 4 матрица. Каждая строка представляет коэффициенты для каждой полосы. Коэффициенты приведены в фиксированную точку с тем же размером слова как входной сигнал.

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

% Enter the following command to run the example model:
sim(modelname);

Средство просмотра Спектра мощности Многофазного набора фильтров (PFB) показывает улучшение спектра мощности и минимизацию утечки частоты и 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) вместо этого. Это сохраняет размер множителя в БПФ меньшим, чем 18X18 и сохраняет аппаратные ресурсы.

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

  1. Блок Госконтроля: блок State Control используется в режиме 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-код и испытательный стенд

Используйте временную директорию в сгенерированных файлах:

     systemname = 'PolyphaseFilterBankHDLExample_4tap/PolyPhaseFilterBank';
     workingdir = tempname;

Можно запустить следующую команду, чтобы проверять подсистему PolyphaseFilterBank на совместимость генерации HDL-кода:

     checkhdl(systemname,'TargetDirectory',workingdir);

Запустите следующую команду, чтобы сгенерировать HDL-код:

     makehdl(systemname,'TargetDirectory',workingdir);

Запустите следующую команду, чтобы сгенерировать испытательный стенд:

     makehdltb(systemname,'TargetDirectory',workingdir);

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

Проект синтезировался для 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 касаниями для каждой полосы используется.

InVect     = 16;
FFTLength  = 512;
h = dsp.Channelizer;
h.NumTapsPerBand = 12;
h.NumFrequencyBands = FFTLength;
h.StopbandAttenuation = 60;

Количество коэффициентов для channelizer является 512 раз диапазонов частот 12 касаниями на диапазон частот. tf (h) метод генерирует все коэффициенты.

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

% Enter the following command to run the example model:
sim(modelname);

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