faye_hongdou
Member level 1
Code:
module halfband(clk, din, dout);
input clk;
input [11:0] din;
output [12:0] dout;
reg [12:0] dout;
reg [11:0] d_m4, d_m3, d_m2, d_m1, d_0, d_1, d_2, d_3, d_4, d_5;
reg half;
wire [12:0] r5, r3, r1;
wire [11:0] r0;
wire [22:0] rr5, rr3, rr1, rr0;
wire [22:0] result;
always @ (posedge clk)
half <= ! half;
always @ (posedge clk)
if (half)
dout <= result [22: 10] ;
always @ (posedge clk)
begin
d_m4 <= din;
d_m3 <= d_m4;
d_m2 <= d_m3;
d_m1 <= d_m2;
d_0 <= d_m1;
d_1 <= d_0;
d_2 <= d_1;
d_3 <= d_2;
d_4 <= d_3;
d_5 <= d_4;
end
assign r5 = {d_5[11], d_5} + {din[11], din};
assign r3 = {d_3[11], d_3} + {d_m3[11], d_m3};
assign r1 = {d_1[11], d_1} + {d_m1[11], d_m1};
assign r0 = {d_0};
// expand the data to 24 bit data.
assign rr5 = r5[12] ? {11'b1, r5} : {11'b0, r5};
assign rr3 = r3[12] ? {11'b1, r3} : {11'b0, r3};
assign rr1 = r1[12] ? {11'b1, r1} : {11'b0, r1};
assign rr0 = r0[11] ? {12'b1, r0} : {12'b0, r0};
wire [22:0] result1 = r5 - (r3<<4);
wire [22:0] result2 = result1 + (r1 <<1);
wire [22:0] result3 = result2 + (result2 << 2);
wire [22:0] result4 = r1 + (rr1<< 6);
wire [22:0] result5 = (r1 << 9 ) + (r0 << 10);
wire [22:0] result6 = result4 + result5;
assign result = result3 + result6;
endmodule
I know that for a halfband filter, every alternative coefficent is zero. And understand the assignment "d_m4 <= din" etc. My problem is that why r5, r3 and r1 should be 13 bits, while r is 12bits. And how the result, result1, ..., result6 is calculated.
The only thing I know is that it is a halfband filter, how can I calculate the coefficients for this filter?
[/img]/root/Desktop/6.jpg