§ Конвейерный метод
Этот модуль весьма неэффективен.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-2023 Мышка пролетает все права