§ Делитель

Зависимости: модуль divmod
  • WIDTH — битность шины
  • STAGE — сколько пройти стадий деления
Запрашивается a/b, получая q (результат) и r (остаток), но это справедливо только тогда, когда количество стадий совпадает с битностью.
1module div
2#(
3    parameter WIDTH = 8,    // Ширина шины
4    parameter STAGE = 8     // Количество стадий
5)
6(
7    input  wire [(WIDTH-1):0] a, // Делитель
8    input  wire [(WIDTH-1):0] b, // Делимое
9    output wire [(WIDTH-1):0] q, // Частное
10    output wire [(WIDTH-1):0] r  // Остаток
11);
12
13assign q = qo[STAGE-1];
14assign r = ro[STAGE-1];
15
16wire [(WIDTH-1):0] ro[STAGE];
17wire [(WIDTH-1):0] qo[STAGE];
18wire [(WIDTH-1):0] zero = 1'b0;
19
20divmod #(.WIDTH( WIDTH )) UnitDivMod
21(
22    .b  (b),
23    .q  (a),     .r  (zero),
24    .qo (qo[0]), .ro (ro[0])
25);
26
27genvar i;
28generate
29
30for (i = 0; i < STAGE-1; i=i+1) begin : DivModX
31divmod #(.WIDTH(WIDTH)) UnitDivMod
32(
33    .b  (b),
34    .q  (qo[i  ]), .r  (ro[i  ]),
35    .qo (qo[i+1]), .ro (ro[i+1])
36);
37end
38
39endgenerate
40
41endmodule