§ Конвейерный метод

Этот модуль весьма неэффективен.
module div
#(
    parameter W = 8,    // Ширина шины
    parameter S = 8     // Количество стадий
)
(
    input  wire           clock, // Тактовый генератор
    input  wire           block, // =1 Блокировать работу конвейера
    input  wire [(W-1):0] a, // Делитель
    input  wire [(W-1):0] b, // Делимое
    output wire [(W-1):0] q, // Частное
    output wire [(W-1):0] r  // Остаток
);

genvar i;

// Промежуточные провода
wire [(W-1):0] ao[S];
wire [(W-1):0] bo[S];
wire [(W-1):0] ro[S];
wire [(W-1):0] qo[S];
wire [(W-1):0] wz = 1'b0;

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

// Входящие значения
div_stage #(.W(W)) DivUnit
(
    .clock (clock),
    .block (block),
    .ai(a),     .bi(b),     .ri(wz),    .qi(wz),
    .ao(ao[0]), .bo(bo[0]), .ro(ro[0]), .qo(qo[0])
);

generate

// Генерируются оставшиеся блоки под именем DataX
for (i = 0; i < S-1; i=i+1) begin : DataX
div_stage #(.W(W)) DivUnit
(
    .clock (clock),
    .block (block),
    .ai(ao[i]),   .bi(bo[i]),   .ri(ro[i]),   .qi(qo[i]),
    .ao(ao[i+1]), .bo(bo[i+1]), .ro(ro[i+1]), .qo(qo[i+1])
);
end

endgenerate

endmodule

module div_stage
#(parameter W = 8)
(
    input  wire           clock,
    input  wire           block,
    // --- Предыдущая стадия
    input  wire [(W-1):0] ai,       // Делимое
    input  wire [(W-1):0] bi,       // Делитель
    input  wire [(W-1):0] ri,       // Остаток
    input  wire [(W-1):0] qi,       // Результат
    // --- Следующая стадия
    output reg  [(W-1):0] ao,
    output reg  [(W-1):0] bo,
    output reg  [(W-1):0] ro,
    output reg  [(W-1):0] qo        // Результат
);

// Результаты
always @(posedge clock)
if (block == 1'b0) begin

    ao <= {ai[(W-2):0], 1'b0};               // Сдвиг на следующей стадии
    ro <= sub[(W+1)] ? op1 : sub[(W-1):0];   // Мультиплексор
    qo <= {qi[(W-2):0], ~sub[(W+1)]};        // Ответ
    bo <= bi;                                // Следующая стадия

end

// Вычитание операнда
wire [(W-1):0] op1 = {ri[(W-2):0], ai[(W-1)]};
wire [(W+1):0] sub = op1 - bi;

endmodule
16 окт, 2021
© 2007-2022 Том кушает на работе