FPGA学习笔记(六): FIR IP核的使用

这篇具有很好参考价值的文章主要介绍了FPGA学习笔记(六): FIR IP核的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

笔记六是简单介绍FIR IP核的使用,它是借助MATLAB工具可以生成自己想要的FIR滤波器。此笔记同时介绍Multiplier IP核。

设计思路:用两个DDS产生两个正弦波信号,然后使用乘法器进行混频,再使用FIR滤波器进行滤波得到最后的滤波信号,同时使用MATLAB对滤波前后信号进行时频分析,验证结果。

1. 打开VIVADO,点击IP Catalog 

fir ip核,FPGA学习笔记,fpga开发,学习

 2.搜索DDS,选择DDS Compiler,按照上节配置频率为3MHz和4MHz的DDS IP核。

fir ip核,FPGA学习笔记,fpga开发,学习

fir ip核,FPGA学习笔记,fpga开发,学习 fir ip核,FPGA学习笔记,fpga开发,学习

 这里注意不勾选Has Phase Out

fir ip核,FPGA学习笔记,fpga开发,学习

这里注意不勾选Output TREADY 

 fir ip核,FPGA学习笔记,fpga开发,学习

 输出频率为3MHz

fir ip核,FPGA学习笔记,fpga开发,学习

按照上述步骤,配置4MHz的DDS,同样不勾选Has Phase Out以及不勾选Output TREADY。

fir ip核,FPGA学习笔记,fpga开发,学习

3. 点击IP Catalog,搜索mult,选择Multiplier

 fir ip核,FPGA学习笔记,fpga开发,学习

 4. 配置Multiplier

位宽为8bit,因为DDS的输出位宽为8bit.

 fir ip核,FPGA学习笔记,fpga开发,学习

 5. 点击IP Catalog,搜索fir,选择FIR Complier.

fir ip核,FPGA学习笔记,fpga开发,学习

6. 配置FIR

(1) 选择COE File,加载filter的coe文件 

fir ip核,FPGA学习笔记,fpga开发,学习

(2) 配置系统时钟和采样频率,均为50MHz(据实际情况而定)

 fir ip核,FPGA学习笔记,fpga开发,学习

 (3) 第一个16是fir滤波器的抽头系数,第二个16是filter的输入位宽为16bit,混频器的输出位宽为16bit,选择symmetric,

fir ip核,FPGA学习笔记,fpga开发,学习

7. filter的coe文件生成

(1) 打开MATLAB,输入fdatool 

fir ip核,FPGA学习笔记,fpga开发,学习

(2) 选择低通滤波器,阶数设置15阶,采样频率为50MHz,通带截止频率为2MHz,阻带截止频率为3MHz,点击Design Filter.

fir ip核,FPGA学习笔记,fpga开发,学习

(3) 选择左边窗口第三个,Set quantization parameters,选择定点数 Fixed-point,输入16,15阶的滤波器有16个抽头系数,然后点击Apply

fir ip核,FPGA学习笔记,fpga开发,学习

(4) 点击上方Targets,选择coe文件,保存,就生成了filter的coe文件

fir ip核,FPGA学习笔记,fpga开发,学习

; XILINX CORE Generator(tm)Distributed Arithmetic FIR filter coefficient (.COE) File
; Generated by MATLAB(R) 9.4 and DSP System Toolbox 9.6.
; Generated on: 14-Nov-2022 19:07:41
Radix = 16; 
Coefficient_Width = 16; 
CoefData = ec8b,
4785,
2a2b,
27c6,
2af7,
2ea0,
3175,
32f4,
32f4,
3175,
2ea0,
2af7,
27c6,
2a2b,
4785,
ec8b;

8. 顶层文件

文件的最后几段是将混频信号和滤波信号用text文件保存下来,文件的保存地址需要根据自己的路径进行更改,注意用斜杠隔开。

module dds_filter(
    input clk,					// 输入clk
    output sig1,				// 输出信号1
    output sig2,				// 输出信号2
    output sig3,				// 输出混频信号
    output filter_sig			// 输出滤波后信号
    );
    wire clk;					
    wire [7:0] sig1;
    wire [7:0] sig2;
    wire [15:0] sig3;
    wire [39:0] filter_sig;
// 例化DDS
dds_compiler_0 dds0 (
  .aclk(clk),                              // input wire aclk
  .m_axis_data_tvalid(m_axis_data_tvalid),  // output wire m_axis_data_tvalid
  .m_axis_data_tdata(sig1)    // output wire [7 : 0] m_axis_data_tdata
);
//  例化DDS
dds_compiler_1 dds1 (
  .aclk(clk),                              // input wire aclk
  .m_axis_data_tvalid(m_axis_data_tvalid),  // output wire m_axis_data_tvalid
  .m_axis_data_tdata(sig2)    // output wire [7 : 0] m_axis_data_tdata
);

