名称:CIC和FIR滤波器设计Verilog代码VIVADO仿真
软件:VIVADO
语言:Verilog
代码功能:
CIC和FIR滤波器设计
数据从端口进入后,使用150MHz的时钟再打一拍(采样一次),然后经过第一个CIC滤波器,将速率降为10MHz,然后再经过一级CIC滤波器,将速率降为2MHz,最后再经过一个FIR滤波器,将速率降为1MHz。FIR滤波器截止频率设置为25KHz。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
设计文档
数据从端口进入后,使用150MHz的时钟再打一拍(采样一次),然后经过第一个CIC滤波器,将速率降为10MHz,然后再经过一级CIC滤波器,将速率降为2MHz,最后再经过一个FIR滤波器,将速率降为1MHz。FIR滤波器截止频率设置为25KHz。
1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. Testbench
Testbench首先使用readmemh函数去读取事先准备好的原始数据txt,然后进入到程序输入端口,降采样和滤波后输出结果也保存为一个txt文件,便于后续matlab分析。


6. 仿真图


下图可看出采样率降为1MHz


7. FIR滤波器系数设计
FIR滤波器系数设计
1. 打开matlab

2. 输入fdatool回车,打开滤波器设计工具fdatool

3. 设置如下


导出coe文件即可
部分代码展示:
`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2020/09/13 19:38:12 // Design Name: // Module Name: fir_cic_filter // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// //1.实现150M采样速率到1兆采样速率的抽取 //2.注意原始信号的采样速率必须是150MHz, //3.MATLAB生成一个0~20kHz的信号,40kHz~50kHz的干扰,采样速率150MHz。将数据导入到vivado中做为原始仿真的输入数据,写清MATLAB部分和fpga部分的实现 //细节 //4.写清楚cic滤波器和fir滤波器ip核的具体设计参数 //5.vivado中仿真 //6.文档说明,视频录制啥的和上次的一样。 module fir_cic_filter( input clk_in,//150MHz input rst_p,//高电平复位 input [15:0] data_in,//输入数据 output [47:0] data_out,//1M信号输出 output data_out_en ); //信号采样 reg [15:0] data_sample=16'd0; always@(posedge clk_in or posedge rst_p) if(rst_p) data_sample<=16'd0; else data_sample<=data_in;//150M采样 //CIC抽取15倍 wire cic_data_tready; wire [23 : 0] cic_tdata; wire cic_tvalid; cic_compiler_0 i1_cic_compiler_0 ( .aclk(clk_in), // input wire aclk .s_axis_data_tdata(data_sample), // input wire [15 : 0] s_axis_data_tdata .s_axis_data_tvalid(1'b1), // input wire s_axis_data_tvalid .s_axis_data_tready(cic_data_tready), // output wire s_axis_data_tready .m_axis_data_tdata(cic_tdata), // output wire [23 : 0] m_axis_data_tdata .m_axis_data_tvalid(cic_tvalid) // output wire m_axis_data_tvalid ); //CIC抽取5倍 wire cic_D5_tready; wire [23 : 0] cic_D5_tdata; wire cic_D5_tvalid; cic_D5 i_cic_D5 ( .aclk(clk_in), // input wire aclk .s_axis_data_tdata(cic_tdata), // input wire [23 : 0] s_axis_data_tdata .s_axis_data_tvalid(cic_tvalid), // input wire s_axis_data_tvalid .s_axis_data_tready(cic_D5_tready), // output wire s_axis_data_tready .m_axis_data_tdata(cic_D5_tdata), // output wire [23 : 0] m_axis_data_tdata .m_axis_data_tvalid(cic_D5_tvalid) // output
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=879
706