基于FPGA的五级CIC滤波器Verilog设计与实现
在数字信号处理领域,积分梳状(CIC)滤波器因其无需乘法器、结构规整且资源占用低的特点,广泛应用于抽取和插值场景。本文将分享一个基于 FPGA 的五级 CIC 滤波器的 Verilog 设计思路与关键实现细节。
系统架构设计
本设计采用五级 CIC 滤波器结构。其基本架构包含积分器和梳状两部分,在降采样前后各设有五个延迟单元。CIC 滤波过程中,随着级数增加,输出位宽会显著增长。若直接对中间信号截位,会导致精度损失并影响系统性能。因此,输入信号的位宽扩展是设计的关键环节。
位宽扩展策略
输入的中频信号经 ADC 采样后为 14 位,下变频处理后仍保持 14 位。考虑到内部运算可能出现的溢出风险及精度需求,我们将 CIC 滤波器的输入位宽扩展至 40 位。这种处理方式既保证了中间计算过程的精度,又有效避免了数据溢出。
级数选择依据
关于为何选择 5 级而非其他级数,主要基于硬件资源与处理效果的平衡:
- 级数过高:当级数大于 5 时,输出位宽将超过 50 位,导致寄存器资源大量占用,增加布线难度。
- 级数过低:如 1 级或 2 级,滤波效果微弱,难以达到预期的抗混叠或平滑目的。
- 仿真验证:综合对比后,4 级至 5 级在资源消耗与性能表现上最为合理,故本设计选定 5 级。
核心逻辑与代码实现
以下是五级 CIC 滤波器的 Verilog 实现框架。模块定义了时钟、复位、14 位输入及 40 位输出端口。通过数组模拟延迟单元,完成数据的移位与累加操作。
module cic_filter (
input wire clk, // 系统时钟
input wire rst_n, // 低电平复位
input wire [13:0] din, // 14 位输入数据
output reg [39:0] dout // 40 位输出数据
);
// 定义延迟单元数组,用于存储各级数据
reg [39:0] delay_1 [0:4]; // 积分部分延迟
reg [39:0] delay_2 [0:4]; // 梳状部分延迟
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
// 复位时清零所有延迟单元及输出
integer i;
for (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};
// 数据在延迟单元中传递
integer i;
for (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 (i = 1; i < 5; i = i + 1) begin
delay_2[i] <= delay_2[i - 1];
end
// 输出结果
dout <= delay_2[4];
end
end
endmodule
代码说明:
- 复位逻辑:使用
integer类型进行循环计数,确保在综合工具中的兼容性。复位时所有寄存器清零。 - 位宽扩展:输入数据
din为有符号数,需进行符号位扩展({{26{din[13]}}, din}),防止高位丢失。 - 流水线结构:代码采用了简单的串行描述,实际工程中建议根据时序要求优化为并行或流水线结构以提升频率。
仿真与验证
在实际应用中,需通过仿真观察输出信号的频谱特性,验证滤波器是否有效滤除了不需要的频率成分,并在抽取过程中保持信号完整性。虽然无法在此展示具体波形,但设计时应重点关注输出位宽变化及是否存在饱和现象。


