module FIR(clock, reset, data_in, data_out);
   input         clock;
   input         reset;
   input [11:0]  data_in;
   output [11:0] data_out;
   reg [11:0]    data_out;
   
   
   reg [15:0]    d0;
   reg [15:0]    d1;
   reg [15:0]    d2;
   reg [15:0]    d3;
   reg [15:0]    d4;
   reg [15:0]    d5;
   reg [15:0]    d6;
   reg [15:0]    d7;
   reg [15:0]    d8;
   reg [15:0]    d9;
   reg [15:0]    d10;
   reg [15:0]    d11;
   reg [15:0]    d12;
   reg [15:0]    d13;
   reg [15:0]    d14;
   reg [15:0]    d15;
   reg [15:0]    sum;
   
   
   always @(posedge clock or posedge reset)
      if (reset == 1'b1)
      begin
         d0 <= {16{1'b0}};
         d1 <= {16{1'b0}};
         d2 <= {16{1'b0}};
         d3 <= {16{1'b0}};
         d4 <= {16{1'b0}};
         d5 <= {16{1'b0}};
         d6 <= {16{1'b0}};
         d7 <= {16{1'b0}};
         d8 <= {16{1'b0}};
         d9 <= {16{1'b0}};
         d10 <= {16{1'b0}};
         d11 <= {16{1'b0}};
         d12 <= {16{1'b0}};
         d13 <= {16{1'b0}};
         d14 <= {16{1'b0}};
         d15 <= {16{1'b0}};
         sum <= {16{1'b0}};
         data_out <= {12{1'b0}};
      end
      else 
      begin
         d0 <= {data_in[11], data_in[11], data_in[11], data_in[11], data_in};
         d1 <= d0;
         d2 <= d1;
         d3 <= d2;
         d4 <= d3;
         d5 <= d4;
         d6 <= d5;
         d7 <= d6;
         d8 <= d7;
         d9 <= d8;
         d10 <= d9;
         d11 <= d10;
         d12 <= d11;
         d13 <= d12;
         d14 <= d13;
         d15 <= d14;
         sum <= (d0 + d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8 + d9 + d10 + d11 + d12 + d13 + d14 + d15) >> 4;
         data_out <= (sum[11:0]);
      end
   
endmodule