Ich habe in Verilog einen 8-Bit-Multiplikator entworfen, der maximal 8 Taktzyklen benötigt, um das Produkt zu liefern. Ich habe auch einen 16-Bit-Addierer basierend auf kombinatorischer Logik codiert. Ich möchte jetzt die beiden integrieren, um einen 8-Bit-Multiplikator-Akkumulator zu erstellen, kann mir aber keine gute Möglichkeit vorstellen, alle Signale zu synchronisieren. Wie lasse ich meinen Addierer 8 Taktzyklen warten, bis das Produkt gegeben ist, bevor er die Addition mit dem vorherigen Ergebnis durchführt?
Das Akkumulatorergebnis muss zunächst auf Null initialisiert werden, das sich dann alle 8 Taktzyklen ändert, sobald das richtige Produkt verfügbar ist. Außerdem möchte ich, dass der Code synthetisierbar ist. Bitte schlagen Sie eine Möglichkeit vor, dies zu tun.
Das habe ich bisher gemacht:
module mac_abacus (result, x, y, clk, reset);
output [16:1] result;
input [8:1] x, y;
input clk, reset;
wire [16:1] product;
wire carry, cin;
reg [16:1] prod_bus, prev_sum;
wire [16:1] sth;
ab_mac abmacus (product, x, y, clk, reset); //this is the multiplier
//when reset=1, prev_sum=0, prod_bus=0,result=0
//when reset=0, prev_sum=result(i.e the previous result),
//prod_bus=product(shd change every 8 clock cycles alongwith the product)
condsum16 csummer (result, carry, prod_bus, prev_sum, cin);//this is the accumulator
//so, effectively when reset=0, result shd hold its value until 8 clock cycles when the new product appears
endmodule
Fügen Sie einen Zähler hinzu und weisen Sie prev_sum
ihm result
jeden achten Takt zu.
always @(posedge clk) begin
if (reset) begin
prev_sum <= 16'h00;
counter <= 3'b000;
end
else begin
if (counter == 3'b111) begin
prev_sum <= result;
counter <= 3'b000;
end
else begin
counter <= counter + 1'b1;
end
end
end
David Tweed
Titan