常用网站有哪些合肥网站优化seo
基于FPGA的FIR低通滤波器实现(附工程源码)
文章目录
- 基于FPGA的FIR低通滤波器实现(附工程源码)
 - 前言
 - 一、matlab设计FIR滤波器,生成正弦波
 - 1.设计FIR滤波器
 - 1.生成正弦波.coe
 
- 二、vivado
 - 1.fir滤波器IP核
 - 2.正弦波生成IP核
 - 3.时钟IP核设置
 - 4.顶层文件/测试文件代码
 
- 三.simulation
 - 四.源代码
 
前言
本文为FPGA实现FIR滤波器仿真过程,附源代码。
提示:以下是本篇文章正文内容,下面案例可供参考
一、matlab设计FIR滤波器,生成正弦波
1.设计FIR滤波器
打开MATLAB在命令行窗口输入:
 fadtool
 回车后在滤波器设计界面设置滤波器参数如下
 
 之后点击如图标志,设置定点,在菜单栏"目标(R)"出选择生成对应滤波器系数.COE文件
 
1.生成正弦波.coe
matlab代码如下
width=8;    %rom的位宽
depth=1024; %rom的深度
x=linspace(0,2*pi,depth);   %在一个周期内产生1024个采样点
y_sin=sin(x);    %生成余弦数据
y_sin=round(y_sin*(2^(width-1)-1))+2^(width-1)-1;   %将余弦数据全部转换为整数fid=fopen('C:\Users\lys\Desktop\fir\sin.coe','w');   %创建.coe文件
fprintf(fid,'%d,\n',y_sin);   %向.coe文件中写入数据
fclose(fid);   %关闭.coe文件
 
二、vivado
1.fir滤波器IP核
设置参数如下:
 
 
 
2.正弦波生成IP核
参数设置如下:
 
 
 
3.时钟IP核设置
参数设置如下:
 
 
4.顶层文件/测试文件代码
`timescale 1ns / 1psmodule fir_top(input clk,input rst_n,input [1:0]rom_sel,output [7:0]douta,output [7:0]fir_out_data);wire clk_10m;wire clk_1;wire clk_2;wire clk_3;//    clk_wiz_0 instance_name(
//        .clk_out1(clk_1),     // output clk_out1
//        .clk_out2(clk_2),
//        .clk_out3(clk_3),
//        .clk_out4(clk_10m),
//        .reset(rst_n), // input resetn
//        .locked(),       // output locked
//        .clk_in1(clk)
//    );      // input clk_in1clk_wiz_0 instance_name(// Clock out ports.clk_out1(clk_1),     // output clk_out1.clk_out2(clk_2),     // output clk_out2.clk_out3(clk_3),     // output clk_out3.clk_out4(clk_10m),     // output clk_out4// Status and control signals.resetn(rst_n), // input reset.locked(),       // output locked// Clock in ports.clk_in1(clk));      // input clk_in1wire clk_rom;assign clk_rom = (rom_sel == 0)?clk_1:((rom_sel == 1)?clk_2:clk_3);reg [9:0]addra;always@(posedge clk_rom or negedge rst_n)beginif(!rst_n)addra <= 'd0;elseaddra <= addra + 1'b1;endrom_fir rom_inst (.clka(clk_rom),    // input wire clka.ena(1'b1),      // input wire ena.addra(addra),  // input wire [9 : 0] addra.douta(douta)  // output wire [7 : 0] douta);wire [7:0]fir_in_data;assign fir_in_data = douta - 'd128;fir fir_inst (.aclk(clk),                              // input wire aclk.s_axis_data_tvalid(clk_10m),  // input wire s_axis_data_tvalid.s_axis_data_tready(),  // output wire s_axis_data_tready.s_axis_data_tdata(fir_in_data),    // input wire [7 : 0] s_axis_data_tdata.m_axis_data_tvalid(),  // output wire m_axis_data_tvalid.m_axis_data_tdata(fir_out_data)    // output wire [7 : 0] m_axis_data_tdata);endmodule 
`timescale 1ns / 1psmodule fir_top_tb;reg clk;reg rst_n;reg [1:0]rom_sel;wire [7:0]douta;wire [7:0]fir_out_data;fir_top fir_top_inst(.clk    (clk),.rst_n  (rst_n),.rom_sel(rom_sel),.douta  (douta),.fir_out_data(fir_out_data));initial clk = 0;always#10 clk = ~clk;initial beginrst_n = 0;rom_sel = 0;#200;rst_n = 1'b1;#200000;rom_sel = 1;#200000;rom_sel = 2;#200000;$stop;endendmodule 
三.simulation
只为测试功能,未考虑滤波器性能,所以效果不佳,结果实现如下
 
四.源代码
https://download.csdn.net/download/qq_42761380/88243346
