Vivado HLS实现FIR滤波器(1)——使用官方C代码实现FIR

版权声明:转载请注明出处 https://blog.csdn.net/DengFengLai123/article/details/83934462

参考资料:

  1. 教程——基于HLS实现FIR滤波器https://blog.csdn.net/LZY272942518/article/details/46730303
  2. Vivado HLS之滤波器实现https://blog.csdn.net/smilencezq/article/details/39054975Vivado HLS之滤波器实现https://blog.csdn.net/smilencezq/article/details/39054975
  3. VIVADO FIR滤波器设计与仿真(一)https://blog.csdn.net/chinkwoyu/article/details/80262273
  4. VIVADO FIR滤波器设计与仿真(二)
  5. ZED Board从入门到精通系列(八)——Vivado HLS实现矩阵相乘 https://blog.csdn.net/kkk584520/article/details/18812321

不同点说明

使用Vivado HLS的FIR滤波器例程,代码在后面给出了,上面的参考资料里也有,网上的资料已经有很多类似的了,下面分享一些不一样的地方:
(1)网上资料和Xilinx出版的一些书籍都没有详细说到测试文件fir_test中out.gold.dat文件,会导致程序出现一些小问题,在本博客中删掉了数据的测试对比,只保留了测试步骤,这样有了C测试文件之后可以进行C/RTL协同仿真;
(2)在编写C代码生成FIR IP后,没有后续的再Vivado中调用的过程,下一篇博客将会给出HLS生成的IP如何在Vivado中调用并且设计时序和驱动信号。

程序结构

C语言代码

  1. fir.c文件
    包含<ap_cint>头文件,引入任意精度数据类型,可以定义为任意精度的整数,如uint5 x;指定义一个无符号的位宽为5位的数x。
#include "fir.h"
#include <ap_cint.h>

void fir ( data_t *y, coef_t c[N], data_t x)
{
#pragma HLS INTERFACE ap_ovld port=y
#pragma HLS RESOURCE variable=c core=RAM_1P_BRAM
	//将c口设置成与外部ram相连的接口,使得c口可以直接从外部ram中读数据

	static data_t shift_reg[N];
	acc_t acc;
	data_t data;
	int i;

	acc=0;
	Shift_Accum_Loop: for (i=N-1;i>=0;i--)
	{
#pragma HLS UNROLL
    	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;
}

2.fir.h文件
定义FIR滤波器的阶数为11阶。

#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_t c[N+1],
 data_t x
 );

#endif

3.fir.test文件

#include <stdio.h>
#include <math.h>
#include "fir.h"

int main ()
{
	const int SAMPLES=600;
	FILE *fp;

	data_t signal, output;
	coef_t taps[N] ={0,-10,-9,23,56,63,56,23,-9,-10,0,};//滤波器系数

	int i, ramp_up;
	signal = 0;
	ramp_up = 1;

//	fp = fopen("out.dat","w");	//取消了打开out.dat
	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;
		else if((ramp_up == 0) && (signal <= -75))
			ramp_up = 1;

		// Save the results.
	//	fprintf(fp,"%i %d %d\n",i,signal,output);
	}

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

	return 0;
}

仿真综合

(1)点击 Run C Simulation,进行C仿真
(2)点击Run C Synthesis,进行C的综合分析,获得分析报告,看到资源使用情况,可以草考资料链接的第五篇进行约束。
在这里插入图片描述

(3)点击Run C/RTL Cosimulation,进行C和RTL协同仿真,进行了这一步之后可以看到仿真波形,打包成IP后在VIVADO中才能进行仿真。 在这里插入图片描述

(4)协同仿真成功后,下图红框中的图标才会点亮,能够进行点击,点击该图标会打开VIVADO的查看仿真波形,HLS会综合处一些原本没有的引脚,要根据仿真波形的引脚时序在VIVADO中给出高低电平。在这里插入图片描述

(5)打包IP
在这里插入图片描述
生成IP成功后会在solution下的impl -> ip 文件夹下生成一个.zip压缩包,将此压缩包导入VIVADO即可使用生成的FIR滤波器。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/DengFengLai123/article/details/83934462