Угрюмов "Цифровая схемотехника", например. И т.п.
1) Берем готовый делитель для целых - модуль с входами и выходами. Находим нужной разрядности. Надо с остатком - ищем с остатком. Надо со знаком... и т.д. CoreGen Вам уже советовали. А баги... Баги у всех есть. И у Вас будут. Были баги - и нету багов. Мелочи... Почитаете даташит на ксайлиновский делитель, сконфигурируете как хочется (что такое divident, quotient, divisor и др. - разберетесь).
2) Пользуемся структурным описанием. Подаем на входы операнды, снимаем результат... Голая цифровая схемотехника, без всяких синтаксических vhdl изъёбов.
3) Теперь имеем делитель, например, двух 16-разрядных операндов (целых) с 16-разрядным результатом. Как поделить им дробные?
Суть в использовании фиксированной точки, правильном представлении входных данных, правильной интерпретации выходных данных.
Пример для делителя двух 16-бит беззнаковых.
Можно делить целые числа.
23
10 = 00000000_00010111
47
10 = 00000000_00101111
На входы делителя подаем:
00000000_00010111
00000000_00101111
На выходе имеем
00000000_00000010, т.е. 2
10 (и остаток, если делитель его выдает)
47 / 23 = 2
Можно дробные...
Вариант 1:
23
10 = 00000001_0111.0000 (12 бит - целая часть, 4 - дробная)
47
10 = 00000010_1111.0000 (12 бит - целая часть, 4 - дробная)
На входы делителя подаем:
00000001_01110000 (делитель)
00000010_11110000 (делимое)
На выходе имеем (частное):
00000000_00000010
Поскольку у делимого и у делителя по 4 разряда на дробную часть,
то 4 - 4 = 0. Т.е. у результата точка справа от нулевого разряда.
Значит результат интерпретируется так:
00000000_00000010. = 2
10Вариант 2:
23
10 = 00000000_00010111 (16 бит - целая часть)
47
10 = 00000010_1111.0000 (12 бит - целая часть, 4 - дробная)
На входы делителя подаем:
00000000_00010111 (делитель)
00000010_11110000 (делимое)
На выходе имеем:
00000000_00100000 (плохой пример

, ну да ладно.)
У делимого на дробную часть отведено 4 разряда, у делителя - 0.
Значит 4 - 0 = 4 - столько разрядов будет отведено у частного (результат) на дробную часть.
Значит результат интерпретируется так:
00000000_0010.0000 = 2
10Еще раз вариант 2 ( с другими операндами - 16 и 5

):
05
10 = 00000000_00000101 (16 бит - целая часть)
16
10 = 00000001_0000.0000 (12 бит - целая часть, 4 - дробная)
На входы делителя подаем:
00000000_00000101 (делитель)
00000001_00000000 (делимое)
На выходе имеем:
00000000_00110011
У делимого на дробную часть отведено 4 разряда, у делителя - 0.
Значит 4 - 0 = 4 - столько разрядов будет отведено у частного (результат) на дробную часть.
Значит результат интерпретируется так:
00000000_0011.0011 = 3.1875
10Ясна идея?