Нативная технология с плавающей точкой может сгенерировать HDL-код из вашего проекта с плавающей точкой. Проекты с плавающей точкой имеют лучшую точность, более высокий динамический диапазон и более короткий цикл разработки, чем проекты фиксированной точки. Если ваш проект имеет комплексную математику и тригонометрические операции, используйте нативную технологию с плавающей точкой.
HDL Coder™ генерирует код, который выполняет стандарт IEEE 754 арифметики с плавающей точкой. Собственный компонент HDL Coder поддержки с плавающей точкой:
Вокруг к самому близкому режиму округления
Нестандартные числа
Исключения, такие как NaN (Не Номер), Inf и Нуль
Индивидуальная настройка ULP (Модули в Последнем Месте) и относительная точность
Собственный компонент HDL Coder использование с плавающей точкой раунд к самому близкому даже округляющемуся режиму. Этот режим разрешает все связи путем округления к самой близкой ровной цифре.
Этот метод округления требует по крайней мере трех запаздывающих битов после 23 битов мантиссы. MSB называется "Сторожевым" разрядом, средний бит называется Круглым битом, и LSB называется Липким битом. Таблица показывает округляющееся действие, что HDL Coder выполняет на основе различных значений трех запаздывающих битов. x
обозначает, что не заботится о значении и может взять или 0 или 1.
Округление битов | Округление действия |
---|---|
0xx | Никакое действие не выполняется. |
100 | Связь. Если бит мантиссы, который предшествует "Сторожевому" разряду, является 1, окружите, в противном случае никакое действие не выполняется. |
101 | Окружить. |
11x | Окружить. |
Нестандартные числа являются числами, которые имеют равное нулю поле экспоненты и ненулевое поле мантиссы. Ведущий бит мантиссы является нулем.
Нестандартные числа имеют значения меньше, чем самое маленькое число с плавающей запятой, которое может быть представлено без начальных нулей в мантиссе. Присутствие нестандартных чисел указывает на потерю значительных цифр, которые могут накопиться по последующим операциям и в конечном счете привести к неожиданным значениям.
Логика, чтобы обработать нестандартные числа включает подсчет количества начальных нулей и выполнения операции сдвига влево, чтобы получить нормированное представление. Сложение этой логики увеличивает место области на целевом устройстве и может влиять на синхронизацию вашего проекта.
При использовании нативной поддержки с плавающей точкой можно задать, хотите ли вы, чтобы HDL Coder обработал нестандартные числа в вашем проекте. По умолчанию генератор кода не проверяет на нестандартные числа, который сохраняет область на целевой платформе.
Если вы выполняете операции, такие как деление на нуль или вычисляете логарифм отрицательного числа, HDL Coder обнаруживает и сообщает об исключениях. Таблица суммирует отображение от кодирования числа с плавающей запятой к значению номера для различных видов исключений. x
обозначает, что не заботится о значении и может взять или 0 или 1.
Знак | Экспонента | Мантисса | Значение | Описание |
---|---|---|---|---|
x | 0xFF | 0x00000000 |
| Бесконечность |
x | 0xFF | Ненулевое значение | значение = NaN | Не номер |
x | 0x00 | 0x00000000 | значение = 0 | Нуль |
x | 0x00 | Ненулевое значение |
| Нестандартный |
x | 0x00 <E <0xFF | x |
| Нормальный |
Представление бесконечно вещественных чисел с конечным числом битов требует приближения. Это приближение может привести к погрешностям округления в вычислении с плавающей точкой. Чтобы измерить погрешности округления, стандарт с плавающей точкой использует относительную погрешность и ULP (Модули в Последнем Месте) ошибка.
Если область значений экспоненты не верхне ограничена, Модули в Ласт-Плэйс (ULP) числа с плавающей запятой x расстояние между двумя самыми близкими ведущими двойственную политику числами с плавающей запятой a и b самый близкий к x. Стандарт IEEE 754 требует что вы правильно вокруг результата элементарной арифметической операции, такой как сложение, умножение и деление. Правильно округленный результат означает, что округленный результат в 0,5 ULP точного результата.
ULP каждый означает добавлять 1 в десятичное значение номера. Таблица показывает приближение пи к девяти десятичным цифрам и как ULP каждый изменяет приближенное значение.
Число с плавающей запятой | Значение в десятичном числе | Представление IEEE 754 для Одного Типов | ULP |
---|---|---|---|
3.141592741 | 1078530011 | 0|10000000|10010010000111111011011 | 0 |
3.141592979 | 1078530012 | 0|10000000|10010010000111111011100 | 1 |
Разрыв между двумя последовательно представимыми числами с плавающей запятой отличается согласно значению.
Число с плавающей запятой | Значение в десятичном числе | Представление IEEE 754 для Одного Типов | ULP |
---|---|---|---|
1234567 | 1234613304 | 0|10010011|00101101011010000111000 | 0 |
1234567.125 | 1234613305 | 0|10010011|00101101011010000111001 | 1 |
Относительная погрешность измеряет различие между числом с плавающей запятой и приближением вещественного числа. Относительная погрешность возвращает расстояние от 1,0 до следующего большего числа. Эта таблица показывает, как действительное значение номера изменяется с относительной точностью.
Число с плавающей запятой | Значение в десятичном числе | Представление IEEE 754 для Одного Типов | ULP | Относительная погрешность |
---|---|---|---|---|
8388608 | 1258291200 | 0|10010110|00000000000000000000000 | 0 | 1 |
8388607 | 1258291198 | 0|10010101|11111111111111111111110 | 1 | 2.3841858e-07 |
1 | 1065353216 | 0|01111111|00000000000000000000000 | 0 | 1.1920929e-07 |
2 | 1073741824 | 0|10000000|00000000000000000000000 | 1 | 2.3841858e-07 |
Значение относительной погрешности зависит от действительного значения числа с плавающей запятой.
В MATLAB® функция eps
измеряет относительную точность числа с плавающей запятой. Для получения дополнительной информации смотрите eps
.
Нативная поддержка с плавающей точкой в HDL Coder следует стандарту IEEE арифметики с плавающей точкой.
Все основные арифметические операции, такие как сложение, вычитание, умножение, деление и обратная величина получают мандат IEEE иметь нулевую ошибку ULP. Когда вы выполняете эти операции в нативном режиме с плавающей точкой, числовые результаты, полученные из сгенерированного HDL-кода, совпадают с исходной моделью Simulink®.
Все операции высшей математики, такие как экспоненциал, логарифм и тригонометрические операторы имеют специфичные для машины поведения реализации потому что эти операторы использование, повторяющееся ряд Тейлора и remez основанные на выражении реализации. Когда вы используете эти операторы в нативном режиме с плавающей точкой, могут быть относительно небольшие различия в числовых результатах между типовым кодексом Simulink и сгенерированным HDL-кодом.
Можно измерить различие в числовых результатах как относительная погрешность или ULP. Ненулевой ULP для этих операторов не означает несоблюдение стандарта IEEE. ULP каждый эквивалентен относительной погрешности 10^-7
. Можно проигнорировать такие относительно небольшие ошибки путем определения пользовательского значения допуска для ULP при генерации испытательного стенда HDL. Например, можно задать пользовательский допуск с плавающей точкой одного ULP, чтобы проигнорировать ошибку при проверке сгенерированного кода. Для получения дополнительной информации смотрите FPToleranceStrategy
и FPToleranceValue
.
Большинство основных математических операторов и некоторые операции высшей математики имеют нулевой ULP в нативном режиме с плавающей точкой. Нативная поддержка с плавающей точкой в HDL Coder предпринимает лучшую попытку реализовать эти операторы к самому низкому возможному ULP. Таблица перечисляет ULP операторов с плавающей точкой, которые имеют ненулевой ULP. В дополнение к этим операторам блок HDL Reciprocal имеет ULP пять.
Математические функции
Для определенных входных значений с плавающей точкой некоторые блоки могут произвести результаты симуляции, которые отличаются от результатов симуляции MATLAB. Чтобы видеть различие в результатах, прежде чем вы сгенерируете код, включают генерацию модели валидации. В диалоговом окне Configuration Parameters, на панели HDL Code Generation, устанавливают флажок Generate validation model.
Если вы выполняете вычисления, которые включают комплексные числа и исключение, такие как Inf
или NaN
, результат симуляции HDL с нативной плавающей точкой может потенциально отличаться от результата симуляции Simulink. Например, если вы умножаете комплексный вход с Inf
, результатом симуляции Simulink является Infi
, тогда как результатом симуляции HDL является NaN+Infi
.
Если вы вычисляете квадратный корень или логарифм отрицательного числа, результатом симуляции HDL с нативной плавающей точкой является 0
. Этот результат совпадает с результатом симуляции, когда вы проверяете проект с испытательным стендом SystemVerilog DPI. В Simulink полученным результатом является NaN
. Согласно стандарту IEEE 754, если вы вычисляете квадратный корень или логарифм отрицательного числа, результат состоит в том что сам номер.
Если вход к Прямой Интерполяционной таблице (n-D) имеет тип данных с плавающей точкой, но элементы таблицы используют меньший тип данных, сгенерированный HDL-код может быть потенциально неправильным. Например, вход имеет тип single
, и элементы используют тип uint8
. Чтобы получить точные результаты симуляции HDL, используйте совпадающий тип данных для входного сигнала и элементов интерполяционной таблицы.
Если вы используете блок Cosine с входными параметрами -7.729179E28
или 7.729179E28
, сгенерированный HDL-код имеет ULP 4. Для всех других входных параметров ULP равняется 2.
Когда вы используете блок Math Function, чтобы вычислить mod(a,b)
или rem(a,b)
, где a
является дивидендом, и b
является делителем, результат симуляции в нативном режиме точки с плавающей точкой отличается от результата симуляции MATLAB по этим случаям:
Если , результат симуляции в нативном режиме с плавающей точкой является нулем. Для такой значительной разницы в значении между числами a
и b
, эта реализация сохраняет область на целевом устройстве FPGA.
Если , результат симуляции в нативном режиме с плавающей точкой может потенциально отличаться от результатов симуляции MATLAB.