【JokerのKintex7325】FIR。

软件环境:vivado 2017.4        硬件平台:XC7K325


这篇主要说下如何利用matlab中的fdatool设计滤波器与vivado中FIR(有限脉冲响应滤波器)核的实现。打开matlab以后,命令行输入fdatool,可以打开滤波器设计工具,如下。

这里使用两种FIR滤波器参数,分别是加汉明窗、截止频率 10 MHz、64阶的低通FIR滤波器。为了方便实验,采样频率使用100 MHz,与板子时钟保持一致。

由于参数需适配到FPGA中,所以 点击上图红框按钮,将生成的滤波器系数设置为定点16位宽。

设置好后,依次点击左下角红框处可回到design界面,点击下方中间红框按钮,生成当前设置参数的滤波器,点击上方Target--->xilinx coefficient file将滤波器系数生成为fpga可用的.coe文件保存至本地。

另外,为了便于验证效果,可以将滤波器提前在matlab中验证,点击file--->export。

设置好后,点击左下方export保存到本地。

另一个参数设置同理, 加汉明窗、截止频率 40 MHz、64阶的高通FIR滤波器。记得参数类型一样设置定点16位宽以后,点击下方design filter,最后再保存。不点design filter都是白搭哦。

与前面低通一样,通过target--->xilinx coefficient file保存一个FPGA用的coe系数文件,再通过file--->export保存一个matlab仿真用的mat文件。coe文件打开以后,就是如下格式啦。


两组滤波器系数基本就生成完毕啦,接下来用生成的四个文件中的两个.mat在matlab里做下仿真。设计使用24 MHz和26 MHz正弦信号混频,然后分别过低通和高通滤波器,这样分别就只留下了2 MHz和50 MHz信号了,代码如下。

clc;
clear all;
load low_pass.mat;  %加载低通系数文件
load high_pass.mat; %加载高通系数文件
a = low_pass;
c = high_pass;
b = 1;

fs = 100000000;     %采样频率 100 MHz
f1 = 26000000;      %源1 26 MHz 
f2 = 24000000;      %源2 24 MHz

t=0:1/fs:1;
x1=sin(2*pi*f1*t);
x2=sin(2*pi*f2*t);

for i=1:200
    y(i)=x1(i)*x2(i);    
end

y1=filter(a,b,y);
y2=filter(c,b,y);

figure(1);
subplot(311);
plot(y);
subplot(312);
plot(y1);
subplot(313);
plot(y2);

仿真结果如下。


有了理论结果以后,接下来开vivado,建对应工程。

 源1和源2由DDS核产生,过乘法器混频以后输入FIR核,通过ILA观察输出结果,这里可以看到,还有一个VIO接入进了FIR核模块,用于切换滤波器系数用的,当系统中需要配置多组滤波器系数时(当然,同一时间只能使用一组),就可以使用此方法随时进行系数切换啦。DDS模块配置如下。

另一个DDS模块做类似配置,接下来是乘法器,输入位宽选择8。

 由于需要通过VIO切换高通和低通滤波器系数,所以在这里高通和低通滤波器系数COE文件就不能拿来直接使用了,需要将两个文件合并一下,合并方法是随便打开两个文件中的一个,将末尾的分号换成逗号,再把另一个文件参数名后面的所有内容,复制黏贴到前一个文件修改过的逗号后面。

做好合并的系数文件以后,打开FIR核配置项。

 

其余选项全部默认就好, 然后生成顶层文件,切记两个valid要置1,不然看不到输出的。

module design_1_wrapper
   (
    aclk_0
    );
  input aclk_0;

  wire M_AXIS_DATA_0_tvalid;
  wire aclk_0;
  wire [31:0]m_axis_data_tdata_0;
  wire s_axis_config_tvalid_0;
  wire s_axis_data_tvalid_0;

  design_1 design_1_i
       (.M_AXIS_DATA_0_tvalid(M_AXIS_DATA_0_tvalid),
        .aclk_0(aclk_0),
        .m_axis_data_tdata_0(m_axis_data_tdata_0),
        .s_axis_config_tvalid_0(1'b1),
        .s_axis_data_tvalid_0(1'b1));
endmodule

编译运行以后,可以看到混频后的原始输入和FIR配置通道为0时的低通滤波2 MHz的输出。

通过使用VIO,从0切到1。 

可以看到,输出变为高通滤波50 MHz的输出。

展开一点看。

 就,基本跟仿真结果还是对得上的。

其实FIR核还有更牛逼的在线配置系数的功能,但目前还没掌握,就先在这留个坑吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值