FPGA学习记录(2)<一般FIR滤波器的FPGA实现>

FIR滤波器

1、dB的含义

dB(分贝是一个表征相对值大小的单位),两种功率之比或者电压/电流/声量之比。
功率之比 d B = 10 l g X dB =10lgX dB=10lgX。由于 10 l g 0.5 = − 3 10lg0.5=-3 10lg0.5=3,因此半功率点是-3dB,相当于功率下降为原来的1/2。
电压/电流/声量之比 d B = 20 l g X dB =20lgX dB=20lgX。原来在-3dB下变化为原来赋值增益的 2 / 2 \sqrt{2}/2 2 /2,也就是即 20 l g 2 / 2 = − 3 20lg\sqrt{2}/2=-3 20lg2 /2=3.

2、滤波器的类型

类型作用
高通滤波器衰减或消除指定频率以下的频率
低通滤波器衰减或消除指定频率以上的频率
带通滤波器允许指定频率范围内的信号通过
带阻滤波器去除指定范围内的信号频率

3、各种滤波器的特点(FIR、IIR)

1、IIR使用滤波器的输出作为输入;而FIR不使用。
2、相对于FIR滤波器,IIR能使用相对较低的阶数和项数。
3、FIR与IIR相比,IIR的计算速度更快,但同样具有稳定问题以及非线性相位的问题。因此,IIR多用于实时的滤波器应用。
4、FIR在不同频率下的延迟一致;IIR在不同频率的延迟不同。

4、实现FIR滤波器

①仿真实现正弦激励的输入(200KHz以及15MHz正弦波)

使用matlab仿真实现正弦激励的输入(200KHz以及15MHz正弦波),采样后激励波形的值,记录在txt文档中,供testbench文件进行读取。matlab代码如下所示:

%将一个频率大小为200k以及15M的波形进行合成,模拟得出采样后的波形大小,间隔采
%后输入testbench测试文件,当作激励输入。

f1=200e3; %设置第一个波的频率为200KHz
f2=15e6;  %设置第二个波的频率为15MHz

Fs=50e6; %设置采样频率
L=1000; %数据长度大小为1000,采样点数
N=8; %数据位宽(决定每一个数据采集的精度)


t=0:1/Fs:(L-1)*(1/Fs);%设置采样间隔;采样频率越高,采样的间隔越短

y1= fix(63*(cos(2*pi*f1*t) + cos(2*pi*f2*t)));
%量化合成两种频率的波形(200KHz以及15MHz)

plot(t,y1);
title('输入信号');
xlabel('时间');
ylabel('幅度');
fid=fopen('C:\路径\sin_data.txt','w'); %数据写入

for k=1:length(y1)%二进制变换
B_s=dec2bin(y1(k)+((y1(k))<0)*2^N,N);
for j=1:N
if B_s(j)=='1'
tb=1;
else
tb=0;
end
fprintf(fid,'%d',tb);
end
fprintf(fid,'\r\n');
end
fprintf(fid,';');
fclose(fid);
②仿真FIR滤波器

参考文档: FIR滤波器的FPGA实现.
可以使用文中两种方式实现FIR滤波器,分别是直接实现,以及使用量化后的实现方式。下面放出自己使用matlab仿真后的效果图。(7阶的滤波器的8位量化的系数:4、28、46、61、61、46、28、4。)

滤波前的时域和频域:
Alt
滤波后的时域和频域:
Alt

③Vivado配置

Tips1:配置Vivado与vscode的联调环境,使用vscode作为Vivado的编辑器。
选择setting,选择文本编辑器为Custom Editor,并点击选中vscode安装目录下的Code.exe文件。
在这里插入图片描述
Alt
将路径输入Editor中:E:/路径/Code.exe [file name] -[line number],如下图所示。
在这里插入图片描述
配置完成后就可以自动使用vscode打开Vivado中的.v文件、仿真文件等,配置vscode中的相关代码补齐、高亮插件,编辑十分好用。

Tips2:使用vscode中的Testbench插件,直接生成仿真文件框架
安装testbench插件,使用ctrl+shift+p可以唤出。
在这里插入图片描述
运行Testbench后,可以直接在终端生成Testbench代码框架。对Testbench的使用十分方便。(如果遇到不能运行的情况,可以退出Vscode,并且在外面使用vscode打开.v文件,不适用Vivado的内部链接打开)
在这里插入图片描述

④Vivado配置FIR滤波器

具体代码可以参考参考文档: FIR滤波器的FPGA实现.
下面就不放出具体代码文本,本文参考直接实现的方式。将量化后的波形数据量,逐一输入至滤波器中,根据这个7阶的滤波器得其8位量化的系数:4 28 46 61 61 46 28 4。与系数相乘后,求和(相当于一次卷积操作)。得到滤波之后的结果。
在这里插入图片描述
在这里插入图片描述

⑤Vivado的Testbench文件
`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2021/09/25 13:36:51
// Design Name: 
// Module Name: tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


`timescale  1ns / 1ps

module tb_lpf_direct;

// lpf_direct Parameters
parameter PERIOD  = 20;


// lpf_direct Inputs
reg   clk                                 ;//时钟
reg   reset                               ;//复位信号
reg   [7:0]  x_in                         ;//输入信号

// lpf_direct Outputs
wire  [24:0]  y_out;    				    //输出信号

integer i;

initial begin 
	clk = 0 ;
	reset = 0 ;
	x_in = 0 ;
	i = 0;
end

initial begin
    forever #(PERIOD/2)  clk=~clk; //产生时钟
end

initial begin
    #(PERIOD*2) reset  =  1; //复位信号
end

parameter data_num = 32'd10000;
reg [7:0]  data_men[data_num:1];//采用的是8位的数字,并且数据的长度为10000

initial begin
    $readmemb("C:/路径/sin_data.txt",data_men);  //每一个数据的读取
end

always @(posedge clk) begin	//每一个时钟周期输入一个采样数据,放入x_in中
    x_in <= data_men[i];
    i <= i+1;
end

lpf_direct  u_lpf_direct (
    .clk                     ( clk           ),
    .reset                   ( reset         ),
    .x_in                    ( x_in   [7:0]  ),
    .y_out                   ( y_out  [24:0] )
);

endmodule
⑥Vivado运行仿真文件

1、选择波形为模拟波形显示,选择类型为有符号类型数据。
在这里插入图片描述
在这里插入图片描述
2、进行滤波仿真,x_in为输入的滤波波形数据,y_out为输出的滤波波形数据。
FIR仿真后的结果,低通滤波器将高频信号滤除,保留低频信号。
在这里插入图片描述

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值