使用Vivado HLS创建一个EDK PCore

使用Vivado HLS创建一个EDK PCore,第1张

这篇文章是用来熟悉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 函数。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2577833.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-07
下一篇 2022-08-07

发表评论

登录后才能评论

评论列表(0条)

保存