基于FPGA的五级积分梳状CIC滤波器Verilog设计
系统概述
本文介绍基于FPGA的五级积分梳状(CIC)滤波器Verilog设计。CIC滤波器在数字信号处理中常用于抽取和插值,具有结构简单、无需乘法器等优点。
位宽扩展与精度控制
在CIC滤波过程中,输出位宽会显著增加。若直接对中间信号截位,会导致精度下降并影响系统性能。本设计输入的中频信号经ADC采样后为14位,下变频处理后仍为14位。为防止中间处理溢出并保证精度,将CIC滤波器的输入位宽扩展至40位。
级数选择依据
从硬件资源角度考虑,CIC滤波器级数过高会导致输出位宽过大,占用过多资源;级数过低则无法达到预期滤波效果。经验证,当级数大于5时,输出位宽超过50位,资源占用显著增加;而1-2级效果不佳。综合仿真分析,选择5级结构最为合理。
Verilog代码实现
module cic_filter (
input wire clk,
input wire rst,
input wire [13:0] din,
output reg [39:0] dout
);
// 延迟单元声明
reg [39:0] delay_1 [0:4];
reg [39:0] delay_2 [0:4];
always @(posedge clk or posedge rst) begin
if (rst) begin
for (integer i = 0; i < 5; i = i + 1) begin
delay_1[i] <= 40'd0;
delay_2[i] <= 40'd0;
end
dout <= 40'd0;
end else begin
// 输入数据符号扩展为40位
delay_1[0] <= {{26{din[13]}}, din};
// 积分部分数据传递
for (integer i = 1; i < 5; i = i + 1) begin
delay_1[i] <= delay_1[i - 1];
end
// 积分累加
delay_2[0] <= delay_1[4] + delay_2[4];
// 梳状部分数据传递
for (integer i = 1; i < 5; i = i + 1) begin
delay_2[i] <= delay_2[i - 1];
end
// 输出结果
dout <= delay_2[4];
end
end
endmodule
上述代码实现了五级CIC滤波器的基本逻辑。模块包含时钟、复位及14位输入、40位输出端口。通过两个延迟数组模拟积分与梳状结构,并在复位时清零所有寄存器。工作时先将输入扩展存入第一组延迟单元,完成积分操作后进入第二组延迟单元进行梳状处理,最终输出结果。
总结
该设计通过合理的位宽处理和级数选择,在保证硬件资源合理利用的同时,实现了高效的数字信号滤波处理,适用于FPGA中的抽取与插值应用场景。


