В этом примере показано, как использовать блок FFT HDL Optimized для реализации БПФ для оборудования.
Блоки и системные объекты БПФ и IFFT HDL Optimized поддерживают симуляцию и генерацию HDL-кода для многих приложений. Они обеспечивают две архитектуры, оптимизированные для различных вариантов использования:
Streaming Radix 2^2
- Для высокопроизводительных приложений. Достигает гигасамплес в секунду (GSPS), когда вы используете векторный вход.
Burst Radix 2
- Для применения в низких зонах. Использует только одну сложную бабочку.
Этот пример включает две модели, которые показывают, как использовать потоковые и пакетные архитектуры блока FFT HDL Optimized, соответственно.
Современные АЦП способны дискретизировать сигналы со скоростью дискретизации до нескольких гигасамп в секунду. Однако тактовые частоты для самой быстрой FPGA не соответствуют этой частоте дискретизации. FPGA обычно работают на сотнях МГц. Одним из способов выполнения обработки GSPS на FPGA является обработка нескольких выборок одновременно с гораздо более низкой тактовой частотой. Многие современные FPGA поддерживают JESD204B стандартный интерфейс, который принимает скалярный вход с тактовой частотой ГГц и производит вектор выборок с более низкой тактовой частотой. Поэтому современная обработка сигналов требует векторной обработки.
The Streaming Radix 2^2
архитектура предназначена для поддержки сценария использования с высокой пропускной способностью. Эта модель примера использует вход размера вектора 8 и вычисляет БПФ с помощью Streaming Radix 2^2
архитектура. Временную диаграмму, поддерживаемые функции и использование ресурсов FPGA см. в БПФ блока страницы с описанием HDL Optimized (DSP System Toolbox).
modelname = 'FFTHDLOptimizedExample_Streaming';
open_system(modelname);
Обратный коллбэк InitFcn (Свойства модели > Коллбэки > InitFcn) устанавливает параметры для модели. В этом примере параметры управляют размером БПФ и характеристиками входных данных.
FFTLength = 512;
Входные данные являются две синусоид, 200 кГц и 250 кГц, каждый дискретизирован с частотой 1 * 2e6 Гц. Значение входа размера вектора составляет 8 выборки.
FrameSize = 8; Fs = 1*2e6;
Чтобы продемонстрировать, что данные не должны приходить постоянно, этот пример применяет допустимый вход каждый другой цикл.
ValidPattern = [1,0];
Откройте Spectrum Viewer и запустите пример модели.
open_system('FFTHDLOptimizedExample_Streaming/Spectrum Viewer/Power Spectrum viewer');
sim(modelname);
Используйте Burst Radix 2
архитектура для приложений с ограниченными ресурсами FPGA, особенно когда длина БПФ большая. Эта архитектура использует только одну сложную бабочку, чтобы вычислить БПФ. Проект принимает данные во время ready
утверждается и начинает обработку, когда вся система координат БПФ сохранена в памяти. Во время обработки проект не может принять данные, поэтому ready
отменяется. Временную диаграмму, поддерживаемые функции и использование ресурсов FPGA см. в БПФ блока страницы с описанием HDL Optimized (DSP System Toolbox).
modelname = 'FFTHDLOptimizedExample_Burst';
open_system(modelname);
Обратный коллбэк InitFcn (Свойства модели > Коллбэки > InitFcn) устанавливает параметры для модели. В этом примере параметры управляют размером БПФ и характеристиками входных данных.
FFTLength = 512;
Входные данные являются две синусоид, 200 кГц и 250 кГц, каждый дискретизирован с частотой 1 * 2e6 Гц. Данные действительны каждый цикл.
Fs = 1*2e6; ValidPattern = 1;
Откройте Spectrum Viewer и запустите пример модели.
open_system('FFTHDLOptimizedExample_Burst/Spectrum Viewer/Power Spectrum viewer');
sim(modelname);
Для генерации HDL-кода в данном примере требуется Coder™ лицензия HDL.
Выберите одну из моделей для генерации HDL-кода и испытательного стенда:
systemname = 'FFTHDLOptimizedExample_Burst/FFT HDL Optimized Burst';
или
systemname = 'FFTHDLOptimizedExample_Streaming/FFT HDL Optimized Streaming';
Используйте эту команду для генерации HDL-кода для любого из режимов FFT. Сгенерированный может использоваться для любого целевого устройства FPGA или ASIC.
makehdl(systemname);
Используйте эту команду, чтобы сгенерировать испытательный стенд, которая сравнивает результаты HDL-симуляции с поведением симуляции Simulink.
makehdltb(systemname);