本系列博客主要用于记录学习过程,如有错误欢迎指点。
芯片:xc7z020clg400-1;
开发板:小熊猫7020开发板;
开发环境:Vivado 18.3;
系统环境:Windows 11;
参考资料:小熊猫HLS文档、ug902、ug871、米联客HLS、黑金HLS等。
名字随意取,路径要记住
添加使用HLS语言编写的cpp文件,添加完成后,浏览该文件,提取Top Function文件(这里的文件名对应之后的IP名)
然后添加TestBench Files(用于测试和调用前者的CPP文件),你也可以不添加,一样可以综合打包完成
#include "stdio.h"
#include "ap_int.h"
#define CLK_FREQ 1
void hls_01_fpga_led_stream_ip(ap_int<4> &led)
{
#pragma HLS interface ap_none port=led
#pragma HLS interface ap_ctrl_none port=return
static int led_number=0;
static long cnt_reg=0;
if(cnt_reg<CLK_FREQ)cnt_reg++;
else
{
cnt_reg=0;
if(led_number<3)led_number++;
else led_number=0;
}
if(led_number==0)
{
led=0x1;
}
else if(led_number==1)
{
led=0x2;
}
else if(led_number==2)
{
led=0x4;
}
else if(led_number==3)
{
led=0x8;
}
}
选择顶部菜单栏的综合按钮(C Synthesis)默认第一个
综合完成后,如果没有问题,会自动跳转到综合报告界面,可以看到端口和资源用量。
点击菜单栏的这个图标,进行导出
弹出的对话框,默认即可
完成导出
此步骤非必须,但对后期代码实际部署有明显优点,可以通过该手段对代码进行测试。
如果说IP代码是一个功能块/函数;那个tb文件则是调用IP的主函数。
#include "stdio.h"
#include "ap_int.h"
extern void hls_01_fpga_led_stream_ip(ap_int<4> &led);
int main(void)
{
int i=0;
unsigned int tmp_print_data=0;
ap_int<4> led=7;
for(i=0;i<1000;i++)
{
hls_01_fpga_led_stream_ip(led);
tmp_print_data=led&0xf;
printf("i=%d,led=%d\r\n",i,tmp_print_data);
}
return 0;
}
然后点击该图标,进行仿真
通过查看log文件或console窗口的输出信息,判定程序是否正确运行。
一路Next,直到这里选择自己的芯片xc7z020clg400-1(这个错了,会导致IP无法正确加载,这个选择可以在软件中进行二次修改)
点击左侧的Setting(这里可以修改芯片型号)
IP——>Repository——>添加——>选择HLS工程路径
点击OK,添加完成(这里需要注意,必须是IP名称前的图标必须是黄色的才行,如果是灰色,将无法进行后续工作,请检测是否芯片不匹配。
点击OK关闭界面。
点击右侧的加号,将刚刚导入的IP进行添加
添加完成
由于我们要实现的是简单的流水灯功能,所需要的时钟信号和复位信号都由外置引脚进行提供,LED也需要参考原理图进行了配置,所以在块设计中,我们需要将所有的端口进行配置。
选中对应管脚,使用Ctrl+T快捷键,快速生成端口。
连线完成后,我们需要要块设计转换为HDL Wrapper
创建完成
点击左侧选单中的Open Elaborated Design,弹出的对话框默认OK。
弹出该页面
按照下图进行引脚配置,然后Ctrl+S保存,并命名
这里的14指的电脑CPU核心数
可以选Open Hardware Manager打开该界面,然后选择Open target,选择Auto
选择Program device烧录。