去年在做一个高速数据采集项目时,遇到了一个棘手的问题:ADC采样率高达125MHz,但后端DSP处理带宽只需要20MHz。直接处理会浪费大量计算资源,这时候CIC滤波器就成了我的救星。这种无需乘法器的滤波器结构,特别适合在FPGA上实现高倍率抽取。
CIC(Cascaded Integrator-Comb)滤波器是数字信号处理中的经典结构,由积分器和梳状滤波器级联组成。它的最大优势是纯用加减法实现降采样,非常适合需要高采样率转换的场合,比如软件无线电、医疗成像设备等。我在项目中用Verilog实现的五级CIC滤波器,最终实现了625倍的降采样率。
CIC滤波器的传输函数可以表示为:
H(z) = [ (1 - z^-RM) / (1 - z^-1) ]^N
其中R是降采样因子,M是微分延迟(通常取1或2),N是级联阶数。
用MATLAB验证频率响应时,我发现了三个关键特性:
matlab复制% 典型CIC频率响应分析代码
R = 8; M = 1; N = 5;
[h,f] = freqz(ones(1,R*M), [1 zeros(1,R*M-1) -1], 1024);
H = abs(h).^N;
积分器每级都会导致位宽增长,N级CIC的位宽增长量为:
B_growth = N * ceil(log2(RM))
在Verilog实现时,我采用饱和运算处理溢出问题。比如输入12bit数据,5级CIC在R=625时,理论需要12+5log2(625)=12+59=57bit!实际通过仿真确定32bit已足够。
重要提示:实际位宽需要根据输入信号动态范围和允许的量化误差综合确定
verilog复制// 五级积分器实现
genvar i;
generate
for(i=0; i<5; i=i+1) begin : INTEG_STAGE
always @(posedge clk) begin
if(rst) int_reg[i] <= 0;
else if(en) begin
if(i==0) int_reg[i] <= int_reg[i] + din;
else int_reg[i] <= int_reg[i] + int_reg[i-1];
end
end
end
endgenerate
每个积分器需要单独使能控制,我采用流水线结构实现250MHz时钟频率。关键点:
梳状部分在降采样后工作,需注意时序约束:
verilog复制// 梳状滤波器实现
always @(posedge clk_div) begin
if(rst) begin
comb_reg[0] <= 0;
dly_reg <= 0;
end
else if(en_div) begin
comb_reg[0] <= int_reg[4] - dly_reg;
dly_reg <= int_reg[4];
end
end
这里我采用了时钟分频策略,用clk_div = clk/R。实测发现时序余量不足时,可以:
在Simulink中搭建等效模型时,必须匹配FPGA的定点数设置:
matlab复制% 定点数参数配置
fixpt_params = fimath('RoundingMethod','Floor',...
'OverflowAction','Wrap',...
'ProductMode','KeepLSB',...
'SumMode','KeepLSB');
我发现的几个易错点:
我的验证流程分三步:
matlab复制% 结果对比分析
fpga_out = load('vivado_sim.txt');
matlab_out = cic_filter(input_seq);
err = norm(fpga_out - matlab_out(1:R:end))/length(fpga_out);
当发现误差>3dB时,需要检查:
在Xilinx UltraScale+器件上,原始设计只能跑到180MHz。通过以下优化达到250MHz:
优化前后资源对比:
| 资源类型 | 优化前 | 优化后 |
|---|---|---|
| LUT | 423 | 587 |
| FF | 620 | 892 |
| DSP | 0 | 5 |
| Fmax | 180MHz | 250MHz |
在超声成像应用中,我实现了8通道TDM方案:
关键配置参数:
verilog复制parameter CH_NUM = 8;
parameter TDATA_WIDTH = 128; // 16bit x 8ch
现象:输出频谱出现异常谐波
解决方法:
当报告建立时间违例时:
通过改变截断位置提升SNR:
在最新项目中,我将CIC与FIR补偿滤波器结合:
补偿滤波器系数生成:
matlab复制cfir = fir2(100, [0 0.4 0.5 1], [1 1 0 0].*abs(freqz(cic)));
这种混合结构在5G小基站中实测性能: