基于FPGA处理器的C编译指令

FPGA/ASIC技术

190人已加入

描述

通常基于传统处理器的C是串行执行,本文介绍Xilinx Vivado-HLS基于FPGA与传统处理器对C编译比较,差别。对传统软件工程师看来C是串行执行,本文将有助于软件工程师理解Vviado-HLS基于Xilinx FPGA对C的解析,综合原理。

1. Vivado-HLS FPGA并行与处理器架构
与处理器架构相比,FPGA结构具有更高的并行。Vivado-HLS对软件C程序编译时与处理器编译是不一样的执行机制。

2. Vivado-HLS FPGA与处理器程序指令执行
对于处理器, 程序执行以顺序指令, 如GCC,它将C/C++算法转换成assembly语言。

c = a + b

处理器将其转换成assembly代码如下:
LD a, $R1
LD b, $R2
ADD $R1, $R2, $R3
ST $R3 c

由此可见,对处理器简单的加法运算,都将需多个assembly指令集来完成。如下图所示分别是基于处理器的单一,及多指令执行单元。

上述c = a + b运算处理latency受限于数据a,b所存放的位置,如DDR,还是hard drive。

C语言

 

Vivado-HLS编译器是被用于将软件C/C++转换成RTL,由于FPGA是完全并行处理,转换不受限于指令的cache及内存空间。

如上例c = a + b, Vivado-HLS将其综合成一些LUT来实现。

Vivado-HLS面向FPGA编译指令处理如下图所示,为完全并行。

C语言

 

下面看多个运算的例子:
A[i] = B[i] * C[i];
D[i] = B[i] * E[i];
F[i] = A[i] * D[i];

对处理器将使用如下纯串行执行。因为数组 A, B, C, D, E, F被存在一个单一存储空间,所以每次只能操作一个数据。

然而,对Vivao-HLS检测到这些存储并且对每个数组生成了独立的memory bank, 从而使得对数组B, C的操作可以同时并行进行。

C语言

 

对Vivado-HLS FPGA将默认使用如下方式执行

C语言

下面再看对loop运算。
for (i=0; i<10; i++)
{
A = A + B[i] * C[i];
}

处理器对loop iteration的scheduling如下图所示。 串行实现,第一次loop iteration结束才开始第二次loop iteration。

C语言

 

Vivado-HLS基于FPGA对loop iteration的scheduling如下图所示。 不受限于第一次loop iteration结束才开始第二次loop iteration。从而可以并行实现II=1。在第一次loop的运算结束后就可以开始第二次loop的运算。

C语言

 

当然有时为了更小的FPGA资源,Vivado-HLS也可以综合成与处理器类似的串行实现结构。总结如下表所示。

C语言

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分