Существует два основных способа реализации рациональных чисел в HDL:
1) Если вам нужен фиксированный знаменатель, который всегда является степенью двойки, вы можете просто использовать числа с фиксированной точкой, которые имеют нормальные два-полное представление, но имеют биты с индексом меньше нуля, так что, как [3:0]
"0111"
будет 0*2**3 + 1*2**2 + 1*2**1 + 1*2**0 = 7
, [1:-2]
"0111"
будет 0*2**1 + 1*2**0 + 1*2**-1 + 1*2**-2 = 1.75
.В обычном Verilog вы можете использовать отрицательные индикаторы, подобные этому, но вам придется обрабатывать сдвиг и масштабирование, когда вы выполняете операции вручную (например, помещаете каждую операцию в свою собственную функцию или модуль).С помощью SystemVerilog или VHDL вы можете создать (или использовать существующий) пакет с фиксированной запятой, который обрабатывает это автоматически с типами данных.
2) Если вы хотите иметь произвольные знаменатели, вы можете просто использовать два регистра для представлениякаждое значение, где один - числитель, а один - знаменатель.Опять же, вам придется обрабатывать выполнение математических операций вручную.И снова, если вы используете SystemVerilog или VHDL, вы можете заключить это поведение в тип данных.
Удачи!