34 lines
804 B
Verilog

module AGC(
input wire clk,
input wire rst,
input wire [7:0] a_coef,
input wire [15:0] reference,
input wire signed [15:0] x_in,
output wire signed [15:0] y_out
);
wire [31:0] x_mod;
wire [31:0] ref_rms;
wire signed [8:0] a_coef_s;
wire signed [32:0] tmp_level;
wire signed [32:0] feedback_level;
reg signed [32:0] zreg;
assign ref_rms = (reference[15:1] * reference[15:1]);
assign a_coef_s = { 1'b0, a_coef};
assign x_mod = (y_out * y_out);
assign tmp_level = ($signed(ref_rms - x_mod))>>>18;
assign feedback_level = (tmp_level * a_coef_s) >>> 8;
always @(posedge clk or negedge rst) begin
if (!rst)
zreg <= 'h0;
else
zreg <= zreg + feedback_level;
end
assign y_out = (zreg * x_in) >>>16;
endmodule