基于FPGA 的FIR IP使用提高一

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

在上一篇文章《基于Vivado的DDS和FIR核的使用》中,介绍了FIR IP核的使用,当时是通过单个系数集,单个通道实现的滤波功能。

在实际的过程中,可能存在想要动态改变滤波器,实现不同的滤波效果的目的。实现该目的,通常的一种做法为调整滤波器的系数,相应地一般有2种方法,一是通过Reload系数的方式;一是重配置系数的方式。前者是重新装载一份新的系数文件,而后者则是通过事先将所有的系数写入一份系数文件,通过配置来选择使用那一组系数。相比而言,前者配置相对复杂,但是节省资源;而后者配置简单,但是占用更多资源。因此对于仅仅只是少数几种参数进行切换,可以采用后者的方式。

这里就介绍如何通过重配置系数的方式来实现不同的滤波效果,将一个含有多个频率成分的信号,经由不同的带通滤波,得到不同频率的信号,不在通带范围内的信号都被滤掉了。

一、信号产生

通过DDS和加法电路来产生含有不同频率成分的信号。

1、DDS配置

通过DDS IP核,产生4路信号的输出,在配置IP核时,直接将通道设置为4,基于FPGA 的FIR IP使用提高一,fpga开发

因为需要输出4个信号,为了能够区分输出的端口上输出的数据是哪一个通道的,将tuser选项中的 data output设置为chan id,以实现输出通道数据的选择。

基于FPGA 的FIR IP使用提高一,fpga开发

待IP配置完成后,进行例化操作,此处不做赘述。前面提到的输出通道选择的相关的代码如下:

reg data_ovalid_r;

reg [15:0] sine_data_25K;   //25K波形数据

reg [15:0] sine_data_45K;   //

reg [15:0] sine_data_65K;  //

reg [15:0] sine_data_85K;  //85K波形数据

