Реализация HDL потоковой передачи БПФ с 1536 точками

Этот пример показывает, как реализовать предназначенный на оборудование БПФ с 1536 точками в Simulink®. Модель поддерживает генерацию HDL-кода с HDL Coder™.

Введение

Стандарт Долгосрочной эволюции (LTE) предоставляет несколько возможностей пропускной способности передачи в пределах от 1,4 МГц к 20 МГц. Для пропускной способности передачи на 15 МГц стандарт требует длины БПФ 15:36 для модуляции OFDM и демодуляции. Этот пример использует блок FFT HDL Optimized, чтобы реализовать БПФ с 1536 точками. Блок FFT HDL Optimized поддерживает длины БПФ, которые являются степенями двойки. Этот пример использует один БПФ с 512 точками, чтобы реализовать преобразование с 1536 точками.

Алгоритм

Эта модель в качестве примера реализует БПФ с 1536 точками с помощью основания 3 алгоритма десятикратного уменьшения вовремя (DIT). Входная последовательность x (n) для всего n = {0,1,2.... 1535} разделен на три последовательности DIT т.е. x (3n), x (3n+1), x (3n+2) для всего n = {0,1,2.... 511}.

Это уравнение задает БПФ с 1536 точками:

Уравнение БПФ может быть реализовано в трех частях:

где P (k), Q (k), R (k) (т.е. 512) БПФ точки x (3n), x (3n+1), x (3n+2) соответственно. Здесь N=1536, k = 0,1,2....., 511.

Блок-схема архитектуры

Блок-схема показывает архитектуру модели и как входные потоки последовательности через компоненты модели.

Модель демультиплексирует входную последовательность x (n) в три последовательности DIT, (x (3n), x (3n+1), x (3n+2)), каждая длина 512. Три памяти Первого входа первого вывода (FIFO) хранит последовательности. Затем модель сериализирует и передает последовательности DIT потоком через FFT512. Блок FFT512 считает каждого 512 выборками как кадр. Блок FFT512 делит вывод каждого промежуточного этапа бабочки два так, чтобы выходной размер слова остался то же самое как входной размер слова. В FFT512 существует 9 промежуточных этапов бабочки, таким образом, выход от FFT512 сокращен фактором 512.

Модель демультиплексирует вывод FFT512 в три последовательности, (P (k), Q (K), R (K)), которые являются БПФ с 512 точками трех последовательностей DIT. Образцовые потоки эти последовательности параллельно в Основание 3 Этапа. После Основания 3 вычисления Этапа, образцовые потоковые данные о последовательном выводе через Выходной Нормализатор. Эта подсистема делит выборки данных на дополнительный фактор 3. Объединенный с более ранней нормализацией 512, это вычисление приводит к нормированному БПФ с 1536 точками входной последовательности.

Введите генерацию

Входные параметры к модели FFT являются BPSK, QPSK, 16-QAM, 64-QAM, и 256-QAM модулируемыми символами согласно стандартам LTE. Сгенерируйте модулируемые символы можно следующим образом:

% LTE Modulator Mapper output symbols
BPSK = cosd([45 225]) + 1i*sind([45 225]);
QPSKIQ = (-1:2:1)*(1/sqrt(2));
QPSK = QPSKIQ.' + 1i*QPSKIQ;
QAM16IQ = (-3:2:3)*(1/sqrt(10));
QAM16 = QAM16IQ.' + 1i*QAM16IQ;
QAM64IQ = (-7:2:7)*1/sqrt(42);
QAM64 = QAM64IQ.' + 1i*QAM64IQ;
QAM256IQ = (-15:2:15)*(1/sqrt(170));
QAM256 = QAM256IQ.' + 1i*QAM256IQ;

Этот пример использует 16-QAM символы в качестве входных данных к модели. Установите шаг расчета на основе стандарта LTE и сгенерируйте случайные входные данные с непрерывным допустимым сигналом. Выберите тип данных с фиксированной точкой для входных данных. Преобразуйте данные и допустимые значения к timeseries, который может использовать модель Simulink.

