§ Делитель

Зависимости: модуль divmod
  • WIDTH — битность шины
  • STAGE — сколько пройти стадий деления
Запрашивается a/b, получая q (результат) и r (остаток), но это справедливо только тогда, когда количество стадий совпадает с битностью.
module div
#(
    parameter WIDTH = 8,    // Ширина шины
    parameter STAGE = 8     // Количество стадий
)
(
    input  wire [(WIDTH-1):0] a, // Делитель
    input  wire [(WIDTH-1):0] b, // Делимое
    output wire [(WIDTH-1):0] q, // Частное
    output wire [(WIDTH-1):0] r  // Остаток
);

assign q = qo[STAGE-1];
assign r = ro[STAGE-1];

wire [(WIDTH-1):0] ro[STAGE];
wire [(WIDTH-1):0] qo[STAGE];
wire [(WIDTH-1):0] zero = 1'b0;

divmod #(.WIDTH( WIDTH )) UnitDivMod
(
    .b  (b),
    .q  (a),     .r  (zero),
    .qo (qo[0]), .ro (ro[0])
);

genvar i;
generate

for (i = 0; i < STAGE-1; i=i+1) begin : DivModX
divmod #(.WIDTH(WIDTH)) UnitDivMod
(
    .b  (b),
    .q  (qo[i  ]), .r  (ro[i  ]),
    .qo (qo[i+1]), .ro (ro[i+1])
);
end

endgenerate

endmodule