Задача умножения с плавающей точкой в ​​Verilog - PullRequest
0 голосов
/ 25 января 2020

Для данного проекта я столкнулся с умножением с плавающей запятой в verilog . Поэтому я использовал IP-ядра Xilinx в ISE 14.7 со следующими конфигурациями для IP-ядра с плавающей запятой GUI:

  • Multiply
  • Single (Ширина экспоненты: 8 бит, ширина дроби: 24)
  • Не используется (при оптимизации семейства)
  • максимальная задержка (которая здесь составляет 8 тактов)

, поэтому, когда я даю следующие входные данные в ieee 754 формат

A = 0_0111111_000000000000000000000000 (which is one)

B = 0_0111111_000000000000000000000000 

результат после 8 тактов:

0_0111110_100000000000000000000000

мой вопрос, почему результат не один в формате ieee 754? кто не прав?

1 Ответ

0 голосов
/ 25 января 2020

Вот как декодируется ваше первое число:

                  3  2          1         0
                  1 09876543 21098765432109876543210
                  S ---E8--- ----------F23----------
          Binary: 0 01111110 00000000000000000000000
             Hex: 3F00 0000
       Precision: SP
            Sign: Positive
        Exponent: -1 (Stored: 126, Bias: 127)
       Hex-float: +0x1p-1
           Value: +0.5 (NORMAL)

Итак, его значение равно 0.5, а не 1, как вы заявили.

Вот как декодируется продукт:

                  3  2          1         0
                  1 09876543 21098765432109876543210
                  S ---E8--- ----------F23----------
          Binary: 0 01111101 00000000000000000000000
             Hex: 3E80 0000
       Precision: SP
            Sign: Positive
        Exponent: -2 (Stored: 125, Bias: 127)
       Hex-float: +0x1p-2
           Value: +0.25 (NORMAL)

Итак, это 0.25. И это правильно, поскольку 0.5 * 0.5 = 0.25 действительно.

Если вы хотите проверить умножение 1 * 1 = 1, используйте следующую кодировку:

                  3  2          1         0
                  1 09876543 21098765432109876543210
                  S ---E8--- ----------F23----------
          Binary: 0 01111111 00000000000000000000000
             Hex: 3F80 0000
       Precision: SP
            Sign: Positive
        Exponent: 0 (Stored: 127, Bias: 127)
       Hex-float: +0x1p0
           Value: +1.0 (NORMAL)

, то есть 0_01111111_00000000000000000000000, как число 1.0 кодируется как 32-битное значение с плавающей точкой IEEE754 одинарной точности. В частности, обратите внимание, что показатель степени равен 8 битам, что, по-видимому, является источником проблемы в исходной кодировке, где у вас есть 7 бит.

...