Как использовать HDL оптимизированный нормированный взаимный

В этом примере показано, как и когда использовать normalizedReciprocal function и Normalized Returrocal HDL Optimized блок для вычисления нормализованной взаимности входа.

Взаимное значение может иметь большую область значений, а фиксированные точки имеют ограниченную область значений по сравнению с типами с плавающей точкой. Если значение входа u является маленьким, то 1/u - большим, а если u - большим, то 1/u - маленьким. Поэтому тип с фиксированной точкой для 1/u должен иметь высокую точность и большую область значений, которая требует большого размера слова.

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

Вычисление нормированной взаимной функции

Задан вход u, Normaled Returcal вычисляет нормализованный обратный, y, и экспонента, e, таким что

       (2.^e).*y = 1./u,

и

       0.5 < |y| <= 1.

Если u = 0 и u является фиксированной точкой или масштабированно-двойной, затем y = 2 - eps(y).

Если u = 0 и u - тип с плавающей точкой, затем y = inf.

Если u~=0, эта функция возвращает эквивалент

      [y,e] = log2(1./abs(double(u)))
      y(u<0) = -y(u<0)

кроме того, что он вычисляется с использованием только сдвигов и добавлений.

Выберите функцию MATLAB или блок Simulink

Для генерации кода C и разработки системы используйте функцию MATLAB normalizedReciprocal. Эта функция не вычисляется с задержкой. Для симуляции скомпилируйте функцию в файл MEX для скорости, используя fiaccel, buildInstrumentedMex, или codegen.

Чтобы сгенерировать оптимизированный HDL-код, используйте Normalized Reciprocal HDL Optimized блок. Этот блок оптимизирован для высокой производительности и малой площади в HDL и моделирует с той же задержкой, что и в сгенерированном HDL-коде.

Блок и функция формируют одинаковые числовые выходы.

Вычислите нормированную обратную с помощью MATLAB

Вычислите нормированную обратную сторону входа с фиксированной точкой, u, затем сравните это значение с фактическим значением обратного.

u = fi([-pi,0.01,pi])
u = 

   -3.1416    0.0100    3.1416

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13
[y,e] = normalizedReciprocal(u)
y = 

   -0.6367    0.7806    0.6367

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 14

e =

  1x3 int32 row vector

   -1    7   -1

computed_reciprocal = 2.^double(e).* double(y)
computed_reciprocal =

   -0.3183   99.9141    0.3183

actual_reciprocal = 1./double(u)
actual_reciprocal =

   -0.3183   99.9024    0.3183

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

Задайте входы для модели Simulink

Задайте вход с фиксированной точкой, u, чтобы принять нормированную обратную сторону использования Normalized Returcal HDL Optimized блока.

x = linspace(0.001,100,100);
x = [fliplr(-x),x];
u = fi(x,1,18);

Задержка нормированного обратного HDL-оптимизированного блока

Блок Normalized Returrocal HDL Optimized работает путем нормализации входов с помощью двоичного поиска, который имеет задержку приблизительно логарифмическую 2 от размера слова входа, далее следует CORDIC обратное ядро, которое имеет задержку примерно такой же как размер слова входа.

Блок Normalized Returrocal HDL Optimized всегда готов принять данные. После начальной задержки допустимые выборки выводят каждую выборку. Задержка в выборках для входного сигнала с фиксированной точкой u является

       D = ceil(log2(u.WordLength)) + u.WordLength + 5

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

Чтобы выровнять входные выборки с выходом Normalized Returrocal HDL Optimized блока, используйте latency D с задержкой.

D = normalizedReciprocalLatency(u)
D =

    28

Запустите нормированную модель обратного Simulink

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

Обратите внимание, что продукт u*y может быть вычислен в том же типе, что и u потому что 0.5 < abs(y) <= 1и так продукт не становится больше по величине.

model = 'NormalizedReciprocalModel';
open_system(model)
out = sim(model);

Анализ результатов нормированной обратной модели Simulink

На следующих графиках можно увидеть, что вход u и взаимной 1/u имеют большие области значений, но нормализованные обратные y находится в области значений от -1 до 1.

Вход, u, является вектором значений fi, которые охватывают область значений от -100 до 100.

normalizedReciprocalPlot(1,u,out.y,out.e,out.z);

Фактическое значение обратного, 1/u, почти идентичен нормированному обратному, (2.^e).*y. Ответная 1/u имеет большую область значений, что означает, что для вычисления прямого обратного сигнала в фиксированной точке потребуется тип данных с высоким динамическим диапазоном (т.е. большой размер слова и большая длина дроби).

normalizedReciprocalPlot(2,u,out.y,out.e,out.z);

Нормализованный обратный, y, находится в области значений

       0.5 < |y| <= 1

и может быть эффективно и точно сохранен в типе данных с тем же размером слова, что и u. Числовой тип y имеет длину дроби, равную двум, меньше, чем размер слова u. Этот дополнительный целочисленный бит гарантирует, что y может быть положительным или отрицательным, а также может точно представлять значения -1 и + 1.

normalizedReciprocalPlot(3,u,out.y,out.e,out.z);

Нормированная экспонента, eи величину входа, u, имеют обратную связь. Когда u является большим по величине, тогда e является большим отрицательным значением. Когда u близко к нулю, тогда e является большим положительным значением. Отношения

       (2.^e).*y = 1./u,
normalizedReciprocalPlot(4,u,out.y,out.e,out.z);

Модель умножает нормированную обратную y по входу u а затем масштабирует результат путем сдвига на e. Начиная с y имеет величину менее 1, продукт может быть сделано в типе u с фиксированной точкой. Выход, z = 2 ^ e (y * u), приблизительно равен 1.

normalizedReciprocalPlot(5,u,out.y,out.e,out.z);

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

normalizedReciprocalPlot(6,u,out.y,out.e,out.z);