名称: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