Multiplikator mit Addierer zu Mac synchronisieren

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
Warum teilen Sie nicht den Code, den Sie bisher haben? Dann können wir Vorschläge machen, die dazu passen und Ihren Schnittstellenkonventionen und Ihrem Codierungsstil folgen.
Nun, ich bin mir nicht sicher, ob ich den Code posten soll, weil er ziemlich lang ist, besonders der des Multiplikators

Antworten (1)

Fügen Sie einen Zähler hinzu und weisen Sie prev_sumihm resultjeden 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