最近在写一本Xilinx的FPGA方面的书,现将HLS部分内容在这里分享给大家,希望大家喜欢,也欢迎批评指正。以下原创内容欢迎网友转载,但请注明出处: https://www.cnblogs.com/helesheng
下面用一个简单实例来演示使用高层次综合器进行硬件设计的流程,带领读者以点带面的掌握Vivado HLS的设计方法。
有限冲击响应滤波器,简称FIR(Finite Impulse Response)滤波器,是数字信号处理系统中最常见的算法之一。相比无限冲激响应滤波器(IIR)滤波器而言,FIR滤波器虽然计算效能较低,但它具有以下两个明显优势:
(1)严格线性相位;
(2)冲击响应长度有限,永远稳定。
可编程逻辑器件的高并行性、计算速度快的优势,正好克服了FIR滤波器计算量大的劣势。下面以FIR滤波器的实现为例,介绍HLS的开发和优化流程。实验内容及步骤如下:
1、打开Vivado HLS(Vivado HLS是一个单独的应用程序,可以不依赖于Vivado打开),如图8.2.1所示,单击开始界面的Create New Project。
图8.2.1 新建Vivado HLS工程界面
2、如图8.2.2所示,输入新建的工程名称,指定路径,单击Next。
图8.2.2 在指定目录创建工程
3、在如图8.2.3和8.2.4所示的界面,分别添加已有的设计文件和测试脚本。(初次创建工程,可以不添加任何文件或脚本,单击Next跳过)
图8.2.3 添加已有的设计文件
图8.2.4 添加已有的测试脚本
4、在图8.2.5所示的方案配置界面中,设置默认的时钟周期为10ns,单击Part Select区域右侧的选择按钮,并在弹出的图8.2.6所示界面中筛选工程中使用的器件。返回方案配置界面,单击Finish完成新建工程。
图8.2.5 配置方案界面
图8.2.6 选择工程中使用的器件
5、右键单击工程主界面左侧的Explorer栏的Source,选择New File,新建一个fir.h文件和一个fir.c文件。
头文件内容:
1 #ifndef FIR_H_ 2 #define FIR_H_ 3 #define N 11 4 typedef int coef_t; 5 typedef int data_t; 6 typedef int acc_t; 7 void fir ( 8 data_t *y, 9 coef_t c[N+1], 10 data_t x 11 ); 12 #endif代码8.3
C语言源码:
1 #include "fir.h" 2 void fir(data_t *y,data_t x) 3 { 4 coef_t C[N] = { 53,0,-91,0,313,500,313,0,-91,0,53}; 5 data_t shift_reg[N]; 6 acc_t acc; 7 int i; 8 acc=0; 9 Shift_Accum_Loop: 10 for (i=N-1;i>=0;i--) { 11 if (i==0) { 12 shift_reg[0]=x; 13 data = x; 14 } 15 else { 16 shift_reg[i]=shift_reg[i-1]; 17 data = shift_reg[i]; 18 } 19 acc+=data*c[i];; 20 } 21 *y=acc; 22 }代码8.4
此时Vivado HLS的界面如图8.2.7所示。
图8.2.7 Vivado HLS工作界面
6、单击上图界面中的Project菜单,选择Project Setting…,在弹出的图8.2.8界面左侧选择Synthesis,并在右侧的Synthesis Setting界面中配置本工程的顶层函数为fir.c文件中的fir函数,随后单击右下角的OK按钮,确认选择。
图8.2.8 配置工程的顶层函数
7、单击工程界面上方的运行C语言综合按钮(图8.2.7所示界面上方的绿色三角形按钮),Vivado HLS将对C语言源文件进行分析和综合,产生硬件描述语言的文件输出。
8、等待Vivado HLS完成综合,综合完成后会弹出图8.2.9所示的综合报告,其中显示了未做任何优化配置情况下,图8.2.7所示的C语言源码描述的有限冲击响应滤波器所占用的可编程逻辑器件资源、时钟、设计延迟、吞吐量等详细信息。
图8.2.9 综合报告
9、右键单击Explore栏的Test Bench,新建一个测脚本文件,命名为fir_test.c(该文件是图8.1.2所示的“C测试集文件”)。其源码如下。
1 #include <stdio.h> 2 #include <math.h> 3 #include "fir.h" 4 int main () { 5 const int SAMPLES=600; 6 FILE *fp; 7 data_t signal, output; 8 coef_t taps[N] = {0,-10,-9,23,56,63,56,23,-9,-10,0,}; 9 int i, ramp_up; 10 signal = 0; 11 ramp_up = 1; 12 fp=fopen("out.dat","w"); 13 for (i=0;i<=SAMPLES;i++) { 14 if (ramp_up == 1) 15 signal = signal + 1; 16 else 17 signal = signal - 1; 18 // Execute the function with latest input 19 fir(&output,taps,signal); 20 if ((ramp_up == 1) && (signal >= 75)) 21 ramp_up = 0; 22 else if ((ramp_up == 0) && (signal <= -75)) 23 ramp_up = 1; 24 // Save the results. 25 fprintf(fp,"%i %d %d\n",i,signal,output); 26 } 27 fclose(fp); 28 printf ("Comparing against output data \n"); 29 if (system("diff -w out.dat out.gold.dat")) { 30 fprintf(stdout, "*******************************************\n"); 31 fprintf(stdout, "FAIL: Output DOES NOT match the golden output\n"); 32 fprintf(stdout, "*******************************************\n"); 33 return 1; 34 } else { 35 fprintf(stdout, "*******************************************\n"); 36 fprintf(stdout, "PASS: The output matches the golden output!\n"); 37 fprintf(stdout, "*******************************************\n"); 38 return 0; 39 } 40 }代码8.5
10、将图8.1.3中所示的“黄金参考”(即算法计算产生的标准答案)out.gold.dat文件拷贝到工程文件中。并用单击Explore栏的Test Bench,将黄金参考添加到工程中。
11、单击工程界面上方的Run C Simulation按钮,进行代码测试。根据上面的fir_test.c测试代码,若代码的运行结果与黄金参考一致,界面下方的Console窗口中将打印出PASS: The output matches the golden output! 的字样。
图8.2.10 C语言测试
12、至此为止,编写的代码所实现的算法如果功能正确,且在占用资源、设计延迟、吞吐量等方面都已经达到了设计目标,则可以导出高层次高层次综合器产生的硬件描述语言代码,以供Vivado在工程中调用该算法。
在Solution菜单中选择Export RTL,在弹出的界面如图8.2.11所示,选择最常用的生成IP方式导出,单击OK,Vivado HLS将产生可供Vivado调用的IP。界面下方的Console窗口中输出Finished export RTL时,就可以在…\solution1\impl\ip文件夹下看到生成的IP.zip文件。
图8.2.11 输出硬件描述语言RTL配置界面
[原创www.cnblogs.com/helesheng]
标签:fir,www,8.2,界面,cnblogs,单击,HLS,Vivado,com From: https://www.cnblogs.com/helesheng/p/17099882.html