Sincronizando multiplicador con sumador para formar mac

He diseñado un multiplicador de 8 bits en Verilog que tarda un máximo de 8 ciclos de reloj en dar el producto. También he codificado un sumador de 16 bits basado en lógica combinacional. Ahora quiero integrar los dos para hacer un acumulador multiplicador de 8 bits, pero no puedo pensar en una buena manera de sincronizar todas las señales. Como en, ¿cómo hago que mi sumador espere 8 ciclos de reloj hasta que se dé el producto, antes de realizar la suma con el resultado anterior?

El resultado del acumulador debe inicializarse primero a cero, que luego cambia cada 8 ciclos de reloj tan pronto como esté disponible el producto correcto. También quiero que el código sea sintetizable. Por favor sugiera una manera de hacer esto.

Esto es lo que he hecho hasta ahora:

    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
¿Por qué no compartes el código que tienes hasta ahora? Entonces podremos ofrecer sugerencias que encajen con él, siguiendo las convenciones de su interfaz y estilo de codificación.
bueno, no estoy seguro si debería publicar el código porque es bastante largo, especialmente el del multiplicador

Respuestas (1)

Agregue un contador y asígnelo prev_sumcada resultoctavo reloj.

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