ISE的FIR IP核实现
IP核参数设置
滤波器系数产生
和Quartus不一样,Vivado的FIR Compiler没有提供设计FIR滤波器和生成滤波器系数的功能,因此需要使用MATLAB等其它工具设计好滤波器再将系数导入到IP核中。有两种方法:
1、MATLAB的FDATOOL工具在设计好滤波器后,可以直接生成IP核需要的coe文件:
matlab的命令行输入filterDesigner打开滤波器设计工具,设计合适的滤波器后记得选fix point,然后导出coe文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dpLfJali-1610718093604)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4829af6e-c02f-4b28-88dc-14a094240928/Untitled.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tE43nRMd-1610718093621)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c0a197ac-4fc9-43b4-abbc-d10951cab033/Untitled.png)]
2、在已经写好的matlab代码中提取系数,然后写函数生成合适格式的coe文件:
这是很见到的fir滤波器,
Lb=fir1(101,2.5e6*2/1e9); %低通滤波窗口
附上保存系数并生成coe文件的代码,
function fir_save(filename,data,gain,number)
%FIR_SAVE 此处显示有关此函数的摘要
% 输入滤波器系数
% 输出数据到coe文件
global path;if nargin < 4number = 1;
end
temp = fix(data*gain);
fid = fopen([path,filename,num2str(number),'.coe'],'w');
fprintf(fid, 'radix = 10;\n');
fprintf(fid, 'coefdata = \n');
fprintf(fid, '%d,',temp); end
IP核系数输入
IP核支持两种FIR系数输入方式,以“Vector”的形式直接写入;或者以“COE File”的形式导入coe文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b9lKYlFy-1610718093625)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e58699e7-c3c4-4ad2-9b8c-68c8f08971a4/Untitled.png)]
滤波器硬件过采样设置
- 特别需要注意的是采样设置和时钟周期,采样频率应该和信号相联系,时钟周期和系统时钟周期一致。
- 也要注意工程选用的设备可用dsp slice数量,滤波器的阶数,过采样设置均会影响数量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5TSv9zVS-1610718093632)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/3d516f15-8011-41b9-9366-9e2c25ca53b8/Untitled.png)]
IP核接口说明
Vivado的很多IP核采用的是AXI4接口,主要有数据(tdata)、准备好(tready)、有效(tvalid)几种信号,还有主机(m)和从机(s)之分。另外在Interface这个Tab还可以配置使用更多辅助的AXI4接口信号。
在设置为多通道、可变系数模式时,还会用到其它的接口。上表中的接口已经足够完成一次单通道、固定系数的FIR滤波器设计。其它接口在后文的设计中使用到FIR滤波器的其它模式时,再做介绍。
FPGA设计
IP核的接口在Verilog HDL中进行设计时,一定要参考官方文档中给出的时序图。在IP核的配置界面点击“documentation”,可以找到IP核的user guide。 也可以在Xilinx官网或DocNav工具中搜索pg149,查阅FIR Compiler的说明。
接口输入
AXI4接口的tdata位宽是以字节为单位,即只会是8的倍数,因此需要结合设计的实际位宽做相应处理。
直接将信号赋值到实例化接口,
wire signed [12:0] bpf1_abs, bpf2_abs;lpfir lpfir_inst1 (.aclk(clk), // input aclk.s_axis_data_tvalid(1'b1), // input s_axis_data_tvalid.s_axis_data_tready(), // output s_axis_data_tready.s_axis_data_tdata(bpf1_abs), // input [15 : 0] s_axis_data_tdata.m_axis_data_tvalid(), // output m_axis_data_tvalid.m_axis_data_tdata(lpf1_data) // output [23 : 0] m_axis_data_tdata
);
也可以严谨的规定一下线宽对应,少的用补码,
input signed [12:0]din, //信号输入fir1 bpf_fir1_inst (.aclk(clk), // input aclk.s_axis_data_tvalid(1'b1), // input s_axis_data_tvalid.s_axis_data_tready(), // output s_axis_data_tready.s_axis_data_tdata({{3{din[12]}},din}), // input [15 : 0] s_axis_data_tdata.m_axis_data_tvalid(), // output m_axis_data_tvalid.m_axis_data_tdata(bpfir1_data) // output [23 : 0] m_axis_data_tdata
);
代码示例
单通道、固定系数的FIR Compiler接口,用于接收机设计实例,示例代码如下所示:
`timescale 1ns / 1ps
module top(input clk, //32MHz系统时钟input rst,input signed [12:0]din, //信号输入output [12:0] realout //FSK解调数据输出);//wire [15:0]din;wire signed [12:0] bpfir1_data, bpfir2_data;
wire signed [12:0] bpf1_abs, bpf2_abs;
wire signed [12:0] lpf1_data, lpf2_data;
wire [15:0] dout;
wire signed [15:0] m_tdata;fir1 bpf_fir1_inst (.aclk(clk), // input aclk.s_axis_data_tvalid(1'b1), // input s_axis_data_tvalid.s_axis_data_tready(), // output s_axis_data_tready.s_axis_data_tdata({{3{din[12]}},din}), // input [15 : 0] s_axis_data_tdata.m_axis_data_tvalid(), // output m_axis_data_tvalid.m_axis_data_tdata(bpfir1_data) // output [23 : 0] m_axis_data_tdata
);fir2 bpf_fir2_inst (.aclk(clk), // input aclk.s_axis_data_tvalid(1'b1), // input s_axis_data_tvalid.s_axis_data_tready(), // output s_axis_data_tready.s_axis_data_tdata({{3{din[12]}},din}), // input [15 : 0] s_axis_data_tdata.m_axis_data_tvalid(), // output m_axis_data_tvalid.m_axis_data_tdata(bpfir2_data) // output [23 : 0] m_axis_data_tdata
);Rectify Rectify_inst (.clk(clk), .rst(rst), .bpf1(bpfir1_data), .bpf2(bpfir2_data), .bpf1_abs(bpf1_abs), .bpf2_abs(bpf2_abs));lpfir lpfir_inst1 (.aclk(clk), // input aclk.s_axis_data_tvalid(1'b1), // input s_axis_data_tvalid.s_axis_data_tready(), // output s_axis_data_tready.s_axis_data_tdata(bpf1_abs), // input [15 : 0] s_axis_data_tdata.m_axis_data_tvalid(), // output m_axis_data_tvalid.m_axis_data_tdata(lpf1_data) // output [23 : 0] m_axis_data_tdata
);lpfir lpfir_inst2 (.aclk(clk), // input aclk.s_axis_data_tvalid(1'b1), // input s_axis_data_tvalid.s_axis_data_tready(), // output s_axis_data_tready.s_axis_data_tdata(bpf2_abs), // input [15 : 0] s_axis_data_tdata.m_axis_data_tvalid(), // output m_axis_data_tvalid.m_axis_data_tdata(lpf2_data) // output [23 : 0] m_axis_data_tdata
);endmodule
备注:
- 程序中认为输入的采样数据始终有效,因此将s_axis_data_tvalid永远置1;
- 由于s_axis_data_tdata为16bit位宽,但输入信号数据为13bit位宽,因此用拼接运算符{}在高位填充补码的符号位;
- 由于m_axis_data_tdata为32bit位宽,但输出信号数据有效位仅有13bit位宽,因此仅需取低13bit作为FIR滤波器输出。
ISE的FIR IP核实现相关推荐
- 基于vivado的fir ip核的重采样设计与实现
创建vivado工程 1. 首先打开vivado,创建一个新的project(勾选create project subdirectory选项),并将工程命填为firfilter. 2.选择工程创建的类 ...
- verilog实现汉明权重_(学习Verilog)6. FIR IP核的基础功能使用总结
滤波器是信号处理技术绕不过的内容,而在BSPK的实现框图(见 BPSK的Simulink仿真实现)中,也需要用到滤波器. m序列的时域波形是一个矩形,矩形在频谱上是所有奇次谐波之和,为了节省带宽资源, ...
- FPGA(五):Quartus II 调用Fir IP核使用说明
这几天在忙着写通信原理的项目,其中用到了fir滤波器的部分,从最初的一脸懵逼到初步理解了该怎么去调用ip核以及参数设置,这其中的过程着实不易.这篇博客主要是为了记录自己的学习过程以便日后也可以回想起来 ...
- FPGA数字信号处理(四)Quartus FIR IP核实现
该篇是FPGA数字信号处理的第四篇,选题为DSP系统中极其常用的FIR滤波器.本文将在前两篇的基础上,继续介绍在Quartus开发环境下使用Altera(或者叫Intel)提供的FIR IP核进行FI ...
- Xilinx的FIR IP核使用方法(参数重构改变滤波器形式)
FIR IP核可配置为极点系数为0的横向滤波器结构 IP 核配置 Filter coefficients 这里配置滤波器的类型,在Filter type中可将滤波器配置为单比率.抽取.插值滤波器.对于 ...
- 手撕IP核系列——Xilinx FIR IP核之一
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 手撕IP核系列--Xilinx FIR IP核之一 前言 FIR 滤波器模块的设置 实现分析 前言 在Xilinx和Intel平台的F ...
- Vivado Fir Ip核动态更改滤波器系数的两种方法
有时在设计过程中,可能需要不同的滤波效果,如果采样率一样的情况下,我们有两种方式进行切换系数. 第一种就是真正意义上的动态切换,如下图: 这种方式适合真正意义上的系数从新加载,但是配置相对复杂,但是省 ...
- 二相并行FIR滤波器的matlab及使用FIR IP 核的FPGA实现
二相并行FIR滤波器的matlab及modelsim仿真 二相FIR滤波器即并行FIR滤波器,以面积换取速度,可以在同样的时钟频率下,提高原始滤波器的有效吞吐量,或者降低原始滤波器的功耗. 1 并行F ...
- ise的时钟ip核_ISE的IP核clocking wizard使用和例化
datasheet:https://www.xilinx.com/support/documentation/ip_documentation/clk_wiz/v4_2/pg065-clk-wiz.p ...
最新文章
- vba 根据分辨率 缩放显示比例_【显示百闻录】第一讲:关于屏幕尺寸、比例以及分辨率...
- CNN tflearn处理mnist图像识别代码解说——conv_2d参数解释,整个网络的训练,主要就是为了学那个卷积核啊。...
- (转) oc static extern 和const
- 递归法实现库函数strlen
- 一个数据仓库转型者眼中的数据挖掘
- mysql中视图和表的区别及联系_MySQL中Update、select联用操作单表、多表,及视图与临时表的区别...
- PHP数据结构预热:PHP的迭代器(转)
- 【收藏干货】axios配置大全
- 开课吧Java课堂:如何运用equals( )和 equalsIgnoreCase( )
- EIGRP sutb
- 996程序员办公室猝死?公司:没死,继续上班了
- 闲置路由器做无线打印服务器
- multisim如何添加8050(例),8550,9013,9014
- 《深入理解计算机系统》Lab2-Bomblab
- oracle 11客户端精简版,oracle_11g精简版客户端配置
- NCT全国青少年编程能力等级测试教程(图形化编程、Python语言编程)
- 详细区分offsetX,clientX,pageX,screenX,layerX和X的区别
- 如何打造自己有创意的平面设计灵魂作品
- edge如何导入html文件收藏夹,win10系统edge浏览器收藏夹导入/导出的操作方法
- 图像正交变换的研究意义