教程——基于HLS实现FIR滤波器

注:本博文所需工程下载链接:http://download.csdn.net/detail/lzy272942518/8863107

1.FIR滤波器简介

FIR(Finite Impulse Response)滤波器:有限长单位冲激响应滤波器,又称为非递归型滤波器,是数字信号处理系统中最基本的元件,它可以在保证任意幅频特性的同时具有严格的线性相频特性,同时其单位抽样响应是有限长的,因而滤波器是稳定的系统。因此,FIR滤波器在通信、图像处理、模式识别等领域都有着广泛的应用。

在进入FIR滤波器前,首先要将信号通过A/D器件进行模数转换,把模拟信号转化为数字信号;滤波器输出的数据是一串序列。FPGA有着规整的内部逻辑阵列和丰富的连线资源,特别适合于数字信号处理任务,相对于串行运算为主导的通用DSP芯片来说,其并行性和可扩展性更好,利用FPGA乘累加的快速算法,可以设计出高速的FIR数字滤波器。本章借助Xilinx HLS工具,实现了一个硬件FIR滤波器。

2.基于HLS的FIR滤波器实现流程

1)打开vivado HLS 2014.4,点击“Create New Project”图标,如下图所示:


2)输入工程名和路径,点击Next:


3)接下来是指定顶层函数名,以及添加所需源文件。可以在工程建立后再进行这些操作,所以直接点击Next:


4)然后是指定测试文件,同样跳过,点击Next:


5)在接下来的界面中,设置时钟周期为默认的10(单位:ns),点击Part Selection右侧的按钮:


6)在search栏输入xc7k160tfbg484-2,然后在Device中选择xc7k160tfbg484-2器件,点击ok。

7)回到Solution Configuration界面,点击Finish,完成新建工程。

8)右击工程界面左侧Explorer栏的Source,选择New File,新建两个文件:fir.h和fir.c。在fir.h中添加如下代码:

#ifndef FIR_H_

#define FIR_H_

#define N   11

 

typedef int coef_t;

typedef int data_t;

typedef int acc_t;

 

void fir (

 data_t*y,

 coef_tc[N+1],

 data_tx

 );

 

#endif

保存文件,再在fir.c中添加如下代码:

#include "fir.h"

 

void fir (

 data_t *y,

 coef_t c[N],

 data_t x

 ) {

#pragma HLS INTERFACE ap_vld port=x

#pragma HLS RESOURCE variable=c core=RAM_1P_BRAM

 

 static data_tshift_reg[N];

 acc_t acc;

 data_t data;

 inti;

 

 acc=0;

 Shift_Accum_Loop: for (i=N-1;i>=0;i--) {

        if (i==0) {

            shift_reg[0]=x;

        data = x;

   } else{

            shift_reg[i]=shift_reg[i-1];

            data= shift_reg[i];

   }

   acc+=data*c[i];;      

 }

 *y=acc;

}

注意到,优化指令#pragma HLS RESOURCE variable=c core=RAM_1P_BRAM的功能是将c口设置成与外部ram相连的接口。使得c口可以直接从ram中读取数据。可以通过综合完毕后的报告,查看最终生成的端口类型。

保存文件,此时工程界面如下所示:


9)设置顶层函数名。点击project->projectsettings,然后选择synthesis,在SynthesisSettings界面中设置Top Function为fir,如下图所示。然后点击ok:


10)综合工程。点击工程界面上方的综合按钮,如下图红框内所示:


11)综合结束,工程界面会出现一个report文件,可以查看延时以及等待时间、资源占用、接口类型等信息。


12)接下来是测试。右击Explore栏的Test Bench,新建一个fir_test.c的测试文件。添加以下代码,并保存:

#include <stdio.h>

#include <math.h>

#include "fir.h"

 

int main () {

 constint    SAMPLES=600;

 FILE         *fp;

 

 data_tsignal, output;

 coef_ttaps[N] ={0,-10,-9,23,56,63,56,23,-9,-10,0,};

 

 inti, ramp_up;

 signal = 0;

 ramp_up = 1;

 

 fp=fopen("out.dat","w");

 for(i=0;i<=SAMPLES;i++) {

   if (ramp_up == 1)

       signal = signal + 1;

   else

       signal = signal - 1;

 

    // Execute the function with latest input

   fir(&output,taps,signal);

   

   if((ramp_up == 1) && (signal >= 75))

    ramp_up = 0;

   elseif((ramp_up == 0) && (signal <= -75))

    ramp_up = 1;

   

    // Save the results.

   fprintf(fp,"%i %d %d\n",i,signal,output);

 }

 fclose(fp);

 

 printf("Comparing against output data\n");

 if(system("diff -w out.datout.gold.dat")) {

 

    fprintf(stdout, "*******************************************\n");

    fprintf(stdout, "FAIL: Output DOES NOT match the goldenoutput\n");

    fprintf(stdout, "*******************************************\n");

    return1;

 } else{

    fprintf(stdout, "*******************************************\n");

    fprintf(stdout, "PASS: The output matches the golden output!\n");

    fprintf(stdout, "*******************************************\n");

    return0;

 }

}

