1 // Short halfband decimator (intended to be followed by another stage)
2 // Implements impulse responses of the form [A 0 B 0.5 B 0 A]
4 // These taps designed by halfgen4 from ldoolittle:
5 // 2 * 131072 * halfgen4(.75/8,2)
13 input [WIDTH-1:0] data_in,
15 output [WIDTH-1:0] data_out);
18 reg [WIDTH-1:0] data_in_d1;
19 always @(posedge clk) stb_in_d1 <= stb_in;
20 always @(posedge clk) data_in_d1 <= data_in;
23 reg phase, go_d1, go_d2, go_d3, go_d4;
29 assign go = stb_in_d1 & phase;
46 wire [17:0] coeff_a = -10690;
47 wire [17:0] coeff_b = 75809;
49 reg [WIDTH-1:0] d1, d2, d3, d4 , d5, d6;
61 reg [17:0] sum_a, sum_b, middle, middle_d1;
62 wire [17:0] sum_a_unreg, sum_b_unreg;
63 add2 #(.WIDTH(18)) add2_a (.in1(data_in_d1),.in2(d6),.sum(sum_a_unreg));
64 add2 #(.WIDTH(18)) add2_b (.in1(d2),.in2(d4),.sum(sum_b_unreg));
78 wire [17:0] sum = go_d1 ? sum_b : sum_a;
79 wire [17:0] coeff = go_d1 ? coeff_b : coeff_a;
81 MULT18X18S mult(.C(clk), .CE(go_d1 | go_d2), .R(rst), .P(prod), .A(coeff), .B(sum) );
88 accum <= {middle_d1[17],middle_d1[17],middle_d1,16'd0} + {prod};
90 accum <= accum + {prod};
92 wire [17:0] accum_rnd;
93 round #(.bits_in(36),.bits_out(18)) round_acc (.in(accum),.out(accum_rnd));
98 final_sum <= data_in_d1;
100 final_sum <= accum_rnd;
102 assign data_out = final_sum;
104 always @(posedge clk)
108 stb_out <= stb_in_d1;
111 endmodule // small_hb_dec