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