使用Vivado HLS创建一个EDK PCore

这篇文章是用来熟悉xilinx的vivado hls (2012.2 version) 工具的使用的。
由于zedboard是arm+fgpa的架构,所以在使用的时候经常会涉及到关于fpga设计方面的知识,对于像我这样对fpga一窍不通的人来说,这是一个不可逾越的障碍(至少目前是)。有心想去了解学习一下,然后这一块的知识体系也是异常庞大的,不是短时间可以理的清楚的。要是有一个工具,能够将软件代码直接转换成硬件(hdl语言),而无需学习传统的硬件设计技术,那该多好了!这里,vivado hls 就是这样一个工具。
这里将一段c代码转换成xilinx edk 工具能够直接使用的ipcore,实现一个简单的8 bit adder.
#include basic.h
#include ap_interfaces.h //define some macros for axi bus
void basic(char a, char b, char *c) {
ap_interface_reg_axi4_lite(a, bus_a, ap_none);
ap_interface_reg_axi4_lite(b, bus_a, ap_none);
ap_interface_reg_axi4_lite(c, bus_a, ap_none);
ap_control_bus_axi(bus_a); // ap control signal to be accessed through axi-lite if
*c = a + b;
}
(1) io port
函数中有3个变量:a, b, c。 前面两个变量a,b是输入变量,所以它们作为ipcore的输入端口;c变量是输出变量,所以作为ipcore的输出端口。它们会被映射到核中的3个寄存器中。
(2) handshake signal
在这个例子中,至少需要3个控制信号:ap_start, ap_idel, ap_done。这些信号都也会被映射到核的寄存器中,用来控制核的基本操作及状态。ap_start信号用来控制pcore的开始,ap_done信号用来表示操作完成,而ap_done用来表示设备空闲状态。
(3) 中断控制
与中断相关的寄存器。 ier(intr enable reg)、isr(intr status reg)
(4) ipif and ipic
这里,通过调用ap_interface.h中的宏来实现 axi-lite接口。
// ap_interface.h - - this file contains macro declarations for autoesl interface directives
// enum of available interfaces type in autoesl
enum ap_auto_interfaces {
ap_none, ap_ack, ap_vld, ap_ovld, ap_hs, ap_ctrl_none, ap_ctrl_hs, ap_mem,ap_fifo, ap_bus
};
// gcc pre-processor directive to insert pragmas from macro code
#define str(x) #x
#define pragma_l1(x) _pragma(#x)
#define pragma(x) pragma_l1(x)
#define ap_interface (var_name, interface_type) { \
pragma (ap interface interface_type port=var_name); \
}
#defien ap_interface_reg (var_name, interface_type) { \
pragma (ap interface interface_type port=var_name register ) ; \
}
// create an axi4 lite interface at the system level layer
#define ap_bus_axi4_lite (var_name, bus_name) { \
pragma (ap resource core=axi_slave variable=var_name metadata=str(-bus_bundle bus_name)); \
}
// create standard xilinx bus interfaces
#define ap_interface_reg_axi4_lite (var_name, bus_name, interface_type) { \
ap_interface_reg (var_name, interface_type); \ //ipic
ap_bus_axi4_lite (var_name, bus_name); \ // ipif
}
// declaration of a function control bus
#define ap_control_bus_axi (bus_name) { \
pragma (ap resource core=axi_slave variable=return metadata=str(-bus_bundle bus_name)
port_map={{ap_start start} {ap_done done} {ap_idle idle} {ap_return return}} ); \
}
工具操作流程:
(1) create a new project
crate new project -> project name and location (no space allowed)-> add source file -> add test bench file
-> solution configuration ->finish.
(2) c validation
compile -> run
(3) high level synthesize
(4) design optimization
(5) implementaion (rtl export)
第一次进行这个步骤是可能出错的,也不知道是不是版本的问题。
导出是时候要进行 format selection, 主要有:
pcore for edk
system generator for dsp
ip-xact
a) 格式一,主要是将生成rtl以ipcore的形式导出,然后在edk中使用。这个实验中,我们选择的就是这种方式。对于这种格式,在导出的过程中 vivado hls 会
调用ise工具对rtl logic 进行综合,所以ise的执行路径必须加到系统环境变量中。否则会出现@e [impl-28] failed to generate ip 这样的错误。
b) 格式二,暂时没用过。
c) 格式三,主要用于eda和esl工具的使用。对于这种导出格式,vivado hsl 会调用 vivado对rtl logic进行综合,所以vivado的执行路径必须加到系统环境变量中
去。否则会出现 @e [impl-4] 'xtclsh' cannot be found. please check your path variable. 这样的错误。
这两个问题,参见官方
至此,利用vivado hls 将 c code 转换成 fpga code, 同时通过接口宏指定接口,导出后的ipcore就可以在edk与处理器集成到一起啦。
生成的ipcore 位于 ...\solutionx\impl\目录下。
同时,在pcores\ipname_version\录下的include目录包括硬件设备的 简单的low-level driver and high-level driver。当在standalone os 模式下,软件代码就可以直接使用该目录下的api 函数。

高性价比手机对比评测:小米6、一加5、荣耀9全面解析,你更看好谁?
秒罄!小米11雷军签名版销售额超1.8亿
比特币脚本的应用实例介绍
全球芯片销售均大跌 美洲销售锐减接近1/3
深度解析蔚来首款纯电轿车ET7:续航1000公里值得购买吗?
使用Vivado HLS创建一个EDK PCore
常见的几种JTAG仿真器
通过RAV4和modelS产品分析来看蔚来汽车走向
中国移动马帅:5G与Wi-Fi场景互补,快速切换使个人用户体验不打折
一文详解ZYNQ器件的启动配置方法
最保值的三款千元机:魅蓝Note5、红米4x、荣耀8青春版,你入手了哪款?
至快的差分脉冲发生器---安捷伦N2806A
新算法实现机器人系统开发,加快装配各种物体的动作序列
人工智能使大脑信号转为文本数据 脑机结合将成为可能
QAQ: 打造中国的a16z
数字隔离器和光耦合器的差异点在哪
正确认识差分晶振与普通晶振的区别
快充、安全、智能,一次解决!这对“黄金搭档”真有这么牛?
AI智能引领便利生活,家电也应有“大智慧”
更高配!e络盟上新Raspberry Pi计算机8GB RAM版