Реализуйте эффективный оборудованием комплексный оптимизированный HDL деления

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

Деление комплексных чисел

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

Алгоритм CORDIC

CORDIC является акронимом для Координатного Компьютера Вращения и может использоваться, чтобы эффективно вычислить многих тригонометрические, гиперболические, и арифметические функции. Для подробного объяснения алгоритма CORDIC и его приложения в вычислении тригонометрической функции, смотрите, Вычисляют Синус и Косинус Используя Ядро Вращения CORDIC.

Полностью конвейерные расчеты фиксированной точки

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

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

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

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

Из-за его полностью конвейерного характера блок Complex Divide HDL Optimized может принять входные данные на любом цикле, включая последовательные циклы. Отправить входные данные в блок, validIn сигнал должен быть установлен в true. Когда блок закончит расчет и будет готов отправить выход, это установит validOut к true для одного такта. Для входных параметров, отправленных на последовательных циклах, validOut будет также установлен в true на последовательных циклах. И числитель и знаменатель должны быть отправлены вместе на том же цикле.

Откройте модель и задайте входные данные

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

mdl = 'fxpdemo_complexDivide';
open_system(mdl)

Модель содержит блок Complex Divide 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;

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

OutputType = 'double';

Симулируйте модель и исследуйте Выход

Симулируйте модель.

sim(mdl);

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

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

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