版权声明:转载请注明出处 https://blog.csdn.net/DengFengLai123/article/details/83934462
参考资料:
- 教程——基于HLS实现FIR滤波器https://blog.csdn.net/LZY272942518/article/details/46730303
- Vivado HLS之滤波器实现https://blog.csdn.net/smilencezq/article/details/39054975Vivado HLS之滤波器实现https://blog.csdn.net/smilencezq/article/details/39054975
- VIVADO FIR滤波器设计与仿真(一)https://blog.csdn.net/chinkwoyu/article/details/80262273
- VIVADO FIR滤波器设计与仿真(二)
- 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语言代码
- 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滤波器。