FPGA与MATLAB联合仿真FIR滤波器 |
您所在的位置:网站首页 › fpga做滤波器 › FPGA与MATLAB联合仿真FIR滤波器 |
FPGA与MATLAB联合仿真FIR滤波器
最近在做毕业课题,其中需要用到FIR滤波,所以在实际应用前需要对FIR进行仿真测试,具体步奏如下: 0、用matlab产生FIR滤波器所需参数,并量化为FPGA所需的指定位宽; 1、用matlab产生测试信号,并量化为指定位宽,作为FPGA的输入; 2、利用QuartusII调用FIR IP核,利用第0步产生的参数来设置FIR滤波器; 3、编写test_bench,利用modelsim对FIR进行仿真,并将滤波后数据写入到文本中; 4、将第3步中得到的滤波后数据通过matlab进行fft计算得到信号的频谱,观察滤波效果; 5、分析总结按照上面的步奏,开始干活。 0、用matlab产生FIR滤波器所需参数,并量化为FPGA所需的指定位宽;FIR滤波器针对线性相位系统,即信号经过系统后,所有频率都有一个固定的相位延迟,但是各频率成分的信号相对相位不变。而对于非线性相位系统在接受端无法通过只同步某一个频率成分的信号实现同步通带内所有信号的相位,此时可采用IIR滤波器。课题需要,信号的中心频率2.5MHz,采样率25MHz,所以按此设计一款带通滤波器FIR滤波器。 matlab为我们提供的很多窗函数,按性能好坏排序大致如下:凯撒窗>布拉克曼窗>海明窗>汉宁窗>矩形窗;除此之外,万能的matlab还提供了专用数字滤波器工具FDATOOL,这里我采用fdatool进行设计。 在matlab的命令窗口键入fdatool回车即可打开该工具,并设置好滤波器参数,具体如下图所示: 为了测试FIR滤波器,我们需要产生信号,这里通过matlab产生叠加了1W功率的高斯白噪声,量化位宽为12bit,将其写入到文本文件中,其绘制的波形如下。 FIR滤波器本质上是做卷积,即多次乘加运算,在具体实现时有多种结构,分别是:半串行、全串行、并行和分布式,还是和前面一样,具体选择哪一种进行实现,要看你的目标芯片资源大小,如果资源多,需要计算速度快,那么选择并行;如果资源一般,速度要求中等,那么选择分布式,如果资源少,速度不做要求,那么串行就可以了。 打开QuartusII,调用FIR IP核,具体如下所示: 在tb文件中例化FIR顶层(我简单的封装了一下,只显示输入输出即时钟复位信号),然后通过Verilog中读文件操作将前面matlab产生的输入信号读入,并依次给输入端口,并把输出的数据写到文本文件中,用于后面matlab验证。这里给出test_bench代码,如下。 `timescale 1ns/1ps module tb_fir; reg clk ; reg rst_n ; reg[11:0] din ; wire[29:0] dout ; parameter CLK_PERIOD = 10; fir_quartus u_fir_quartus ( .clk(clk), .rst_n(rst_n), .din(din), .dout(dout) ); initial begin clk = 0; rst_n = 0; #100 rst_n = 1; end always #CLK_PERIOD clk = ~clk;//50M //读取数据 parameter N = 4096; integer i; reg[11:0] memo_s [1:N]; reg[11:0] memo_n [1:N]; initial begin //$readmemb("Source_Bin.txt",memo_n); $readmemb("Noise_Bin.txt",memo_n); i = 0; repeat(N) begin i = i + 1; din = memo_n[i]; #CLK_PERIOD; end end integer file_out,sin_print; initial file_out = $fopen("n_out.txt"); //always@(posedge clk) // begin // // //$fdisplay(file_out,"%0d",dout);//十进制输出 // if(!file_out) // begin // $display("Could not open file!"); // $finish; // end // end reg[4:0] cnt; always @(posedge clk ,negedge rst_n) if(!rst_n) cnt |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |