В этом примере показано, как выполнить разделение вещественных чисел с помощью аппаратного эффективного кода MATLAB ®, встроенного в модели Simulink ®. Модель, используемая в этом примере, подходит для генерации кода HDL для фиксированных входов. Алгоритм использует полностью конвейерную архитектуру, которая подходит для устройств FPGA или ASIC, где речь идет о пропускной способности. В этой реализации также рационально используются доступные внутричиповые ресурсы, что делает ее пригодной и для проектов, учитывающих ресурсы.
Операция деления для двух вещественных чисел и , где , определяется как c, так a=b⋅c .
CORDIC является акронимом для COordinate Rotation DIgital Computer и может использоваться для эффективного вычисления многих тригонометрических, гиперболических и арифметических функций. Подробное описание алгоритма CORDIC и его применения при вычислении тригонометрической функции см. в разделе Вычисление синуса и косинуса с помощью ядра вращения CORDIC.
Блок Real Divide HDL Optimized поддерживает генерацию кода HDL для данных с фиксированной точкой с двоичным масштабированием. Он разработан с учетом этого приложения и использует аппаратную семантику и оптимизацию. Одной из таких оптимизаций является конвейерная обработка всей внутренней схемы для поддержания очень высокой пропускной способности.
При развертывании сложных алгоритмов на устройствах FPGA или ASIC часто существует компромисс между использованием ресурсов и общей пропускной способностью для данного вычисления. Совместное использование ресурсов часто сокращает ресурсы, потребляемые конструкцией, но также снижает пропускную способность процесса. Простые арифметические и тригономические вычисления, которые обычно составляют части больших вычислений, требуют высокой пропускной способности для дальнейшего управления схемами в конструкции. Таким образом, полностью конвейерные реализации потребляют больше ресурсов на кристалле, но выгодны в больших конструкциях.
Все ключевые вычислительные блоки в блоке оптимизации реального разделения ЛПВП полностью конвейерированы внутри. Это включает в себя не только схемы CORDIC, используемые для выполнения вращений Givens, но также сумматоры и переключатели, используемые в других частях конструкции, таким образом обеспечивая максимальную пропускную способность.
Благодаря своему полностью конвейерному характеру блок оптимизации реального разделения ЛПВП способен принимать входные данные по любому циклу, включая последовательные циклы. Для отправки входных данных в блок, validIn сигнал должен быть true. Когда блок завершит вычисление и будет готов отправить вывод, он изменится validOut кому true для одного тактового цикла. Для входных данных, посылаемых в последовательные циклы, validOut также будет установлено значение true на последовательных циклах. И числитель, и знаменатель должны отправляться вместе в одном цикле.

Чтобы открыть пример модели, в командной строке введите:
mdl = 'fxpdemo_realDivide';
open_system(mdl)Модель содержит блок оптимизации реального разделения HDL, соединенный с источником данных, который принимает массивы входов (числители и знаменатели) и передает входное значение из каждого массива в блок на последовательных циклах. Выходные данные, вычисленные для каждого значения, хранятся в переменной рабочей области. Моделирование завершается после обработки всех входных данных.
Определение массивов входных данных realDivideNumerators и realDivideDenominators. В этом примере входные данные являются двойными. Обратите внимание, что числитель и знаменатель должны иметь один и тот же тип данных.
rng('default');
realDivideNumerators = 9*rand(1000,1) + 1;
realDivideDenominators = 9*rand(1000,1) + 1;Определите тип выходных данных для использования в модели. В этом примере выходные данные также являются двойными. Следует отметить, что выходы типа с фиксированной точкой могут использоваться только с входами типа с фиксированной точкой.
OutputType = 'double';Моделирование модели.
sim(mdl);
По завершении моделирования новая переменная рабочей области: realDivideOutputs, создается для хранения вычисленного значения для каждой пары входов.
Чтобы проверить ошибку вычисления, сравните выходной сигнал блока оптимизации реального разделения HDL с выходным сигналом встроенной функции деления MATLAB ®.
expectedOutput = realDivideNumerators./realDivideDenominators; actualOutput = realDivideOutputs; maxError = max(abs(expectedOutput - actualOutput))
maxError = 0