【FPGA】:ip核-----CIC滤波器

本文详细介绍了如何在Vivado环境中使用IP核生成及MATLAB设计CIC滤波器,并通过Verilog代码进行仿真。内容包括CIC滤波器的端口说明、IP核生成步骤、MATLAB设计过程以及不同抽取和内插倍数下的仿真结果分析,展示了CIC滤波器在信号处理中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 概述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、 端口说明[此章节为引用]

在这里插入图片描述
在这里插入图片描述

三、 ip核的生成

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

四、 matlab中cic滤波器的设计

在这里插入图片描述

此部分来源于博客
在这里插入图片描述
在这里插入图片描述

总接:
在这里插入图片描述

四、仿真

第一组
采样率0.2MHZ,信号频率1Khz,抽取倍数5倍。
在这里插入图片描述
在这里插入图片描述
主程序:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2022/07/18 21:09:15
// Design Name: 
// Module Name: cic_ip_test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module cic_ip_test();

reg aclk;
reg [15:0] s_axis_data_tdata;
reg s_axis_data_tvalid;
wire s_axis_data_tready; 
wire [23:0] m_axis_data_tdata;
wire m_axis_data_tvalid;

parameter data_num=4000;  //仿真数据长度
reg signed [9:0] stimulus[data_num-1:0];
integer i;

/*********************时钟的产生***********************/
parameter period=10;
initial aclk =0;
always #(period/2) aclk=~aclk;
/*********************信号的初始化***********************/
initial begin
   s_axis_data_tvalid<=1'b0;
   s_axis_data_tdata <= 16'd0;
   $readmemb("E:/vivado_project/cic/cic_test/E6_4_sin_in.txt",stimulus);
   # period;
   # period;
   i=0;
end

