基于FPGA的五级CIC滤波器Verilog设计
在数字信号处理的领域中,积分梳状(CIC)滤波器凭借其结构简单、高效等特性,在诸如抽取和插值等应用场景里发挥着重要作用。本文介绍基于FPGA的五级CIC滤波器Verilog设计方案。
一、系统概述
本设计采用五级CIC滤波器。其基本结构在降采样的左右都有五个延迟单元。CIC滤波过程中,输出的位宽会大大增加。如果单独对中间处理信号截位,会导致处理精度不够,影响系统性能。因此,需要将输入信号进行扩展。
输入的中频信号通过ADC位宽为14位,下变频后截位处理输出仍为14位。考虑到中间处理可能出现的溢出情况以及保证处理精度的需要,将CIC滤波的输入位宽扩展为40位。
关于级数的选择:
- 硬件资源角度:CIC滤波器级数太高会导致最终输出数据位宽很大。经验证,当级数大于5时,输出位宽超过50位,这将导致硬件资源大量占用。
- 处理效果角度:级数太小(如1、2级)无法达到预计的处理效果。
- 结论:通过仿真分析,一般情况下选择4级或5级比较合理,本设计选择5级。
二、Verilog代码实现
以下是简单的五级CIC滤波器Verilog实现示例。模块定义了输入时钟、复位信号,14位的输入数据以及40位的输出数据。通过数组实现延迟单元,在时钟上升沿或复位信号有效时复位,正常工作时完成数据扩展、积分及梳状部分操作。
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};
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];
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
三、仿真与总结
在实际仿真中,可通过观察输出信号的频谱等特性,验证滤波器是否达到了预期的设计目标,例如是否有效地滤除了不需要的频率成分,是否在抽取过程中保证了信号的完整性。该设计通过合理的结构和位宽处理,在保证硬件资源合理利用的同时,实现了高效的数字信号滤波处理。


