Sincronizando multiplicador con sumador para formar mac

2

He diseñado un multiplicador de 8 bits en Verilog que requiere un máximo de 8 ciclos de reloj para 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. Al igual que en, ¿cómo hago que mi sumador espere 8 ciclos de reloj hasta que el producto sea entregado, antes de que se agregue al resultado anterior?

El resultado del acumulador debe inicializarse primero a cero, que luego cambia cada 8 ciclos de reloj tan pronto como el producto correcto esté disponible. 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
    
pregunta titan

1 respuesta

2

Agregue un contador y asigne prev_sum a result en cada octavo 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
    
respondido por el Greg

Lea otras preguntas en las etiquetas