exponenta event banner

Внедрение оптимизированной аппаратно-эффективной комплексной разделительной ЛПВП

В этом примере показано, как выполнить разделение комплексных чисел с помощью аппаратного эффективного кода MATLAB ®, встроенного в модели Simulink ®. Модель, используемая в этом примере, подходит для генерации кода HDL для фиксированных входов. Алгоритм использует полностью конвейерную архитектуру, которая подходит для устройств FPGA или ASIC, где речь идет о пропускной способности. В этой реализации также рационально используются доступные внутричиповые ресурсы, что делает ее пригодной и для проектов, учитывающих ресурсы.

Разделение комплексных номеров

Операция деления для двух комплексных чисел a + bi и c + di, где b≠0, определяется как z = a + bic + di. После умножения знаменателя на его комплексное сопряжение его можно повторно записать как z = (ac + bd) + (bc-ad) ic2 + d2.

Алгоритм CORDIC

CORDIC является акронимом для COordinate Rotation DIgital Computer и может использоваться для эффективного вычисления многих тригонометрических, гиперболических и арифметических функций. Подробное описание алгоритма CORDIC и его применения при вычислении тригонометрической функции см. в разделе Вычисление синуса и косинуса с помощью ядра вращения CORDIC.

Полностью трубопроводные вычисления фиксированных точек

Блок Complex Divide HDL Optimized поддерживает генерацию кода HDL для данных с фиксированной точкой с двоичным масштабированием. Он разработан с учетом этого приложения и использует аппаратную семантику и оптимизацию. Одной из таких оптимизаций является конвейерная обработка всей внутренней схемы для поддержания очень высокой пропускной способности.

При развертывании сложных алгоритмов на устройствах FPGA или ASIC часто существует компромисс между использованием ресурсов и общей пропускной способностью для данного вычисления. Совместное использование ресурсов часто сокращает ресурсы, потребляемые конструкцией, но также снижает пропускную способность процесса. Простые арифметические и тригономические вычисления, которые обычно составляют части больших вычислений, требуют высокой пропускной способности для дальнейшего управления схемами в конструкции. Таким образом, полностью конвейерные реализации потребляют больше ресурсов на кристалле, но выгодны в больших конструкциях.

Все ключевые вычислительные блоки в блоке Complex Divide HDL Optimized полностью конвейерированы внутри. Это включает в себя не только схемы CORDIC, используемые для выполнения вращений Givens, но также сумматоры и переключатели, используемые в других частях конструкции, таким образом обеспечивая максимальную пропускную способность.

Взаимодействие с оптимизированным блоком комплексного разделения HDL

Благодаря своему полностью конвейерному характеру блок оптимизации комплексного разделения ЛПВП способен принимать входные данные по любому циклу, включая последовательные циклы. Для отправки входных данных в блок, validIn сигнал должен быть установлен в true. Когда блок завершит вычисление и будет готов отправить вывод, он установится validOut кому true для одного тактового цикла. Для входных данных, посылаемых в последовательные циклы, validOut также будет установлено значение true на последовательных циклах. И числитель, и знаменатель должны отправляться вместе в одном цикле.

Открытие модели и определение входных данных

Чтобы открыть пример модели, в командной строке введите:

mdl = 'fxpdemo_complexDivide';
open_system(mdl)

Модель содержит блок комплексного разделения HDL Optimized, соединенный с источником данных, который принимает массивы входов (числители и знаменатели) и передает входное значение из каждого массива в блок на последовательных циклах. Выходные данные, вычисленные для каждого значения, хранятся в переменной рабочей области. Моделирование завершается после обработки всех входных данных.

Определение массивов входных данных complexDivideNumerators и complexDivideDenominators. В этом примере входные данные являются двойными. Обратите внимание, что числитель и знаменатель должны иметь один и тот же тип данных.

rng('default');
complexDivideNumerators = (9*rand(1000,1) + 1) + (9*rand(1000,1) + 1)*1i;
complexDivideDenominators = (9*rand(1000,1) + 1) + (9*rand(1000,1) + 1)*1i;

Определите выходной формат данных, который будет использоваться в модели. В этом примере выходные данные также являются двойными. Следует отметить, что выходы типа с фиксированной точкой могут использоваться только с входами типа с фиксированной точкой.

OutputType = 'double';

Моделирование модели и анализ выходных данных

Моделирование модели.

sim(mdl);

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

Проверьте ошибку вычисления, сравнив выходные данные блока Complex Divide HDL Optimized с выходными данными встроенной функции разделения MATLAB ®.

expectedOutput = complexDivideNumerators./complexDivideDenominators;
actualOutput = complexDivideOutputs;
maxError = max(abs(expectedOutput - actualOutput))
maxError = 3.5958e-15