SampleTime = 4.3e-8; % 1/23.04e6;
N = 1536;
NOF = 1; % modify number of frames here
data = randsrc(1,N*NOF,QAM16(:).'); % modify input data values here
valid = true(N*NOF,1);

data = data(:);
valid = valid(:);
data = fi(data,1,17,15); % modify data type here

dataIn = timeseries(data,(0:length(data)-1).'*SampleTime);
validIn = timeseries(valid,(0:length(valid)-1).'*SampleTime);

Чтобы найти задержку блока с 512 БПФ, сконфигурируйте объект FFT с длиной БПФ 512 и вызовите функцию getLatency. Используйте это значение, чтобы вычислить общую задержку подсистемы БПФ 15:36, и время выполнения для модели Simulink.

fftObj = dsp.HDLFFT('FFTLength',512,...
    'Architecture','Streaming Radix 2^2',...
    'ComplexMultiplication','Use 3 multipliers and 5 adders',...
    'BitReversedOutput',false,...
    'BitReversedInput',false,...
    'Normalize',false);

latency = getLatency(fftObj);

% Latency between first input sample and first output sample of the FFT1536
% subsystem
totalLatency = 1029+latency+1028+29+2+5;

% Add the frame size to output
NofClks = totalLatency+length(data);
StopTime = (NofClks)*SampleTime;

Структура модели

Подсистема FFT1536 имеет два входных порта: входные данные и validIn и два выходных порта: выходные данные и validOut. Вводимые символы передаются потоком через порт входных данных, и валидность данных обозначается validIn портом. Выходной параметр возвращен на порте выходных данных, и его валидность обозначается validOut портом.

open_system('HDLFFT1536model');
set_param('HDLFFT1536model','SimulationCommand','Update');

Модель FFT1536 включает пять подсистем:

  1. Resequencer

  2. Этап FFT512

  3. Основание 3 этапа

  4. Селектор данных

  5. Выведите нормализатор

open_system('HDLFFT1536model/FFT1536');

Resequencer

Resequencer перестраивает входную последовательность, таким образом, что вторые и третьи последовательности DIT последовательно следуют за первой последовательностью DIT. Перестроенная последовательность, полученная из входной последовательности, обозначается в Блок-схеме Архитектуры. Блок Resequencer использует блок Data и Ctrl Signal Generator и три RAM FIFO длины 342, 512, и 683, чтобы накопить первые, вторые, и третьи последовательности DIT соответственно.

open_system('HDLFFT1536model/FFT1536/Resequencer');

Блок Data и Ctrl Signal Generator генерирует поп и управляющие сигналы нажатия, которые читают или записывают данные от RAM как очередь (FIFO) структура данных. Три параллельных последовательности сгенерированы от входной последовательности, как обозначено ниже. Первая последовательность является входом, задержанным двумя циклами, и вторая последовательность является входом, задержанным одним циклом. Сигнал нажатия утверждает каждый третий цикл, чтобы сохранить одну выборку от каждой последовательности в их соответствующий FIFOs.

Поп-управляющие сигналы сгенерированы таким образом, что FIFOs никогда не переполняются. Поток данных FIFOs показывают для непрерывного допустимого входа четырех кадров без любого разрыва между кадрами. Прежде чем первая выборка первого кадра продвинута, FIFOs пусты. Каждый раз, когда сигнал нажатия утверждает, одна выборка в каждой последовательности DIT хранится в три соответствующих FIFOs. Каждая третья выборка каждой последовательности DIT хранится в FIFO. Сохраненные выборки оставляют FIFOs на основе трех поп-сигналов.

После 1 027 тактов 342 выборки (приблизительно две трети каждой последовательности DIT) хранятся в соответствующем FIFOs. FIFO1 абсолютно полон. Для следующих 510 тактов каждое нажатие к FIFO1 является соответствующим одновременной поп-операцией. Поп-действие удаляет выборку из FIFO1 и обеспечивает память для новой выборки. Поскольку FIFO2 и FIFO3 больше, они не абсолютно полны и существует комната, чтобы продолжить продвигать новые выборки.

После 1537 (1027+510) такты, FIFO1 содержит итоговые 2 выборки первого кадра, и FIFO2 абсолютно полон. За следующие 513 тактов модель выталкивает эти две выборки от FIFO1, и затем начинает выталкивать выборки от FIFO2. Как с FIFO1, каждое нажатие является соответствующим одновременной поп-операцией. FIFO1 и FIFO3 не полны, таким образом, они продолжают принимать продвинутые выборки.

После 2050 (1537+513) такты, FIFO3 полон. FIFO2 содержит две выборки первого кадра и 171 (одна треть последовательности DIT) выборки второго кадра. За следующие 513 тактов модель выталкивает две выборки первого кадра от FIFO2, сопровождаемого выборками от FIFO3. Каждое нажатие является соответствующим одновременной поп-операцией. FIFO1 и FIFO2 не полны, таким образом, они продолжают принимать продвинутые выборки второго кадра.

После 2563 (2050+513) такты, FIFO3 содержит одну выборку первого кадра и 342 выборки второго кадра. Каждый из FIFO1 и FIFO2 содержит 342 выборки второго кадра. За следующие 510 тактов модель начинает выталкивать выборки второго кадра и продвигать выборки третьего кадра. FIFOs продолжают выталкивать и требовать у этого пути к остающимся кадрам, так, чтобы FIFOs никогда не переполнялись.

Образцовые потоки выборки, вытолканные от FIFOs до переключателя. Переключатель управляет маршрутизацией сигнала на основе валидности полученных выборок. Допустимый сигнал для каждой последовательности DIT сохранен с выборкой в FIFO и затем предоставлен переключателю в трех validIn входных портах.

Этап FFT512

Образцовые потоки вывод Resequencer через блок FFT512. Каждые 512 выборок входа генерируют кадр FFT с 512 точками вывод. БПФ с 512 точками 3 последовательностей DIT возвращен как последовательные выборки в блок FFT512. Подсистема Разделителя Данных разделяет последовательные данные в три параллельных последовательности DIT.

open_system('HDLFFT1536model/FFT1536/FFT512 Stage');

Ввод и вывод блока FFT512 находится в битном естественном порядке. Чтобы минимизировать множители, Комплексный параметр маски Умножения блока FFT512 устанавливается, чтобы "Использовать 3 множителя и 5 сумматоров". Чтобы позволить масштабироваться, параметр "Делит бабочку, выходные параметры два" проверяются.

Параметры маски блока FFT HDL Optimized, используемого в модели в качестве примера, показывают ниже.

Основание 3 этапа

Основание 3 подсистемы Бабочки используют основу 3, вертит фактор. Как обозначено в Блок-схеме Архитектуры, модель умножается, последовательности вывода FFT с основой 1536 вертят факторы (для k = от 0 до 511) и базируются 3, вертят факторы. Интерполяционная таблица хранит основу 1536, вертят факторы, и модель умножает их с входными данными согласно алгоритму.

open_system('HDLFFT1536model/FFT1536/Radix 3 Stage');

Алгоритм требует, чтобы основа 1536 вертела факторы для всего k = {0,1,2... 511}. Полярный график этих факторов показывает красная линия для всех значений k. График показывает, что вертеть факторы от k = 385 - 511 симметричны с вертеть факторами для k = 257 - 383 об оси Y. Эта симметрия означает, что вертеть факторы для k = 385 - 511 могут быть получены путем изменения знака действительных частей вертеть факторов для k = 257 - 383.

Модель хранит действительные и мнимые части вертеть факторов для k = от 0 до 384 в интерполяционных таблицах. Интерполяционные таблицы сгенерированы в Model Properties -> Callbacks -> InitFcn в переменную twiddle.

open_system('HDLFFT1536model/FFT1536/Radix 3 Stage/Twiddle Factor Generator and Multiplier/Twiddle Factor Generator');

Селектор данных

Подсистема Селектора Данных возвращает первую последовательность при хранении вторых и третьих последовательностей в RAM. После первой последовательности это возвращает вторую последовательность. После второй последовательности это возвращает третью последовательность.

Выведите нормализатор

Как отмечалось ранее, выходные данные от блока FFT512 нормирован фактором 512. Выходная подсистема Нормализатора нормирует данные дальнейшим фактором 3 для общего коэффициента нормализации 1 536. Этот фактор эквивалентен нормализации, которая произошла бы от использования БПФ с 1536 точками непосредственно.

Задержка

Общая задержка этой модели является 3 171 тактом, который включает сумму задержек подсистемы Resequencer (1 029 тактов), блок FFT512 (1 078 тактов), подсистема Разделителя Данных (1 028 тактов), и конвейерные задержки Основания 3 Этапа (29 тактов), Селектора Данных (2 такта), и Выходной Нормализатор (5 тактов). Задержки показывают в фигуре. (1029+1078+1028+29+2+5 = 3171)

Запустите модель Simulink

Чтобы запустить этот пример, используйте скрипт HDLFFT1536Example.m MATLAB®. Этот скрипт генерирует входные данные к модели и сопроводительный допустимый сигнал. Это затем запускает модель и сравнивает вывод со встроенной функцией fft.

sim('HDLFFT1536model');

Верификация

Экспортируйте выходные данные в MATLAB и сравните результаты с функцией fft.

simOut = dataOut(validOut);
if isfi(data)
    validData = double(data(valid)); % fft function doesn't support fi
else
    validData = data(valid);
end
matOut = [];
for ii = 1:NOF
    matOut =[matOut fft(validData(1536*(ii-1)+1:1536*(ii-1)+1536))]; %#ok<AGROW>
end
simOut = double(simOut(:))*1536;
matOut = matOut(:);
err = simOut - matOut;

subplot(311);
plot(1:length(simOut),real(simOut),'r-');
ax = axis();
ylabel('Simulation Output');
title('REAL PART OF THE OUTPUT');
subplot(313);
plot(1:length(matOut),real(matOut),'b-');
axis(ax);
ylabel('fft() Output');
subplot(312);
plot(1:length(err),real(err),'k-');
axis([ax(1) ax(2) -ax(4)/4 ax(4)/4]);
ylabel('error');
figure
subplot(311);
plot(1:length(simOut),imag(simOut),'r-');
ax = axis();
ylabel('Simulation Output');
title('IMAGINARY PART OF THE OUTPUT');
subplot(313);
plot(1:length(matOut),imag(matOut),'b-');
axis(ax);
ylabel('fft() Output');
subplot(312);
plot(1:length(err),imag(err),'k-');
axis([ax(1) ax(2) -ax(4)/4 ax(4)/4]);
ylabel('error');
close_system('HDLFFT1536model');

Генерация HDL-кода

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

Чтобы сгенерировать HDL-код и испытательный стенд для подсистемы FFT1536, используйте makehdl и команды makehdltb соответственно.

HDL-код, сгенерированный для подсистемы FFT1536, синтезируется для платы Xilinx® Zynq®-7000 ZC706 и Virtex 7 xc7vx330tffg1157-1 FPGA. Результаты синтеза показывают в таблице.

Тип сайта Использование для FFT1536
xc7z045ffg900-2 xc7vx330tffg1157-1
LUT среза 5398 5314
Регистры среза 8269 8269
RAMB36E1 1 1
RAMB18E1 16 16
DSP48E1 35 35
Максимум частота (МГц) сообщение P&R 370 309

Смотрите также