Xilinx 推出的 Vivado HLS 工具可以直接使用 C、C++或 System C 来对 Xilinx 系列的 FPGA 进行编程,从而提高抽象的层级,大大减少了使用传统 RTL 描述进行 FPGA 开发所需的时间。
Vivado HLS 的功能简单地来说就是把 C、C++ 或 SystemC 的设计转换成 RTL 实现,这样就可以在 Xilinx FPGA 或 Zynq 芯片的可编程逻辑中综合并实现,我们仍然是在进行硬件设计,只不过使用的不再是硬件描述语言。
以实现 LED 闪烁为例,通过使用 HLS 生成一个 LED 闪烁 IP,并导入到 Vivado 中验证,学习掌握使用 HLS 快速设计 IP 的方法。
- 开发环境:Windows
- 软件版本:Vivado 2017.4
- 验证平台:黑金 ZYNQ 7035
HLS 设计
- 打开 HLS,点击
Create New Project
:
- 填写工程名字,选择工程保存路径,注意不可包含中文,点击
Next
:
- 填写顶层函数名字,点击
Next
:
- 暂时不添加文件,点击
Next
:
- Clock Period 为运行时钟的周期,默认是 10ns,Clock Uncertainty 默认为时钟周期的 12.5%。点击
...
选择芯片类型:
- 我们使用的验证板卡为黑金的 ZYNQ7035 开发板,搜索选中
xc7z035fbg676
,点击OK
:
- 点击
Finsh
,工程配置完成:
- 等待工程创建完毕,如图所示:
- 添加源文件,右键
Source-->New File
:
- 在工程目录下新建
src
文件夹,创建.c
文件,文件命名和顶层函数一致:
- 在源文件中添加源代码,代码功能是实现一个 LED 的闪烁:
#include <ap_cint.h> #define DELAY 50000000 void led_ctrl(uint1 *led) { int i = 0; for(i = 0; i < DELAY; i++) { if(i < DELAY / 2) { *led = 1; } else { *led = 0; } } }
- 如下图所示:
- 点击
Run C synthesis
对代码进行综合:
- 综合完成后可以查看综合报告:
- 重点关注生成的接口信息,如图所示:
- 此次我们实现的功能相对比较简单,采用更为简单的 ap_ctrl_none 和 ap_none 协议来综合,在源代码中添加两行指令:
#pragma HLS INTERFACE ap_none port=led #pragma HLS INTERFACE ap_ctrl_none port=return
- 保存后再次进行综合:
- 综合完成后查看综合报告,端口简化了许多:
- 点击
Export RTL
导出 IP:
- 保持默认设置,点击
OK
:
- 等待导出完成:
- 在目录下可以看到导出的 IP:
- 如果在导出 RTL 时报如下错误:
- 参考解决方案:HLS 2017.4 导出 RTL 报错:ERROR: [IMPL 213-28] Failed to generate IP.
IP 验证
- 创建 Vidado 基础工程,在工程目录下创建
ip_repo
文件夹,将 HLS 创建的 IP 复制过来并解压缩:
- 在 Vivado 中导入创建的 IP,点击菜单栏
Tool-->Settings
:
- 点击
IP --> Repository
,点击右侧+
号:
- 找到 IP 存放路径,点击
Select
:
- 在弹出的界面中可以看到已经识别出来的 IP,点击
OK
:
- 创建
Block Design
,首先导入一个Utility Vector Logic
:
- 将其配置成
1
位位宽的非门:
- 导入我们创建的 IP:
- 如图连接两个 IP 并创建外部端口:
- 选择
Validate Design
验证设计,验证无误后保存设计:
- 执行
Generate Output Products
和Create HDL Wrapper
:
- 由于验证板卡时钟为差分输入,这里将
wrapper
文件稍作修改:
- 添加约束文件:
- 点击
Generate Bitstream
,对设计进行综合、实现、并生成 Bitstream 文件。
板级验证
- 将比特流文件下载到开发板中,实现效果:
参考来源
- 正点原子领航者
- 黑金 ZYNQ7035
更多内容
- CSDN博客:@Hello阿尔法
- 哔哩哔哩:@Hello阿尔法
- 知乎:@Hello阿尔法