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

Это — одна стадия деления, то есть, получение следующего бита.
  • q - делимое и результат от предыдущей стадии
  • b - делитель
  • r - остаток от предыдущей стадии
  • ro - новый остаток
  • qo - результат на следующую стадию
На первой стадии в:
  • q - то, что надо поделить (делимое)
  • r - остаток равен 0
Результат в qo вдвигается в 0-й бит.
На последней стадии:
  • qo - результат деления
  • ro - остаток от деления
// Одна стадия деления */
module divmod
#(parameter WIDTH = 32)
(
    input   wire    [(WIDTH-1):0]  q,           // Делимое
    input   wire    [(WIDTH-1):0]  b,           // Делитель
    input   wire    [(WIDTH-1):0]  r,           // Остаток
    // ----
    output  wire    [(WIDTH-1):0]  ro,          // Остаток
    output  wire    [(WIDTH-1):0]  qo           // Ответ
);

/*_____ _____
 |  r  |  q  | a - исходное делимое
 +-----+-----+ b - делитель
 |  b  |  qo | r - входящий остаток
 +-----+-----+
 |  ro |
 +----*/

// Сдвиг на один влево и вычитание
wire [(WIDTH-1):0] next = {r[(WIDTH-2):0], q[WIDTH-1]};
wire [ WIDTH   :0] subt = next - b;

// Мультиплексор, который определяет новый остаток
assign ro = subt[WIDTH] ? next : subt[(WIDTH-1):0];

// Сдвиг делимого влево и заполнение битом результата
assign qo = {q[(WIDTH-2):0], ~subt[WIDTH]};

endmodule