Этот пример демонстрирует, как выполнить деление вещественных чисел с помощью эффективного оборудованием кода MATLAB®, встроенного в модели Simulink®. Модель, используемая в этом примере, подходит для генерации HDL-кода для входных параметров фиксированной точки. Алгоритм использует полностью конвейерную архитектуру, которая подходит для FPGA или устройств ASIC, где пропускная способность вызывает беспокойство. Эта реализация также использует доступные ресурсы на чипе рассудительно, делая его подходящим для сознательных ресурс проектов также.
Операция деления для двух вещественных чисел и , где , задан как , таким образом, что .
CORDIC является акронимом для Координатного Компьютера Вращения и может использоваться, чтобы эффективно вычислить многих тригонометрические, гиперболические, и арифметические функции. Для подробного объяснения алгоритма CORDIC и его приложения в вычислении тригонометрической функции, смотрите, Вычисляют Синус и Косинус Используя Ядро Вращения CORDIC.
Блок Real Divide HDL Optimized поддерживает генерацию HDL-кода для данных фиксированной точки с масштабированием двоичной точки. Это спроектировано с этим приложением в памяти и использует оборудование определенная семантика и оптимизация. Одна из этой оптимизации конвейерно обрабатывает свою целую внутреннюю схему, чтобы обеспечить очень высокую пропускную способность.
При развертывании сложных алгоритмов в FPGA или устройства ASIC, часто существует компромисс между использованием ресурсов и общей пропускной способностью для данного расчета. Разделение ресурсов часто уменьшает ресурсы, использованные проектом, но также и уменьшает пропускную способность в процессе. Простая арифметика и trigonometic расчеты, которые обычно являются частями больших расчетов, требуют высокой пропускной способности к управляющим схемам далее в проекте. Таким образом полностью конвейерные реализации используют ресурсы более на чипе, но выгодны в больших проектах.
Все ключевые вычислительные модули в блоке Real Divide HDL Optimized являются полностью конвейерными внутренне. Это включает не, только схема CORDIC раньше выполняла вращения Givens, но также и сумматоры и переключатели, используемые в другом месте в проекте, таким образом гарантируя максимальную пропускную способность.
Из-за его полностью конвейерного характера блок Real Divide HDL Optimized может принять входные данные на любом цикле, включая последовательные циклы. Отправить входные данные в блок, validIn
сигналом должен быть true
. Когда блок закончит расчет и будет готов отправить выход, это изменит validOut
к true
для одного такта. Для входных параметров, отправленных на последовательных циклах, validOut
будет также установлен в true
на последовательных циклах. И числитель и знаменатель должны быть отправлены вместе на том же цикле.
Открыть модель в качестве примера, в командной строке, введите:
mdl = 'fxpdemo_realDivide';
open_system(mdl)
Модель содержит блок Real Divide HDL Optimized, соединенный с источником данных, который берет в массивах входных параметров (числители и знаменатели) и передает входное значение от каждого массива до блока на последовательных циклах. Выход, вычисленный для каждого значения, хранится в переменной рабочей области. Симуляция завершает работу, когда все входные параметры были обработаны.
Задайте массивы входных параметров realDivideNumerators
и realDivideDenominators
. В данном примере входные параметры, удваивается. Обратите внимание на то, что и числитель и знаменатель должны иметь тот же тип данных.
rng('default');
realDivideNumerators = 9*rand(1000,1) + 1;
realDivideDenominators = 9*rand(1000,1) + 1;
Задайте выходной тип данных, который будет использоваться в модели. В данном примере выходные параметры, также удваивается. Обратите внимание на то, что фиксированная точка выходные параметры может только использоваться с входными параметрами фиксированной точки.
OutputType = 'double';
Симулируйте модель.
sim(mdl);
Когда симуляция завершена, новая переменная рабочей области, realDivideOutputs
, создается, чтобы содержать вычисленное значение для каждой пары входных параметров.
Чтобы исследовать ошибку вычисления, сравните выход блока Real Divide HDL Optimized к той из встроенной в MATLAB® функции деления.
expectedOutput = realDivideNumerators./realDivideDenominators; actualOutput = realDivideOutputs; maxError = max(abs(expectedOutput - actualOutput))
maxError = 0