Как использовать HDL оптимизированная нормированная обратная величина

В этом примере показано, как и когда использовать normalizedReciprocal функционируйте и блок Normalized Reciprocal HDL Optimized, чтобы вычислить нормированную обратную величину входа.

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

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

Вычисление нормированной обратной величины

Учитывая вход u, Нормированная Обратная величина вычисляет нормированную обратную величину, 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 Reciprocal HDL Optimized.

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

Задержка блока Normalized Reciprocal HDL Optimized

Оптимизированная кладка блоков Нормированного Взаимного HDL путем нормализации входа с помощью двоичного поиска, который имеет задержку приблизительно log2 размера слова входа, сопровождаемого взаимным ядром CORDIC, которое имеет задержку приблизительно то же самое как размер слова входа.

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

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

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

Чтобы выровнять входные выборки с выходом блока Normalized Reciprocal HDL Optimized, используйте задержку 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 имеет большой спектр, что означает, что вычислить прямую обратную величину в фиксированной точке потребовало бы типа данных с расширенным динамическим диапазоном (i.e. большой размер слова и большая дробная длина).

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);