Этот пример демонстрирует, как вычислить гиперболический тангенс данного реального набора данных с помощью аппаратно эффективного кода MATLAB ®, встроенного в модели Simulink ®. Модель, используемая в этом примере, подходит для генерации HDL-кода для входов с фиксированной точкой. Алгоритм использует архитектуру, которая разделяет вычислительные блоки и модули памяти на различных шагах, что выгодно при развертывании на устройствах FPGA или ASIC с ограниченными ресурсами. Таким образом, эта реализация имеет меньшую пропускную способность, чем полностью конвейерная реализация, но она также имеет меньшую площадь на микросхеме, что делает ее подходящей для ресурсосберегающих проектов.
Гиперболическая тангенсная функция является гиперболическим аналогом округлой function, и определяется как отношение гиперболического синуса и гиперболических функций косинуса для заданного угла .
CORDIC является акронимом COordinate Rotation DIgital Computer, и может использоваться для эффективного вычисления многих тригонометрических и гиперболических функций. Для подробного объяснения алгоритма CORDIC и его применения в вычислении тригонометрической функции, смотрите Вычисление Синуса и Косина Использование CORDIC Rotation Kernel.
Блок Hyperbolic Tangent HDL Optimized поддерживает генерацию HDL-кода для данных с фиксированной точкой с двоичным масштабированием точек. Он разработан с учетом этого приложения и использует аппаратную семантику и оптимизацию. Одной из таких оптимизаций является совместное использование ресурсов.
При развертывании сложных алгоритмов на устройствах FPGA или ASIC часто существует компромисс между использованием ресурсов и общей пропускной способностью для заданных расчетов. Полностью конвейерные и параллельные алгоритмы имеют наибольшую пропускную способность, но часто они слишком ресурсоемки, чтобы развертываться на реальных устройствах. Путем реализации логики планирования вокруг одной или нескольких вычислительных схем ядра, возможно повторно использовать ресурсы на протяжении расчета. Результатом является реализация с гораздо меньшей площадью, за счет снижения общей пропускной способности. Это часто является приемлемым компромиссом, поскольку совместные проекты ресурсов все еще могут отвечать общим требованиям к задержкам.
Все ключевые вычислительные модули в блоке Hyperbolic Tangent HDL Optimized используются повторно в течение всего жизненного цикла расчетов. Сюда входят не только схемы CORDIC, используемые для выполнения вращений Гивенса, но также сумматоры и умножители, используемые для обновления углов. Это экономит как ресурсы DSP, так и ресурсы фабрики при развертывании на устройствах FPGA или ASIC.
Для симуляции поддерживаются одно-, двух-, двоичные масштабированные с фиксированной точкой и двоичные масштабированные с двойной точкой типы данных. Однако для генерации HDL-кода поддерживаются только масштабированные типы данных с фиксированной точкой точкой.
Блок Hyperbolic Tangent HDL Optimized принимает данные, когда ready
выход высок, что указывает на то, что блок готов начать новые расчеты. Чтобы отправить входные данные в блок, validIn
должен быть задан сигнал. Если блок успешно регистрирует входное значение, он отменяет утверждение ready
сигнал, и пользователь должен затем подождать, пока сигнал не будет снова заявлен, чтобы послать новый вход. Этот протокол суммирован в следующей волновой схеме. Обратите внимание, что первый допустимый вход в блок отбрасывается, потому что блок не был готов принять входные данные.
Когда блок закончит расчет и будет готов отправить выход, он будет утверждать validOut
для одного такта. Затем ready
будет утверждено, что блок готов принять новое входное значение.
Откройте модель примера путем ввода в командной строке:
mdl = 'fxpdemo_tanh';
open_system(mdl)
Модель содержит блок Hyperbolic Tangent HDL Optimized, соединенный с источником данных, который принимает массив входов и передает входное значение из массива в блок Hyperbolic Tangent HDL Optimized, когда он готов принять новый вход. Вычисленная для каждого значения выход сохранён в переменной рабочей области. Симуляция заканчивается, когда все входы были обработаны.
Задайте массив входов, tanhInput.
В данном примере входы удваиваются.
tanhInput = -10:0.05:10;
Симулируйте модель.
sim(mdl);
Когда симуляция завершена, новая переменная рабочей области, tanhOutput
, создается, чтобы сохранить вычисленное значение для каждого входа.
Постройте график ошибки вычисления путем сравнения вывода блока HDL Optimized Гиперболического Тангенса с выходом tanh
MATLAB ® функция.
figure(1); plot(tanhInput, tanhOutput - tanh(tanhInput')); xlabel('x'); ylabel('error');