13)添加测试数据文件。将out.gold.dat文件复制到工程根文件夹下,然后在Test Bench中添加这个文件。

14)点击RunC Simulation按钮,然后在新弹出的C Simulation Dialog窗口中点击OK,进行测试:


15)测试结束后,Console窗口中会打印出下图红框内的信息,证明测试通过:


  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: HLS(High-Level Synthesis)和PYNQ(Python Productivity for Zynq)在FIR滤波器设计中都有重要的应用。 首先,HLS是一种高级综合工具,可以将高级语言(如C/C++)代码转换为硬件描述语言(如VHDL或Verilog),从而实现对程序的高层次综合。在FIR滤波器设计中,HLS可以极大地简化设计流程。设计者只需使用C/C++编写FIR滤波器的算法实现,然后使用HLS工具将其转换为硬件描述语言。这样可以大幅缩短开发时间,同时减少设计错误的风险。HLS还可以优化生成的硬件代码,以提高性能和减少资源消耗。 PYNQ是一个基于Python的开发环境,用于Zynq系列FPGA的快速原型开发。在FIR滤波器设计中,PYNQ提供了一个易用的Python编程界面,使设计者可以通过编写Python脚本来实现滤波器算法。PYNQ还提供了丰富的库和工具,以便进行硬件加速。通过利用PYNQ的高级API和硬件加速功能,可以使FIR滤波器FPGA上运行更快且更高效。 综上所述,HLS和PYNQ在FIR滤波器设计中发挥着重要作用。HLS可以将高级语言代码转换为硬件描述语言,从而简化设计流程并提高设计效率。而PYNQ则提供了具有高级API和硬件加速功能的Python开发环境,使FIR滤波器设计更加灵活和高效。两者结合使用,可以在滤波器设计中获得更好的性能和更快的开发速度。 ### 回答2: HLS(High-Level Synthesis)和PYNQ(Python productivity for Zynq)在fir滤波器设计中有着重要的应用。 HLS是一种高级综合工具,它允许使用高级语言(例如C、C++或SystemC)来描述硬件设计,并自动生成硬件描述语言(HDL)代码,如Verilog或VHDL。HLS可以大大减少编写和调试HDL代码的工作量,提高硬件设计的开发效率。 在fir滤波器设计中,可以使用HLS快速生成滤波器的硬件描述代码。通过将滤波器的算法实现为C或C++代码,然后使用HLS工具进行综合,可以将其转化为效率高且对资源利用率优化的硬件描述代码。使用HLS工具可以方便地对滤波器进行功能验证和性能评估,同时也能够快速优化设计,使其满足滤波器设计的需求。 PYNQ是一个基于Python的开发环境,它为Zynq系列的FPGA提供了更高的生产力和易用性。PYNQ结合了Python的简洁和可读性,以及FPGA强大的并行计算能力,能够使用Python编程语言轻松地进行FPGA开发。在fir滤波器设计中,可以使用PYNQ构建滤波器的控制逻辑和数据流控制。通过调用PYNQ提供的库函数和API,可以使用Python语言轻松地控制ZynqFPGA进行滤波器数据的输入、处理和输出。 使用PYNQ进行fir滤波器设计,可以实现高度灵活的开发流程。Python的高级编程语言特性使得fir滤波器的调试、测试和性能优化更加易于理解和操作。此外,PYNQ还提供了丰富的示例代码和开发工具,加速滤波器设计的开发过程。 综上所述,HLS和PYNQ在fir滤波器设计中的应用可以显著提高硬件设计的效率和可读性,简化了设计过程,并为开发人员提供了更多的工具和资源进行优化和测试。 ### 回答3: HLS和Pynq在FIR滤波器设计中有着重要的应用。 HLS(High-Level Synthesis)是一种用于高级语言(如C/C++)描述硬件功能并自动生成硬件电路的技术。在FIR滤波器设计中,HLS可以将滤波器算法的高级描述转化为硬件电路。它可以将复杂的计算任务分解为并行任务,并通过合理的调度和资源分配生成高效的硬件。与传统的手动硬件设计相比,HLS可以大大缩短设计周期并提高设计的可重用性。 Pynq是一种基于Python的可编程逻辑(PL)和处理系统(PS)的开发平台。在FIR滤波器设计中,Pynq可以用于快速原型开发和系统集成。通过使用Python和Pynq,可以实现对硬件功能的快速控制和配置,而无需深入了解硬件设计的细节。Pynq还提供了各种可编程逻辑的高级库和示例代码,使得滤波器的开发更加方便和高效。 结合HLS和Pynq可以实现高效的FIR滤波器设计。首先,使用HLSFIR滤波器算法转化为硬件电路,通过并行化和资源分配使得硬件电路性能更佳。其次,通过Pynq进行快速原型开发,借助Python轻松控制和配置硬件功能,便于系统集成和功能验证。这种组合使用可以提高滤波器设计的效率和效果,同时降低设计的复杂性和风险。 总之,HLS和Pynq在FIR滤波器设计中的应用使得滤波器的设计更加高效和灵活,提高了开发者的生产效率和设计质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值