低通FIR滤波器verilog代码
在这个实现中,我们使用了与我们在第二种实现中使用的相同的系数,即我们从MATLAB中生成这些系数,将这些系数转换为Q-15格式(以十六进制表示)并在verilog代码中使用它。类似地,我们取相同的15hz和100hz输入信号,并将其转换为Q-15格式(以十六进制表示)并在verilog中使用。
低通FIR滤波器Verilog代码(Top模块)
模块fir_filter (d_out x、clk重置,有效);
输出signed[15:0] d_out;
输入符号[15:0]x;
输入时钟、复位、有效;
电报签署[15:0]b[0:50];
reg [5:0] coeff_add;
Reg签名[31:0]temp0,temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8,
temp9、temp10 temp11, temp12、temp13 temp14, temp15, temp16, temp17, temp18,
temp19、temp20 temp21, temp22、temp23 temp24, temp25, temp26, temp27, temp28,
temp29、temp30 temp31, temp32、temp33 temp34, temp35, temp36, temp37, temp38,
temp39、temp40 temp41, temp42、temp43 temp44, temp45, temp46, temp47, temp48,
temp49 temp50;
Reg签署了[15:0]y;
Reg签署[15:0]z0,z1,z2,z3,z4,z5,z6,z7,z8,z9,z10,z11,z12,z13,z14,z15,
z16、z17 z18, z19、z20 z21, z22, z23、z24, z25, z26, z27, z28, z29, z30, z31, z32, z33, z34,
z35、z36 z37, z38、z39 z40, z41, z42, z43, z44, z45, z46, z47, z48, z49, z50;
assign b[0] =16'hFFE8;
assign b[1] =16'hFF8E;
assign b[2] =16'hFFAC;
assign b[3] =16'hFFA0;
assign b[4] =16'hFFC2;
赋值b[5] =16'h0002;
assign b[6] =16'h005F;
assign b[7] =16'h00C6;
赋值b[8] =16'h0119;
assign b[9] =16'h013B;
分配b [10] = 16 'h010f;
分配b [11] = 16 'h0087;
分配b [12] = 16 'hffab;
分配b [13] = 16 'hfe9a;
分配b [14] = 16 'hfd8f;
分配b [15] = 16 'hfcd4;
分配b [16] = 16 'hfcb6;
分配b [17] = 16 'hfd76;
分配b [18] = 16 'hff37;
分配b [19] = 16 'h01f0;
分配b [20] = 16 'h056f;
分配b [21] = 16 'h0952;
分配b [22] = 16 'h0d1e;
分配b [23] = 16 'h104f;
分配b [24] = 16 'h126f;
分配b [25] = 16 'h132e;
分配b [26] = 16 'h126f;
分配b [27] = 16 'h104f;
分配b [28] = 16 'h0d1e;
分配b [29] = 16 'h0952;
分配b [30] = 16 'h056f;
分配b [31] = 16 'h01f0;
分配b [32] = 16 'hff37;
分配b [33] = 16 'hfd76;
分配b [34] = 16 'hfcb6;
分配b [35] = 16 'hfcd4;
分配b [36] = 16 'hfd8f;
分配b [37] = 16 'hfe9a;
分配b [38] = 16 'hffab;
分配b [39] = 16 'h0087;
分配b [40] = 16 'h010f;
分配b [41] = 16 'h013b;
分配b [42] = 16 'h0119;
分配b [43] = 16 'h00c6;
分配b [44] = 16 'h005f;
分配b [45] = 16 'h0002;
分配b [46] = 16 'hffc2;
分配b [47] = 16 'hffa0;
分配b [48] = 16 'hffac;
分配b [49] = 16 'hff8e;
分配b [50] = 16 'hffe8;
输出signed[15:0] d_out;
输入符号[15:0]x;
输入时钟、复位、有效;
电报签署[15:0]b[0:50];
reg [5:0] coeff_add;
Reg签名[31:0]temp0,temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8,
temp9、temp10 temp11, temp12、temp13 temp14, temp15, temp16, temp17, temp18,
temp19、temp20 temp21, temp22、temp23 temp24, temp25, temp26, temp27, temp28,
temp29、temp30 temp31, temp32、temp33 temp34, temp35, temp36, temp37, temp38,
temp39、temp40 temp41, temp42、temp43 temp44, temp45, temp46, temp47, temp48,
temp49 temp50;
Reg签署了[15:0]y;
Reg签署[15:0]z0,z1,z2,z3,z4,z5,z6,z7,z8,z9,z10,z11,z12,z13,z14,z15,
z16、z17 z18, z19、z20 z21, z22, z23、z24, z25, z26, z27, z28, z29, z30, z31, z32, z33, z34,
z35、z36 z37, z38、z39 z40, z41, z42, z43, z44, z45, z46, z47, z48, z49, z50;
assign b[0] =16'hFFE8;
assign b[1] =16'hFF8E;
assign b[2] =16'hFFAC;
assign b[3] =16'hFFA0;
assign b[4] =16'hFFC2;
赋值b[5] =16'h0002;
assign b[6] =16'h005F;
assign b[7] =16'h00C6;
赋值b[8] =16'h0119;
assign b[9] =16'h013B;
分配b [10] = 16 'h010f;
分配b [11] = 16 'h0087;
分配b [12] = 16 'hffab;
分配b [13] = 16 'hfe9a;
分配b [14] = 16 'hfd8f;
分配b [15] = 16 'hfcd4;
分配b [16] = 16 'hfcb6;
分配b [17] = 16 'hfd76;
分配b [18] = 16 'hff37;
分配b [19] = 16 'h01f0;
分配b [20] = 16 'h056f;
分配b [21] = 16 'h0952;
分配b [22] = 16 'h0d1e;
分配b [23] = 16 'h104f;
分配b [24] = 16 'h126f;
分配b [25] = 16 'h132e;
分配b [26] = 16 'h126f;
分配b [27] = 16 'h104f;
分配b [28] = 16 'h0d1e;
分配b [29] = 16 'h0952;
分配b [30] = 16 'h056f;
分配b [31] = 16 'h01f0;
分配b [32] = 16 'hff37;
分配b [33] = 16 'hfd76;
分配b [34] = 16 'hfcb6;
分配b [35] = 16 'hfcd4;
分配b [36] = 16 'hfd8f;
分配b [37] = 16 'hfe9a;
分配b [38] = 16 'hffab;
分配b [39] = 16 'h0087;
分配b [40] = 16 'h010f;
分配b [41] = 16 'h013b;
分配b [42] = 16 'h0119;
分配b [43] = 16 'h00c6;
分配b [44] = 16 'h005f;
分配b [45] = 16 'h0002;
分配b [46] = 16 'hffc2;
分配b [47] = 16 'hffa0;
分配b [48] = 16 'hffac;
分配b [49] = 16 'hff8e;
分配b [50] = 16 'hffe8;
总是@ (posedge clk)
开始
如果(重置)
coeff_add < = 6 'd0;
else if (coeff_add = = 6 'd50)
coeff_add < = 6 'd1;
else if(有效)
Coeff_add <= Coeff_add + 1'd1;
结束
总是@ (posedge clk)
开始
如果(重置)
开始
temp0 < = 16 'd0; temp1 < = 16 'd0; temp2 < = 16 'd0; temp3 < = 16 'd0; temp4 < = 16 'd0;
temp5 < = 16 'd0; temp6 < = 16 'd0; temp7 < = 16 'd0; temp8 < = 16 'd0; temp9 < = 16 'd0;
temp10 < = 16 'd0; temp11 < = 16 'd0; temp12 < = 16 'd0; temp13 < = 16 'd0; temp14 < = 16 'd0;
temp15 < = 16 'd0; temp16 < = 16 'd0; temp17 < = 16 'd0; temp18 < = 16 'd0; temp19 < = 16 'd0;
temp20 < = 16 'd0; temp21 < = 16 'd0; temp22 < = 16 'd0; temp23 < = 16 'd0; temp24 < = 16 'd0;
temp25 < = 16 'd0; temp26 < = 16 'd0; temp27 < = 16 'd0; temp28 < = 16 'd0; temp29 < = 16 'd0;
temp30 < = 16 'd0; temp31 < = 16 'd0; temp32 < = 16 'd0; temp33 < = 16 'd0; temp34 < = 16 'd0;
temp35 < = 16 'd0;
temp36 < = 16 'd0; temp37 < = 16 'd0; temp38 < = 16 'd0; temp39 < = 16 'd0; temp40 < = 16 'd0;
temp41 < = 16 'd0; temp42 < = 16 'd0; temp43 < = 16 'd0; temp44 < = 16 'd0; temp45 < = 16 'd0;
temp46 < = 16 'd0; temp47 < = 16 'd0;
temp48 < = 16 'd0; temp49 < = 16 'd0; temp50 < = 16 'd0;
y < = 16 'd0;
z0 < = 16 'd0; z1 < = 16 'd0; z2 < = 16 'd0; z3 < = 16 'd0; z4 < = 16 'd0; z5 < = 16 'd0;
z6 < = 16 'd0; z7 < = 16 'd0; z8等车型后< = 16 'd0; z9 <亨里克·菲克斯= 16 'd0; z10 < = 16 'd0; z11 < = 16 'd0;
z12 < = 16 'd0; z13 < = 16 'd0; z14 < = 16 'd0; z15 < = 16 'd0; z16 < = 16 'd0; z17 < = 16 'd0;
z18 < = 16 'd0;
z19 < = 16 'd0;
z20 < = 16 'd0;
z21 < = 16 'd0;
z22 < = 16 'd0; z23 16 'd0 < < = = 16 'd0;
z24 < = 16 'd0; z25 < = 16 'd0; z26 < = 16 'd0; z27 < = 16 'd0; z28 < = 16 'd0; z29 < = 16 'd0;
z30 < = 16 'd0;
z31 < = 16 'd0; z32 < = 16 'd0; z33 < = 16 'd0;
z34 < = 16 'd0;
z35 < = 16 'd0; z36 < = 16 'd0;
z37 < = 16 'd0; z38 < = 16 'd0;
z39 < = 16 'd0; z40 < = 16 'd0; z41 < = 16 'd0; z42 < = 16 'd0;
z43 < = 16 'd0; z44 < = 16 'd0; z45 < = 16 'd0; z46 < = 16 'd0; z47 < = 16 'd0; z48 < = 16 'd0;
z49 < = 16 'd0;
z50
< = 16 'd0;结束
else if(有效)
开始
z0 < = x; z1 < = z0; z2 < = z1; z3 < = z2; z4 z5 < = z4; z6 < = z3; < = z5;
z7 < = z6; z8等车型后< = z7;亨里克·菲克斯z9 < = z8等车型后,亨里克·菲克斯z10 < = z9; z11 < = z10; z12 < = z11;
z13 < = z12; z14 < = z13; z15 < = z14;
z16 < = z15; z17 < = z16; z18 < = z17;
z19 < = z18; z20 < = z19; z21 < = z20;
z22 < = z21; z23 < = z22;
z24 < = z23; z25 < = z24; z26 < = z25; z27 < = z26;
z28 < = z27; z29 < = z28;
z30 < = z29; z31 < = z30; z32 < = z31;
z33 < = z32; z34 < = z33; z35 < = z34;
z36 < = z35; z37 < = z36; z38 < = z37;
z39 < = z38; z40 < = z39; z41 < = z40; z42 < = z41;
z43 < = z42; z44 < = z43; z45 < = z44;
z46 < = z45; z47 < = z46; z48 < = z47; z49 < = z48; z50 < = z49;Temp0 <=z0 * b[0];
Temp1 <=z1 * b[1];
Temp2 <=z2 * b[2];
Temp3 <=z3 * b[3];
Temp4 <=z4 * b[4];
Temp5 <=z5 * b[5];
Temp6 <=z6 * b[6];
Temp7 <=z7 * b[7];
Temp8 <=z8 * b[8];
Temp9 <=z9 * b[9];
Temp10 <=z10 * b[10];
Temp11 <=z11 * b[11];
Temp12 <=z12 * b[12];
Temp13 <=z13 * b[13];
Temp14 <=z14 * b[14];
Temp15 <=z15 * b[15];
Temp16 <=z16 * b[16];
Temp17 <=z17 * b[17];
Temp18 <=z18 * b[18];
Temp19 <=z19 * b[19];
Temp20 <=z20 * b[20];
Temp21 <=z21 * b[21];
Temp22 <=z22 * b[22];
Temp23 <=z23 * b[23];
Temp24 <=z24 * b[24];
Temp25 <=z25 * b[25];
Temp26 <=z26 * b[26];
Temp27 <=z27 * b[27];
Temp28 <=z28 * b[28];
Temp29 <=z29 * b[29];
Temp30 <=z30 * b[30];
Temp31 <=z31 * b[31];
Temp32 <=z32 * b[32];
Temp33 <=z33 * b[33];
Temp34 <=z34 * b[34];
Temp35 <=z35 * b[35];
Temp36 <=z36 * b[36];
Temp37 <=z37 * b[37];
Temp38 <=z38 * b[38];
Temp39 <=z39 * b[39];
Temp40 <=z40 * b[40];
Temp41 <=z41 * b[41];
Temp42 <=z42 * b[42];
Temp43 <=z43 * b[43];
Temp44 <=z44 * b[44];
Temp45 <=z45 * b[45];
Temp46 <=z46 * b[46];
Temp47 <=z47 * b[47];
Temp48 <=z48 * b[48];
Temp49 <=z49 * b[49];
Temp50 <=z50 * b[50];
Y <=temp0[30:15] + temp1[30:15] + temp2[30:15] +temp3[30:15] + temp4[30:15] + temp5 [30:15] + temp6[30:15] + temp7[30:15] +
Temp8 [30:15] + temp9[30:15] + temp10 [30:15] + temp11[30:15] + temp12[30:15] + temp13[30:15] + temp14[30:15] + temp15 [30:15] + temp16[30:15] + temp17[30:15] + temp18[30:15] +
Temp19 [30:15] + temp20 [30:15] + temp21[30:15] + temp22[30:15] + temp23[30:15] + temp24[30:15] + temp25 [30:15] + temp27[30:15] + temp28[30:15] + temp29[30:15] + temp30 [30:15] + temp31[30:15] + temp32[30:15] +
Temp33 [30:15] + temp34[30:15] + temp35 [30:15] + temp36[30:15] + temp38[30:15] + temp39[30:15] + temp40 [30:15] + temp41 [30:15] + temp42[30:15] + temp43[30:15] + temp44[30:15] + temp45 [30:15] + temp46[30:15] + temp48[30:15] + temp49[30:15] + temp50 [30:15];
结束
结束
分配d_out = y;
endmodule
开始
如果(重置)
coeff_add < = 6 'd0;
else if (coeff_add = = 6 'd50)
coeff_add < = 6 'd1;
else if(有效)
Coeff_add <= Coeff_add + 1'd1;
结束
总是@ (posedge clk)
开始
如果(重置)
开始
temp0 < = 16 'd0; temp1 < = 16 'd0; temp2 < = 16 'd0; temp3 < = 16 'd0; temp4 < = 16 'd0;
temp5 < = 16 'd0; temp6 < = 16 'd0; temp7 < = 16 'd0; temp8 < = 16 'd0; temp9 < = 16 'd0;
temp10 < = 16 'd0; temp11 < = 16 'd0; temp12 < = 16 'd0; temp13 < = 16 'd0; temp14 < = 16 'd0;
temp15 < = 16 'd0; temp16 < = 16 'd0; temp17 < = 16 'd0; temp18 < = 16 'd0; temp19 < = 16 'd0;
temp20 < = 16 'd0; temp21 < = 16 'd0; temp22 < = 16 'd0; temp23 < = 16 'd0; temp24 < = 16 'd0;
temp25 < = 16 'd0; temp26 < = 16 'd0; temp27 < = 16 'd0; temp28 < = 16 'd0; temp29 < = 16 'd0;
temp30 < = 16 'd0; temp31 < = 16 'd0; temp32 < = 16 'd0; temp33 < = 16 'd0; temp34 < = 16 'd0;
temp35 < = 16 'd0;
temp36 < = 16 'd0; temp37 < = 16 'd0; temp38 < = 16 'd0; temp39 < = 16 'd0; temp40 < = 16 'd0;
temp41 < = 16 'd0; temp42 < = 16 'd0; temp43 < = 16 'd0; temp44 < = 16 'd0; temp45 < = 16 'd0;
temp46 < = 16 'd0; temp47 < = 16 'd0;
temp48 < = 16 'd0; temp49 < = 16 'd0; temp50 < = 16 'd0;
y < = 16 'd0;
z0 < = 16 'd0; z1 < = 16 'd0; z2 < = 16 'd0; z3 < = 16 'd0; z4 < = 16 'd0; z5 < = 16 'd0;
z6 < = 16 'd0; z7 < = 16 'd0; z8等车型后< = 16 'd0; z9 <亨里克·菲克斯= 16 'd0; z10 < = 16 'd0; z11 < = 16 'd0;
z12 < = 16 'd0; z13 < = 16 'd0; z14 < = 16 'd0; z15 < = 16 'd0; z16 < = 16 'd0; z17 < = 16 'd0;
z18 < = 16 'd0;
z19 < = 16 'd0;
z20 < = 16 'd0;
z21 < = 16 'd0;
z22 < = 16 'd0; z23 16 'd0 < < = = 16 'd0;
z24 < = 16 'd0; z25 < = 16 'd0; z26 < = 16 'd0; z27 < = 16 'd0; z28 < = 16 'd0; z29 < = 16 'd0;
z30 < = 16 'd0;
z31 < = 16 'd0; z32 < = 16 'd0; z33 < = 16 'd0;
z34 < = 16 'd0;
z35 < = 16 'd0; z36 < = 16 'd0;
z37 < = 16 'd0; z38 < = 16 'd0;
z39 < = 16 'd0; z40 < = 16 'd0; z41 < = 16 'd0; z42 < = 16 'd0;
z43 < = 16 'd0; z44 < = 16 'd0; z45 < = 16 'd0; z46 < = 16 'd0; z47 < = 16 'd0; z48 < = 16 'd0;
z49 < = 16 'd0;
z50
< = 16 'd0;结束
else if(有效)
开始
z0 < = x; z1 < = z0; z2 < = z1; z3 < = z2; z4 z5 < = z4; z6 < = z3; < = z5;
z7 < = z6; z8等车型后< = z7;亨里克·菲克斯z9 < = z8等车型后,亨里克·菲克斯z10 < = z9; z11 < = z10; z12 < = z11;
z13 < = z12; z14 < = z13; z15 < = z14;
z16 < = z15; z17 < = z16; z18 < = z17;
z19 < = z18; z20 < = z19; z21 < = z20;
z22 < = z21; z23 < = z22;
z24 < = z23; z25 < = z24; z26 < = z25; z27 < = z26;
z28 < = z27; z29 < = z28;
z30 < = z29; z31 < = z30; z32 < = z31;
z33 < = z32; z34 < = z33; z35 < = z34;
z36 < = z35; z37 < = z36; z38 < = z37;
z39 < = z38; z40 < = z39; z41 < = z40; z42 < = z41;
z43 < = z42; z44 < = z43; z45 < = z44;
z46 < = z45; z47 < = z46; z48 < = z47; z49 < = z48; z50 < = z49;Temp0 <=z0 * b[0];
Temp1 <=z1 * b[1];
Temp2 <=z2 * b[2];
Temp3 <=z3 * b[3];
Temp4 <=z4 * b[4];
Temp5 <=z5 * b[5];
Temp6 <=z6 * b[6];
Temp7 <=z7 * b[7];
Temp8 <=z8 * b[8];
Temp9 <=z9 * b[9];
Temp10 <=z10 * b[10];
Temp11 <=z11 * b[11];
Temp12 <=z12 * b[12];
Temp13 <=z13 * b[13];
Temp14 <=z14 * b[14];
Temp15 <=z15 * b[15];
Temp16 <=z16 * b[16];
Temp17 <=z17 * b[17];
Temp18 <=z18 * b[18];
Temp19 <=z19 * b[19];
Temp20 <=z20 * b[20];
Temp21 <=z21 * b[21];
Temp22 <=z22 * b[22];
Temp23 <=z23 * b[23];
Temp24 <=z24 * b[24];
Temp25 <=z25 * b[25];
Temp26 <=z26 * b[26];
Temp27 <=z27 * b[27];
Temp28 <=z28 * b[28];
Temp29 <=z29 * b[29];
Temp30 <=z30 * b[30];
Temp31 <=z31 * b[31];
Temp32 <=z32 * b[32];
Temp33 <=z33 * b[33];
Temp34 <=z34 * b[34];
Temp35 <=z35 * b[35];
Temp36 <=z36 * b[36];
Temp37 <=z37 * b[37];
Temp38 <=z38 * b[38];
Temp39 <=z39 * b[39];
Temp40 <=z40 * b[40];
Temp41 <=z41 * b[41];
Temp42 <=z42 * b[42];
Temp43 <=z43 * b[43];
Temp44 <=z44 * b[44];
Temp45 <=z45 * b[45];
Temp46 <=z46 * b[46];
Temp47 <=z47 * b[47];
Temp48 <=z48 * b[48];
Temp49 <=z49 * b[49];
Temp50 <=z50 * b[50];
Y <=temp0[30:15] + temp1[30:15] + temp2[30:15] +temp3[30:15] + temp4[30:15] + temp5 [30:15] + temp6[30:15] + temp7[30:15] +
Temp8 [30:15] + temp9[30:15] + temp10 [30:15] + temp11[30:15] + temp12[30:15] + temp13[30:15] + temp14[30:15] + temp15 [30:15] + temp16[30:15] + temp17[30:15] + temp18[30:15] +
Temp19 [30:15] + temp20 [30:15] + temp21[30:15] + temp22[30:15] + temp23[30:15] + temp24[30:15] + temp25 [30:15] + temp27[30:15] + temp28[30:15] + temp29[30:15] + temp30 [30:15] + temp31[30:15] + temp32[30:15] +
Temp33 [30:15] + temp34[30:15] + temp35 [30:15] + temp36[30:15] + temp38[30:15] + temp39[30:15] + temp40 [30:15] + temp41 [30:15] + temp42[30:15] + temp43[30:15] + temp44[30:15] + temp45 [30:15] + temp46[30:15] + temp48[30:15] + temp49[30:15] + temp50 [30:15];
结束
结束
分配d_out = y;
endmodule
描述:
这里我们将输入(x)和输出(d_out)作为十六进制格式的带符号的16位值。Valid, clk, rst是其他输入信号。这里我们还声明了一个存储系数(b)的ROM。电报签署[15:0]b[0:50];
ROM的深度为51位,宽度为16位。16位大小的51个系数存储在这个ROM中。Coeff_add是一个6位的计数器。Temp, z和y是内部信号,在上面的代码中声明。输入(x)在每个时钟边缘的z中加载,然后在每个边缘上移位。然后这些z值与系数相乘,然后存储在称为“temp”的内部信号中。然后这些临时值的上16位被添加到另一个内部信号'y'中,然后最后'y'被赋值给输出'd_out'。
图1 . verilog代码的输出信号(d_out),在MATLAB中绘制
因此,我们可以将MATLAB代码和verilog代码得到的两个输出波形进行比较,从而得出两个输出几乎相同的结论。因此,低通FIR滤波器是在MATLAB中利用它的功能,使用FDA工具和Verilog实现的。
射频和无线教程
无线局域网802.11交流802.11广告wimax无线个域网z - waveGSMLTEUMTS蓝牙超宽频物联网卫星天线雷达