module averager( clk, rst, n, sum, cnt, out, avg ); input [9:0] n; input clk; input rst; output reg [19:0] out; output reg [9:0] cnt; output reg [19:0] sum; output reg [9:0] avg; integer i = 0; always @(posedge clk ) if (rst == 1) begin sum = 20'b0; cnt = 10'b0; out = 20'b0; avg = 10'b0; end else if (rst == 0) begin sum = sum + n; out = sum; cnt = cnt + 1; avg = 0; for (i=0; i<641; i=i+1) begin if(out >= cnt) begin out = out - cnt; avg = avg + 1; end end end endmodule The above is the code to implement a cumulative moving average filter. The for loop is used for division to find the average and involves repeated subtraction. However I am getting the following warning and error:
WARNING:Xst:2254 - Area constraint could not be met for block , final ratio is 509. WARNING:Xst:1336 - (*) More than 100% of Device resources are used ERROR:Pack:18 - The design is too large for the given device and package.
This must be because I am using large values in the for loop and thus am getting a large circuit that can't be implemented. I am looking for an alternative of the for loop, which could find the average for me. I just need the quotient value.
Design Properties: Family: Spartan3E Device: XC3S500E