/*********************将数据送入cic ip核***********************/
always@(negedge aclk) begin   //注意下降沿
           if(i==data_num-1  && s_axis_data_tready==1'b1) begin
                s_axis_data_tdata <= {{6{stimulus[i][9]}},stimulus[i]};
                s_axis_data_tvalid <= 1'b1;
                i<=0;
            end   
            else if(s_axis_data_tready==1'b1 && i<data_num-1) begin
                s_axis_data_tdata <= {{6{stimulus[i][9]}},stimulus[i]};
                s_axis_data_tvalid <= 1'b1;
                i <= i+1; 
            end
            else begin
                s_axis_data_tvalid <= 1'b0;
                s_axis_data_tdata <=s_axis_data_tdata;
                i <= i;
 end   

end 


/*********************cic ip的例化***********************/
cic_compiler_0 cic_compiler_inst0 (
  .aclk(aclk),                              // input wire aclk
  .s_axis_data_tdata(s_axis_data_tdata),    // input wire [15 : 0] s_axis_data_tdata
  .s_axis_data_tvalid(s_axis_data_tvalid),  // input wire s_axis_data_tvalid
  .s_axis_data_tready(s_axis_data_tready),  // output wire s_axis_data_tready
  .m_axis_data_tdata(m_axis_data_tdata),    // output wire [23 : 0] m_axis_data_tdata
  .m_axis_data_tvalid(m_axis_data_tvalid)  // output wire m_axis_data_tvalid
);

/*********************将最终的结果输出***********************/
integer w_file;
always@(posedge m_axis_data_tvalid) begin   
    w_file = $fopen("E:/vivado_project/cic/cic_test/E6_4_sin_out.txt");
	$fdisplay(w_file,"%d",$signed(m_axis_data_tdata[16:0]));   //h代表16进制 d代表十进制
end 
endmodule

仿真结果
在这里插入图片描述
在这里插入图片描述
从图中可以看出,输出与输入相比经过了5倍的抽取。

同理第二组
采样率0.2MHZ,信号频率1Khz,内插倍数5倍。
在这里插入图片描述
在这里插入图片描述
从图中可以看出,输出与输入相比经过了5倍的内插。
另外输出数据位宽和输入数据位宽估算公式为:
在这里插入图片描述
其中B为输入信号的位数,Bmax为输出信号的最大位宽。
第三组:
采样率0.2MHZ,信号频率1Khz和50khz,抽取倍数5倍。
在这里插入图片描述
可以看出50KHZ处,比最大值低了大约41dB。
在这里插入图片描述
从结果可以看出,50khz的频率成分被滤掉,并且输出采样率降低为原来的五分之一。

五、 参考资料

  1. CIC滤波器
  2. Matlab中CIC滤波器的应用
  3. CIC滤波器(公式推导)
  4. 基于FPGA的CIC滤波器设计(1)(重点看)
  5. Vivado CIC IP核滤波器详解(一)(重点中的重点)
  6. 多通道CIC抽取滤波器Vivado CIC IP核实现实现(3)
  7. FPGA数字信号处理(十九)Vivado CIC IP核实现
  8. FPGA数字信号处理(十六)单级CIC滤波器Verilog设计(仿真重点)
  9. FPGA数字信号处理(十七)多级CIC滤波器Verilog设计
    10.插值滤波器设计(抽取和插值的理论,很重要)
<think>好的,我现在要回答用户关于如何使用Vivado的CIC IP的问题。首先,我需要回忆一下CIC滤波器的基本概念,这样用户能更好地理解它的应用场景。CIC是级联积分梳状滤波器,常用于多速率信号处理,比如数字下变频和上变频。Vivado中的CIC IP应该是在FPGA设计中用来高效实现这类滤波器的。 接下来,我需要分步骤说明如何使用这个IP。首先,用户需要创建一个Vivado工程,这应该是基本步骤,但可能需要提醒用户注意选择正确的FPGA型号和工具版本。然后,在IP Catalog中找到CIC Compiler,这一步可能会有不同的路径,需要准确描述。 配置IP的部分是关键。参数如滤波器类型(插值或抽取)、差分延迟、级联级数、输入输出位宽等都需要详细说明。比如,用户需要根据应用需求选择插值还是抽取模式,设置合适的延迟和级数,这些参数会影响滤波器的性能。同时,输入数据的位宽和是否需要缩放功能也需要考虑,缩放功能可能用于防止数据溢出,这点需要解释清楚。 生成IP后,用户需要将其例化到设计中。这里可能需要提到如何通过例化模板或者使用IP Integrator来连接其他模块。测试部分也很重要,用户可能需要编写测试激励,使用仿真工具验证功能,比如在Vivado Simulator中观察输入输出波形是否正确。 最后,综合与实现阶段需要确保时序约束正确,可能涉及生成比特流并下载到FPGA进行实测。注意事项部分需要提醒用户参数的影响,比如级数增加带来的资源消耗和延迟,以及位宽扩展的问题,避免数据溢出或资源浪费。 在思考过程中,我需要确保每一步都准确无误,特别是参数配置部分,因为这些直接影响滤波器性能。另外,用户可能的疑问点,比如如何选择合适的差分延迟或级数,可能需要进一步解释,但用户问题主要是使用步骤,所以可能不需要深入理论。同时,需要检查是否有遗漏的步骤,比如IP的例化和测试方法是否清晰。最后,确保语言通俗易懂,结构清晰,符合用户的需求。</think>Xilinx Vivado中的CIC IP使用指南(分步骤说明) 一、CIC滤波器基础 CIC(Cascaded Integrator Comb)是无需乘法器的多速率滤波器,主要用于: - 数字上变频(插值) - 数字下变频(抽取) - 采样率转换 二、IP配置步骤 1. 创建Vivado工程 - 新建工程时选择目标FPGA型号 - 建议使用Vivado 2018.1或更高版本 2. 添加IP ```verilog // IP Catalog路径: // FPGA Features and Design -> Digital Signal Processing -> Filters -> CIC Compiler ``` 3. 关键参数配置 | 参数项 | 说明 | |-----------------|----------------------------------------------------------------------| | Filter Type | 选择Decimation(抽取)或Interpolation(插值) | | Number of Stages| 级联级数(通常3-5级,影响滚降特性) | | Differential Delay | 梳状延迟(通常1或2时钟周期) | | Sample Rate Change | 设置抽取/插值倍数(整数) | | Input/Output Width | 根据数据位宽设置,注意输出可能自动扩展 | 4. 接口配置 - 勾选"ACLKEN"启用时钟使能 - 建议启用"SCLR"同步复位 - 数据格式建议选择Signed(有符号数) 三、设计实例(抽取模式) 1. 典型参数: $$ R = 16 \quad (\text{抽取因子}) $$ $$ N = 4 \quad (\text{级联级数}) $$ $$ D = 1 \quad (\text{差分延迟}) $$ 2. 时序说明: - 输入数据速率:$$ f_{in} $$ - 输出数据速率:$$ f_{out} = f_{in}/R $$ - 群延迟:$$ \tau = \frac{N(2D + R - 1)}{2f_{in}} $$ 四、验证流程 1. 测试激励建议: ```verilog initial begin // 生成频率为fs/4的单频测试信号 for(int i=0; i<1024; i++) begin data_in <= $sin(2π*i/4); @(posedge clk); end end ``` 2. 仿真观测要点: - 输出数据速率是否降为1/R - 频谱分析验证带外抑制 - 检查数据溢出标志(若有) 五、硬件调试技巧 1. 使用ILA捕获信号: - 监控输入/输出数据总线 - 观察RFD(Ready for Data)信号 - 检查数据有效标志 2. 资源优化建议: - 当R较大时,启用"Multi-Channel"模式可节省资源 - 合理使用位宽截断(需做误差分析) 六、常见问题处理 1. 数据溢出: - 启用自动位宽扩展 - 增加积分器位宽 - 添加缩放模块 2. 时序违例: - 检查时钟域交叉 - 降低工作频率 - 插入流水线寄存器 建议结合Xilinx官方文档PG140进行参数优化,实际使用时应根据具体应用场景进行MATLAB模型验证后再进行硬件实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值