//  例化MULT,输入为sig1和sig2,输出sig3
mult_gen_0 multi0 (
  .CLK(clk),  // input wire CLK
  .A(sig1),      // input wire [7 : 0] A
  .B(sig2),      // input wire [7 : 0] B
  .P(sig3)      // output wire [15 : 0] P
);

// fir例化,输入为sig3,输出filter_sig
fir_compiler_0 fir_filter (
  .aclk(clk),                              // input wire aclk
  .s_axis_data_tvalid(1'b1),  // input wire s_axis_data_tvalid
  .s_axis_data_tready(s_axis_data_tready),  // output wire s_axis_data_tready
  .s_axis_data_tdata(sig3),    // input wire [15 : 0] s_axis_data_tdata
  .m_axis_data_tvalid(m_axis_data_tvalid1),  // output wire m_axis_data_tvalid
  .m_axis_data_tdata(filter_sig)    // output wire [39 : 0] m_axis_data_tdata
);

// 创建文件夹,注意地址
integer dout_file1;
initial begin
    dout_file1=$fopen("F:/shiyan/lab/lab3/project_2_firfilter_sample/after_filter_data.txt");    //打开所创建的文件
      if(dout_file1 == 0)begin 
                $display ("can not open the file!");    //创建文件失败,显示can not open the file!
                $stop;
       end
end
// 以有符号数将filter_sig信号写入文件保存
always @(posedge clk)
     if(m_axis_data_tvalid1)        
       $fdisplay(dout_file1,"%d",$signed(filter_sig));    //保存有符号数据

// 创建文件夹,注意地址
integer dout_file2;
initial begin
    dout_file2=$fopen("F:/shiyan/lab/lab3/project_2_firfilter_sample/before_filter_data.txt");    //打开所创建的文件
      if(dout_file2 == 0)begin 
                $display ("can not open the file!");    //创建文件失败,显示can not open the file!
                $stop;
       end
end
// 以有符号数将sig3信号写入文件保存
always @(posedge clk)
     if(m_axis_data_tvalid1)        
       $fdisplay(dout_file2,"%d",$signed(sig3));    //保存有符号数据
endmodule

9.测试文件

module tb_dds_filter();
    reg clk;					// 输入时钟
    wire [7:0] sig1;			// 输出信号1
    wire [7:0] sig2;			// 输出信号2
    wire [15:0] sig3;			// 输出混频信号
    wire [39:0] filter_sig;		// 输出滤波信号
	// 例化
    dds_filter dds_tb(
     .clk(clk),
     .sig1(sig1),
     .sig2(sig2),
     .sig3(sig3),
     .filter_sig(filter_sig)
    );
	// 初始化
    initial 
    begin
    clk = 1;					//  clk为高电平
    end
    always #10 clk = ~clk;		//  clk周期为20ns
        
       

endmodule

 10. 结果展示

fir ip核,FPGA学习笔记,fpga开发,学习

 11. MATLAB 分析,将保存的文件加载到MATLAB中做FFT分析。

        注意:MATLAB文件要和两个保存的text文件在同一文件里;len,len2的长度和具体运行之后的保存结果有关,需要根据自己的运行结果进行更改。

%% 对混频信号和滤波信号做时频域分析
clc                                 % 清屏
clear all;                          % 清除变量
close all;                          % 关闭所有窗口
% 加载文件
load before_filter_data.txt
load after_filter_data.txt
% 给文件命名
before=before_filter_data;
after=after_filter_data;
%% 绘图
figure(1);
plot(before);                       % 绘制混频信号
axis([0 200 -20000 20000])          % 坐标轴范围设置
title('滤波前混频信号时域波形');    % 标题
figure(2);
plot(after);                        % 绘制滤波后信号
axis([0 200 -2*10e8 2*10e8])        % 坐标轴范围设置
title('滤波后信号时域波形');        % 标题
%% FFT分析
fs=50e6;                            % 采样频率                    
len=55751;                          % 滤波信号长度
len2=55751;                         % 混频信号长度 
ff=fs/len;                          % 滤波信号频谱分辨率
ff2=fs/len2;                        % 混频信号频谱分辨率
f=-fs/2:ff:fs/2-ff;                  % 滤波信号频谱范围
f2=-fs/2:ff2:fs/2-ff2;               % 混频信号频谱范围
% FFT
bfft=fft(before);                   % 混频信号做FFT
afft=fft(after);                    % 滤波信号做FFT
figure(3);
plot(f2,abs(fftshift(bfft)));       % 绘制混频信号频谱
axis([-8e6,8e6,-inf,inf]);          % 坐标轴范围设置
title('滤波前混频信号频谱');        % 标题
figure(4);
plot(f,abs(fftshift(afft)));        % 绘制滤波信号频谱
axis([-2e6,2e6,-inf,inf]);          % 坐标轴范围设置
title('滤波后单频信号频谱');        % 标题

12.MATLAB时频分析结果 

fir ip核,FPGA学习笔记,fpga开发,学习  fir ip核,FPGA学习笔记,fpga开发,学习

 fir ip核,FPGA学习笔记,fpga开发,学习

fir ip核,FPGA学习笔记,fpga开发,学习文章来源地址https://www.toymoban.com/news/detail-778813.html

到了这里,关于FPGA学习笔记(六): FIR IP核的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA之Quartus II 自带的IP核的使用(IP核仅自己学习,未完成)

    1、锁相环:       锁相环是对接收到的信号进行处理,并从其中提取某个时钟的相位信息。锁相环由鉴相器、环路滤波器和压控振荡器组成。  锁相环原理图 鉴相器:         用来鉴别输入信号输入信号Ui与输出信号输出信号Uo之间的相位差相位差,并输出误差电压Ud。Ud

    2023年04月09日
    浏览(30)
  • 【Lattice FPGA 开发】IP核的调用

    本文介绍Diamond开发软件进行IP核调用与对应官方文档查找方法。 Diamond软件中,根据所选目标FPGA器件型号的不同,调用IP核的方式不同。共两种:一种是“IPexpress”;另一种是“Clarity Designer”。 IPexpress调用IP核: Clarity Designer调用IP核: 接下来分别对两种情况的调用进行说明

    2024年04月12日
    浏览(35)
  • FPGA平台以太网学习:涉及1G/2.5G Ethernet 和Tri Mode Ethernet MAC两个IP核的学习记录(二)——IP学习使用

      学习不能稀里糊涂,要学会多思考,发散式学习以及总结:   FPGA作为一种器件,只是实现目的的一种方法,过度追求实现的技术细节(用hdl还是hls,用啥芯片,用啥接口)容易只见树木不见森林。工具软件的用法也好,器件的架构也好,语言孰优孰劣的争论也罢。工程应

    2023年04月10日
    浏览(32)
  • FPGA原理与结构——时钟IP核的使用与测试

    系列文章目录:FPGA原理与结构(0)——目录与传送门         本文介绍xilinx的时钟IP核 Clocking Wizard v6.0的具体使用与测试过程,在学习一个IP核的使用之前,首先需要对于IP核的具体参数和原理有一个基本的了解,具体可以参考: FPGA原理与结构——时钟IP核原理学习 https:/

    2024年02月09日
    浏览(28)
  • FPGA原理与结构(16)——时钟IP核的使用与测试

    系列文章目录:FPGA原理与结构(0)——目录与传送门         本文介绍xilinx的时钟IP核 Clocking Wizard v6.0的具体使用与测试过程,在学习一个IP核的使用之前,首先需要对于IP核的具体参数和原理有一个基本的了解,具体可以参考: FPGA原理与结构——时钟IP核原理学习 https:/

    2024年02月08日
    浏览(28)
  • FPGA原理与结构——RAM IP核的使用与测试

    系列文章目录:FPGA原理与结构(0)——目录与传送门 目录 一、前言 二、RAM IP核定制 1、RAM IP核 step1 打开vivado工程,点击左侧栏中的IP Catalog step2 在搜索栏搜索RAM,找到Block Memory Generator IP核: 2、IP核定制 step3 Baisc界面定制 step4 端口定制 step5 Other Options step6 Summary 3、IP核例化

    2024年02月11日
    浏览(27)
  • xilinx FPGA FIFO IP核的使用(VHDL&ISE)

    1.新建工程和ip核文件 下图显示了一个典型的写操作。拉高WR_EN,导致在WR_CLK的下一个上升边缘发生写入操作。因为FIFO未满,所以WR_ACK输出1,确认成功的写入操作。当只有一个附加的单词可以写入FIFO时,FIFO会拉高ALMOST_FULL标志。当ALMOST_FULL拉高之后,一个附加的写入将导致

    2024年02月03日
    浏览(39)
  • xilinx FPGA ROM IP核的使用(VHDL&ISE)

    目录 1.新建工程之后 建一个ip核文件: 2.编写顶层文件或者激励文件:(一定一定点击下面这个例化模板 去对ip核进行例化) 3.查看rtl图:   4编写测试文件: 5.仿真图: 工程下载链接:https://download.csdn.net/download/qq_43811597/86488775       根据所存数据的最大值来设置数据位宽

    2024年02月08日
    浏览(35)
  • 解析使用FPGA逻辑实现FIR滤波器的几种架构

    有限脉冲响应(finite impulse response,FIR)数字滤波器         FIR滤波器的实质就是输入序列与系统脉冲响应的卷积,即:         其中,N为滤波器的阶数,也即抽头数;x(n)为第n个输入序列;h(n)为FIR滤波器的第n级抽头系数。         FIR滤波器基本结构如下:      

    2024年02月08日
    浏览(29)
  • 基于FPGA的FIR滤波器的实现(5)— 并行结构FIR滤波器的FPGA代码实现

    并行结构,并行实现滤波器的累加运算,即并行将具有对称系数的输入数据进行相加,而后采用多个乘法器并行实现系数与数据的乘法运算,最后将所有乘积结果相加输出。这种结构具有最高的运行速度,因不需要累加运算,因此系数时钟频率可以与数据输出时钟频率保持一

    2024年02月03日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包