跳转到主要内容

Xilinx FIR IP的介绍与仿真

judy 提交于

作者: <span id="js_author_name" datarewardsn="" datatimestamp="" datacanreward="0">OpenSLee</span> 来源:<span id="profileBt"><a href="https://mp.weixin.qq.com/s?__biz=MzUyODUwMDExOQ==&amp;mid=2247486269&am…开源工作室</a></span>

<strong>1 xilinx fir ip简介</strong>

1)符合AXI4-Stream的接口

2)高性能有限脉冲响应(FIR),多相抽取器,多相内插器,半带,半带抽取器和半带内插器,希尔伯特变换和内插滤波器实现

3)最多支持256组系数,处理一组以上时,每组2至2048个系数。

4)输入数据高达49位精度

5)滤波器系数高达49位精度

6)支持多达1024个交错数据通道

7)支持高级交错数据通道序列

8)通过共享控制逻辑支持多个并行数据通道

9)插值和抽取因子通常最多为64,单通道滤波器的最大为1024

10)支持大于时钟频率的采样频率

11)在线系数重装能力

12)用户可选的输出舍入

13)高效的多列结构,适用于所有过滤器的实现和优化
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>
<p align="center"><strong>Fir公式</strong></p>
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>
<p align="center"><strong>常规抽头延迟线FIR滤波器表示</strong></p>

<strong>2 设计验证思路</strong>
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>

混频器设计参考《基于FPGA数字混频器的设计》。

如上图所示,混频模块内部包含两个dds模块,一个产生2khz sine波,一个产生3khz sine波,然后相乘得到1khz+6khz的混频,然后使用xilinx FIR IP设计一个低通滤波器滤掉6khz,最后只剩1khz。

<strong>3 matlab fdatool设计低通滤波器</strong>

1)打开fdatool
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>

2)低通滤波器设计

Fs=44100;

Fpass =3000;

Fstop =5000;

Apass = 1;

Astop =120;

幅频响应如下图所示。
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>

3 系数量化
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>

4)matlab导出 .coe
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>

<strong>4 xilinx FIR IP的设置与仿真</strong>
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>

如上图所示,左侧包含IP Symbol、Freq.Response、Implementation Details和CoefficientReload。右侧包括Filter Options、Channel Specification、Implementation、Detailed Implementation、Interface和Summary.

1) Filter Options

(1)系数源(Coefficient Source):直接在GUI中使用系数矢量参数或使用由CoefficientFile参数指定的.coe文件,指定要使用的系数输入。

(2)系数向量(Coefficient Vector ):用于直接在GUI中指定滤波器系数。过滤器系数使用逗号分隔列表以十进制形式指定,与过滤器系数数据文件中的coefdata字段相同。与.coe文件一样,可以使用FIR编译器根据您的要求适当量化的非整数实数来指定滤波器系数。

(3)滤波器类型(Filter Typ ):支持五种滤波器类型:单速率FIR,插值FIR,抽取FIR,希尔伯特变换和插值FIR。
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>

2) Channel Specification

(1)选择格式(Select format ):选择用于指定硬件过采样率,内核可用于处理输入采样并生成输出的时钟周期数的格式。该值直接影响核心实现和所使用资源的并行度。选择“频率规格”后,可以指定“输入采样频率”和“时钟频率”。这些值之间的比率以及其他核心参数决定了硬件过采样率。

选择“输入采样周期”时,可以指定输入采样之间的时钟周期数。同样,选 择“输出采样周期”时,可以指定输出采样之间的时钟周期数。

(2)采样周期(Sample Period ):输入或输出采样之间的时钟周期数。当指定了多个通道时,该值应该是时分多路复用输入样本数据流之间时钟周期的整数。可以使用分数采样周期来指定大于时钟频率的采样频率.

(3)输入采样频率(Input Sampling Frequency ):该字段可以是整数或实数值;它指定一个通道的采样频率。根据时钟频率和滤波器参数(例如插值率和通道数)设置上限。

(4)时钟频率(Clock Frequency ):此字段可以是整数或实数值。限制是根据采样频率,内插率和通道数设置的。该领域仅影响体系结构选择。最终的实现可能无法达到指定的时钟速率。
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>

3) Implementation

(1)系数类型(Coefficient Type ):系数数据可以指定为有符号或无符号。

(2)输入数据小数位(Input Data Fractional Bits ):用于表示过滤器输入数据样本的小数部分的输入数据宽度位数。该字段仅供参考。它与系数小数位一起使用,以计算滤波器的输出小数位值。此参数在IP集成器中自动设置,但也可以被覆盖。

(3)输出舍入模式(Output Rounding Mode ):指定要应用于过滤器输出的舍入类型。

(4)输出小数位(Output Fractional Bits ):此字段报告用于表示滤波器输出样本小数部分的输出宽度位数
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>

4) Interface
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>

5) Freq.Response
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>

<pre>

`timescale1ns / 1ps

modulefir_top(
input mclk,
input reset_n,
input signed [31:0] pcm_in,
output signed [31:0] y
);
reg [9:0] cnt;
reg pcm_en;
wire s_axis_data_tready;
wire m_axis_data_tvalid;
wire [71 : 0] m_axis_data_tdata;

assign y = m_axis_data_tdata[61:30];
always @(posedge mclk or negedge reset_n)begin
if(!reset_n) begin
cnt&lt;=10'd0;
pcm_en&lt;=1'b0;
end
else begin
cnt&lt;=cnt+10'd1;

if(cnt==10'd0)
pcm_en&lt;=1'b1;
else
pcm_en&lt;=1'b0;
end
end

//-----------Begin Cut here for INSTANTIATION Template ---// INST_TAG
fir_lowUfir_low (
.aresetn(reset_n), // input wire aresetn
.aclk(mclk), // input wireaclk
.s_axis_data_tvalid(pcm_en), // input wire s_axis_data_tvalid
.s_axis_data_tready(s_axis_data_tready), // output wire s_axis_data_tready
.s_axis_data_tdata(pcm_in), // input wire [31 : 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 [71 : 0] m_axis_data_tdata
);

endmodule
</pre>

将混频信号和经过xilinx FIR IP 滤波后信号写出matlab观察时域和频域.

1 混频信号

滤波前的1khz+6khz的混频信号。
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>

2 滤波后
<center><img src="http://xilinx.eetrend.com/files/2020-07/%E5%8D%9A%E5%AE%A2/100050403-10…; alt=""></center>

如上所示,经过滤波后6khz完全被滤除,只剩下1khz信号。仿真验证成功。

参考文章—pg149