always@(posedge clk_i or negedge rst_n)begin

    if(rst_n == 1'b0) begin

        data_ovalid_r <= 1'b0;

        sine_data_25K <= 16'd0;

        sine_data_45K <= 16'd0;

        sine_data_65K <= 16'd0;

        sine_data_85K <= 16'd0;

    end

    else begin

        if(dds_data_valid) begin

            data_ovalid_r <= 1'b1;

            case(dds_data_tuser)   //此处实现输出通道数据的选择

                2'b00:sine_data_25K  <= dds_dataout;

                2'b01:sine_data_45K  <= dds_dataout;

                2'b10:sine_data_65K  <= dds_dataout;

                2'b11:sine_data_85K  <= dds_dataout;

            endcase

        end

        else begin

            data_ovalid_r <= 1'b0;

            sine_data_25K <= 16'd0;

            sine_data_45K <= 16'd0;

            sine_data_65K <= 16'd0;

            sine_data_85K <= 16'd0;

        end           

    end

end

2、混频,求和

求和直接用一个加法电路实现。将上述输出的4路信号进行求和,得到一个含有4个频率成分的信号。

reg signed [17:0] addr_wave;

always@(posedge clk_i or negedge rst_n)begin

    if(!rst_n)

        addr_wave <= 18'd0;

    else if(dds_data_ovalid)

        addr_wave <= sine_data_25K + sine_data_45K + sine_data_65K + sine_data_85K;

    else

        addr_wave <= addr_wave;

end

相应波形的matlab仿真结果如下:

基于FPGA 的FIR IP使用提高一,fpga开发

二、FIR设计及IP配置

1、FIR 设计

同样的,FIR的系数设计用matlab实现,此处参考了CSDN 上其他网友的文章,采用了类似的设计。分别得到4个不同的系数coe文件,之后将其合并到一个coe文件中。

基于FPGA 的FIR IP使用提高一,fpga开发

设计的带通滤波器的效果如下图所示:基于FPGA 的FIR IP使用提高一,fpga开发

2、FIR IP配置

FIR IP的配置与之前文章中提及的没有太多的区别,差异主要体现在系数文件和系数集个数的不同。

基于FPGA 的FIR IP使用提高一,fpga开发

另外,需要留意的是,因系数集个数大于1,会在端口上多出来config配置端口,如下

基于FPGA 的FIR IP使用提高一,fpga开发基于FPGA 的FIR IP使用提高一,fpga开发

接下来,重要的是,根据器件的时序要求进行设计,主要关注的是tvalid、tready、tdata等信号,在本例中,将dds输出的valid信号直接给到s_a端口,用作数据的有效信号,结合s_a_tready和s_a_tdata信号实现数据的输入;而对于config端口,通过定时计数的方式,定时一段时间,给一个信号,持续一个时钟周期的高电平,该信号用作cfg_tvalid使用,另外需要配合cfg_tdata。

相关的代码如下:

//计数

always@(posedge clk_50m or negedge clk_locked)begin
    if(!clk_locked)
        cnt <= 16'd0;
    else if(cnt == CNT_MAX)
        cnt <= 16'd0;
    else
        cnt <= cnt + 1'b1;
end

reg  [ 7:0] s_cfg_data;
always@(posedge clk_50m or negedge clk_locked)begin
    if(!clk_locked)
        s_cfg_data <= 8'd0;
    else begin
        if(cnt == CNT_MAX) begin
            sa_cfg_tvalid <= 1'b1;
            if(s_cfg_data == 8'd3)
                s_cfg_data <= 8'd0;
            else
                s_cfg_data <= s_cfg_data + 1'b1;
        end
        else begin
            sa_cfg_tvalid <= 1'b0;
            s_cfg_data <= s_cfg_data;
        end
    end
end
assign sa_cfg_tdata = s_cfg_data;

三、仿真分析

test代码十分简单,这里只贴出了仿真的结果。

结果图中,sa_data_tdata的波形跟matlab给出的波形一致,是4个信号的混频;

而fir_data_out的波形可以看出,在sa_cfg_tdata的不同数值下,实现了不同频率信号的输出,达到了通带内信号通过,带外信号衰减的选频的目的。

基于FPGA 的FIR IP使用提高一,fpga开发

至此,整个的工程结束。

四、最后

感谢一下《FIR 高级应用 - 多通道实验》的作者,给了我很多的启发,他的专栏里面的相关内容很值得一看。文章来源地址https://www.toymoban.com/news/detail-839655.html

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

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

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

相关文章

  • 解析使用FPGA逻辑实现FIR滤波器的几种架构

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

    2024年02月08日
    浏览(42)
  • 基于FPGA的FIR低通滤波器实现(附工程源码),matlab+vivado19.2+simulation

    本文为FPGA实现FIR滤波器仿真过程,附源代码。 提示:以下是本篇文章正文内容,下面案例可供参考 打开MATLAB在命令行窗口输入: fadtool 回车后在滤波器设计界面设置滤波器参数如下 之后点击如图标志,设置定点,在菜单栏\\\"目标(R)\\\"出选择生成对应滤波器系数.COE文件 mat

    2024年02月11日
    浏览(48)
  • FPGA(基于xilinx)中PCIe介绍以及IP核XDMA的使用

    例如:第一章 PCIe简介以及IP核的使用 PCIe 总线架构与以太网的 OSI 模型类似,是一种分层协议架构, 分为事务层(Transaction Layer)、 数据链路层(Data Link Layer) 和物理层(Physical Layer)。 这些层中的每一层都分为两部分:一部分处理出站(要发送的)信息,另一部分处理入站(接收

    2024年02月08日
    浏览(46)
  • 紫光同创 FPGA 开发跳坑指南(四)—— DDR3 控制器 IP 的使用

    DDR3 是一种大容量的存储器件,采用了预取技术和双边沿采样技术,以实现高速数据存储与读取,在视频处理中可以用来缓存 1 帧或多帧图像。 目录 一、紫光 DDR3 IP 的安装 二、紫光 DDR3 IP 的配置 三、DDR3 IP 的使用 3.1 DDR3 写操作 3.2 DDR3 读操作         在 Pango Design Suit 中,选

    2024年01月25日
    浏览(52)
  • FIR滤波器简述及FPGA仿真验证

    数字滤波器的设计,本项目做的数字滤波器准确来说是FIR滤波器。 FIR滤波器(有限冲激响应滤波器),与另一种基本类型的数字滤波器——IIR滤波器(无限冲击响应滤波器)相对应,其实就是将所输入的信号都看成是离散的,用离散的冲击信号代替实际的信号。对于FIR滤波器

    2024年02月09日
    浏览(51)
  • m基于FPGA的Hamming汉明编译码verilog实现,包含testbench测试文件,不使用IP核

    目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 Hamming编码过程 2.2 Hamming解码与纠错 2.3 FPGA实现 3.Verilog核心程序 4.完整算法代码文件 本系统进行了Vivado2019.2平台的开发,测试结果如下:        在现代数字通信和存储系统中,错误检测和纠正(Error Detection and Correction, EDC)机

    2024年01月23日
    浏览(37)
  • 利用FPGA实现全串行低通FIR滤波器

    设计一个15阶(长度为16)的具有线性相位低通FIR滤波器,采用布拉克曼窗函数设计,截止频率为500HZ,抽样频率为2000HZ;采用FPGA实现全串行FIR滤波器,系数的量化位数为12比特,输入数据位数为12比特,输出数据位数为29比特,系统时钟为16KHZ 设计思路 :首先采用MATLAB根据要

    2024年02月07日
    浏览(51)
  • FIR内插滤波器的FPGA实现(一)-matlab实现

    FIR内插滤波器是一种基本的插值方法,主要有两个步骤: 1)在输入的每一个初始采样中间插入L个零点; 2)插零后的数据经过低通滤波器。 运行结果如图(时域、频域): 我们的目标是把采样频率提升五十倍。 得到的频域图: 可以看出内插零点在频域会实现频谱扩展,因此

    2024年02月03日
    浏览(57)
  • FPGA 的 DSP:Verilog 中的简单 FIR 滤波器

    本项目介绍如何用 Verilog 实现一个带有预生成系数的简单 FIR 滤波器。 简陋的 FIR 滤波器是 FPGA 数字信号处理中最基本的构建模块之一,因此了解如何利用给定的抽头数和相应的系数值组装一个基本模块非常重要。因此,在这个关于在 FPGA 上入门 DSP 基础知识的实用方法迷你系

    2024年03月17日
    浏览(42)
  • FPGA 的数字信号处理:重写 FIR 逻辑以满足时序要求

    在上一篇文章中(FPGA 的数字信号处理:Verilog 实现简单的 FIR 滤波器)演示了在 Verilog 中编写自定义 FIR 模块的初始demo。该项目在行为仿真中正常,但在布局和布线时未能满足时序要求。 所以今天的文章让我们来看看当设计不能满足时序要求时如何分析并解决它。 当在目标

    2024年02月09日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包