基于FPGA的五级积分梳状CIC滤波器Verilog设计
1. 系统概述
本文介绍基于FPGA的五级积分梳状(CIC)滤波器设计。CIC滤波器在数字信号处理中常用于抽取和插值,具有结构简单、无需乘法器等优点。
1.1 结构说明
五级CIC滤波器的基本结构在降采样前后各包含五个延迟单元。CIC滤波过程中,输出位宽会显著增加。若直接对中间信号截位,会导致精度下降并影响系统性能。因此,设计中首先将输入信号进行位宽扩展。
1.2 位宽与级数选择
输入的中频信号经ADC量化后为14位,下变频及截位处理后仍保持14位。为保证中间处理精度并防止溢出,将CIC滤波的输入位宽扩展至40位。
关于滤波器级数的选择:
- 硬件资源:级数过高会导致输出位宽过大(如大于5级时输出位宽超过50位),占用大量硬件资源。
- 滤波效果:级数过低(如1-2级)无法达到预期的滤波效果。
- 结论:通过仿真分析,4级或5级较为合理,本设计选用5级CIC滤波器。
2. Verilog代码实现
以下是核心模块的Verilog实现示例,定义了时钟、复位、输入输出及内部延迟单元逻辑。
module cic_filter (
input wire clk, // 时钟信号
input wire rst, // 复位信号
input wire [13:0] din, // 14位输入数据
output reg [39:0] dout // 40位输出数据
);
reg [39:0] delay_1 [0:4]; // 延迟单元组1
reg [39:0] delay_2 [0:4]; // 延迟单元组2
always @(posedge clk or posedge rst) begin
if (rst) begin
for (int 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};
// 数据在延迟单元1中传递
for (int 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];
// 数据在延迟单元2中传递(模拟梳状部分)
for (int i = 1; i < 5; i = i + 1) begin
delay_2[i] <= delay_2[i - 1];
end
dout <= delay_2[4];
end
end
endmodule
该模块实现了输入数据的符号扩展、延迟链传递以及积分与梳状结构的简化逻辑。在实际应用中,需根据具体抽取率调整参数以确保频谱特性满足要求。


