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
Agregue un contador y asígnelo prev_sum
cada result
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
david tweed
titán