§ Модуль одной стадии делителя

Это — одна стадия деления, то есть, получение следующего бита.
  • q - делимое и результат от предыдущей стадии
  • b - делитель
  • r - остаток от предыдущей стадии
  • ro - новый остаток
  • qo - результат на следующую стадию
На первой стадии в:
  • q - то, что надо поделить (делимое)
  • r - остаток равен 0
Результат в qo вдвигается в 0-й бит.
На последней стадии:
  • qo - результат деления
  • ro - остаток от деления
1// Одна стадия деления */
2module divmod
3#(parameter WIDTH = 32)
4(
5    input   wire    [(WIDTH-1):0]  q,           // Делимое
6    input   wire    [(WIDTH-1):0]  b,           // Делитель
7    input   wire    [(WIDTH-1):0]  r,           // Остаток
8    // ----
9    output  wire    [(WIDTH-1):0]  ro,          // Остаток
10    output  wire    [(WIDTH-1):0]  qo           // Ответ
11);
12
13/*_____ _____
14 |  r  |  q  | a - исходное делимое
15 +-----+-----+ b - делитель
16 |  b  |  qo | r - входящий остаток
17 +-----+-----+
18 |  ro |
19 +----*/
20
21// Сдвиг на один влево и вычитание
22wire [(WIDTH-1):0] next = {r[(WIDTH-2):0], q[WIDTH-1]};
23wire [ WIDTH   :0] subt = next - b;
24
25// Мультиплексор, который определяет новый остаток
26assign ro = subt[WIDTH] ? next : subt[(WIDTH-1):0];
27
28// Сдвиг делимого влево и заполнение битом результата
29assign qo = {q[(WIDTH-2):0], ~subt[WIDTH]};
30
31endmodule