Реализация метода деления и десятичного умножения нецелых степеней двойки в FPGA

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

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

        Мы знаем, что в FPGA, если вам нужно разделить число до целой степени 2, вы можете использовать для этого метод сдвига вправо ">>". Например, деление числа на 8 может быть достигнуто путем сдвига его на вправо на 3 бита. Так что же делать, если делитель не является целой степенью числа 2. Напрямую реализовать эту операцию в ПЛИС нет возможности, поэтому нужно реализовать ее через циклическое вычитание. Конкретный метод реализации заключается в сравнении делимого с делителем. Когда делимое больше делителя, мы прибавляем единицу к частному и вычитаем делитель из делимого. Эта операция повторяется до тех пор, пока делимое не станет меньше делителя. на этот раз оставшееся значение дивиденда является остатком , а совокупная сумма частных, полученных в этот момент, является частным результатом деления. Приведем простой пример: результатом 16/3 является 5 с оставшейся 1, делимое равно 16, а делитель равен 3; сначала начальное значение частного устанавливается равным 0, и первый раз, когда делимое сравнивается с делителем 16>3, поэтому прибавляется частное. Сначала частное в этот момент равно 1, а делимое после вычитания делителя равно 16-3=13; во второй раз сравните 13 с 3, также прибавьте 1 к частному, вычесть из делимого делитель 3 и получить в это время частное 2. Делимое остается 10; затем снова сравниваем 10>3, частное равно 3, а делимое остается 7; и так далее, четвертое частное равно 3, делимое остается 4, пятое частное равно 5, делимое остается 1, в это время если делимое меньше делителя, частное равно 5, а остаток равен 1.

        Далее поговорим об умножении десятичных дробей Verilog не может напрямую реализовать умножение десятичных дробей. Итак, нам нужно учитывать точность, сначала увеличить десятичную дробь, увеличение представляет собой целую степень 2, затем умножить увеличенную десятичную дробь на множитель, а затем разделить результат на увеличение, эту операцию можно выполнить с помощью метода перемещения вправо, чтобы достигать. Также приведите пример: 20*0,3=6. Сначала умножаем 0,3 на 2 в 8-й степени, то есть 0,3*128=38,4 примерно равно 38, затем используем 20*38=760, а затем сдвигаем 760 вправо на 8 бит, то есть 760/128 =5,9375, поэтому получаем Приведена аппроксимация результата расчета 6. Если требования к точности относительно высоки, можно выбрать больший коэффициент увеличения, например, результат, полученный при увеличении в 1024 раза, приблизительно равен 5,996.

        Таким образом, мы можем вычислить некоторые операции умножения и деления, которые не могут быть синтезированы в ПЛИС.

おすすめ

転載: blog.csdn.net/qq_57541474/article/details/128973207