verilog 浮点转定点_(学习Verilog)6. FIR IP核的基础功能使用总结

459cfd52959e353c743f254100383a07.png

滤波器是信号处理技术绕不过的内容,而在BSPK的实现框图(见 BPSK的Simulink仿真实现)中,也需要用到滤波器。

m序列的时域波形是一个矩形,矩形在频谱上是所有奇次谐波之和,为了节省带宽资源,这里需要使用FIR滤去谐波,留下基波。

本文会讲到Vivado 中FIR IP核的使用方法,会涉及到MATLAB的部分内容。


因为我们不使用太高级的功能,只使用最基础的功能,滤波。所以,最关键的内容就是coe系数文件的生成,可以使用MATLAB帮助我们生成这个文件。

在MATLAB的命令窗口,输入fdatool(新版MATLAB为filterDesigner)回车,

0ec57ec05c1b0412470e54aa339d4fad.png
滤波器设置界面

这里选择低通FIR,窗函数选常用的几个,这里选择了汉明窗;滤波器阶数选择72,阶数越高滤波效果越好,但资源占用越多;FS/FC(采样率/截止频率)为50:3,点击Design Filter会显示相应的频率响应图,由于FIR滤波器抽头的特性,当输入的采样率为50M时,滤波器的截止频率为3M,两者之间保持比例关系。

a28cf081fa0857c090d58a44534ad367.png
滤波器数值表示

点击如上图红框内的图标,将Filter arithmetic修改为Fixed-point,将滤波器的参数数值表示修改为定点数表示,方便FPGA处理,也只有这样能生成coe文件。(学习Verilog)3. FPGA有符号数,定点小数表示及计算机数值表示规则

9aa4b3cfac834ad2fb726cf14c6fcd39.png
滤波器生成coe文件

点击上图菜单栏的Target,然后生成coe文件。

在Vivado中IP Catalog中找到FIR IP核,

6640544aacfb029bf36b999719c2ca51.png
FIR IP核界面

在Filter Coefficient里面选择使用COE FILE,文件选择刚才生成的COE文件。

d68be34c8c0ba65cd98bc33140b457cf.png
FIR IP核界面

在Channel Specification,设置输入的采样率为50M。

df8efb7754af52cc1ce6915164a9057a.png
FIR IP核界面

Implementation里面,滤波器系数类型选择有符号型,输入数据也是有符号型,输入数据位宽选择2位,小数部分位数为0,GUI显示出输入数据位宽21位,这些数值后面有用。

一路默认,FIR IP核生成后,可以看到相关的端口定义。

fir_compiler_0 your_instance_name (
  .aclk(aclk),                              // input wire aclk
  .s_axis_data_tvalid(s_axis_data_tvalid),  // input wire s_axis_data_tvalid
  .s_axis_data_tready(s_axis_data_tready),  // output wire s_axis_data_tready
  .s_axis_data_tdata(s_axis_data_tdata),    // input wire [7 : 0] s_axis_data_tdata
  .m_axis_data_tvalid(m_axis_data_tvalid),  // output wire m_axis_data_tvalid
  .m_axis_data_tdata(m_axis_data_tdata)    // output wire [23 : 0] m_axis_data_tdata
);

可以看到,输入数据位宽为8位,而我们在FIR GUI界面设置的是2位,为了不影响最终的输入数据,需要对输入数据进行符号位扩展。具体操作原理见(学习Verilog)3. FPGA有符号数,定点小数表示及计算机数值表示规则

而输出数据位宽有24位,但是FIR GUI界面显示输出数据位宽为21位,这说明FIR的输出数据也进行了符号位扩展,这里可以截取符号位,具体操作原理见(学习Verilog)5. FPGA定点数截位基本准则

相关的符号位扩展和截取符号位可以见下代码块。

fir_compiler_0 fir_inst (
  .aclk(clk_50m),                              // input wire aclk
  .s_axis_data_tvalid(1'b1),  // input wire s_axis_data_tvalid
  .s_axis_data_tready(),  // output wire s_axis_data_tready
  .s_axis_data_tdata({{6{code_c[1]}},code_c}),    // input wire [7 : 0] s_axis_data_tdata
  .m_axis_data_tvalid(),  // output wire m_axis_data_tvalid
  .m_axis_data_tdata(fir_out)    // output wire [23 : 0] m_axis_data_tdata   19-8
);

xbip_dsp48_macro_0 dsp_product_inst (
  .CLK(clk_50m),  // input wire CLK
  .A(fir_out[19:8]),      // input wire [11 : 0] A
  .B(cos_o[13:2]),      // input wire [11 : 0] B
  .P(duc_data)      // output wire [23 : 0] P
);

最后的滤波效果如图:

7817d0d71f3f0c797534e2a2f5cb24d8.png
滤波效果图

滤波效果可以继续调节,这里可以看到图里的滤波效果确实达到了,但可能效果不是那么好,实际的滤波参数需要仿真后看效果才可以确定。

FIR滤波相对于IIR滤波而言,没有极点或者说极点与零点抵消了,更加稳定。但如果有时候我们想用IIR滤波器怎么办呢,后续会谈到如何实现IIR滤波器。

欢迎关注BUG记录公众号

191fdfb5ff9c910cb9d6cee34eab8400.png
微信号:bugrec

万物皆可卷积:(学习Verilog)5. FPGA定点数截位基本准则​zhuanlan.zhihu.com
cfaca973f98489e94b58c9e97708b947.png
万物皆可卷积:(学习Verilog)4. FPGA浮点数表示及计算机数值表示规则​zhuanlan.zhihu.com
9ae4690a8c9a7d55bd558a9716235213.png
万物皆可卷积:(学习Verilog)4. FPGA浮点数表示及计算机数值表示规则​zhuanlan.zhihu.com
9ae4690a8c9a7d55bd558a9716235213.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值