今年寒假我有幸参加了Xilinx的Winter Camp,在Camp上,讲者对HLS整个开发流程做了简单的介绍。为了巩固同学们的学习,主办方特意要求我们在冬令营结束之后自己用HLS做一个项目。本着拿一个证书和提高一下自己知识水平的想法,我也自己给自己定一个选题参加了这个项目。
原本是想要开发一个MD5的硬件实现的,后来在Github上面搜了一下,发现已经有人开发过HLS的MD5算法了。不得已只能放弃。后来经Foobar院猴哥推荐LZ77压缩算法,我发现也比较合适。于是就决定在硬件上实现一个LZ77压缩算法。值得注意的是,LZ77压缩算法只是一个大概的实现模板,具体怎么实现可以根据开发者的想法任意指定规范。所以这个压缩算法中的所有规范都是我自己指定的。因此和其他的压缩软件是不通用的。
现在硬软件设计基本上都已经做得差不多了,这一路走来坑真的不少。所以我决定写一个系列来记录一下自己遇到的坑,也许会对后来的同学有帮助。如果我的文章或者代码中有什么错误,也欢迎在博客里评论、Github上开issue留言给我。
首先,大概说一下高层次综合HLS是个什么东西。通俗易懂的讲,HLS就是可以把C/C++语言转换为Verilog/VHDL/System C的一个处理过程/软件。这样对于软件开发者来说,能够比较轻松简单的开发硬件设计。当然,其中也有很多与全软件开发不完全相同的部分。这些都需要我们另行学习。
然后,简介Zynq的两大部分:PS (Processing System) 指处理系统,它是在FPGA上提前实现好的硬核ARM处理器。PL (Programming Logic) 指FPGA可编程逻辑部分,它就是真正可操纵的硬件部分。PS和PL两部分可以通过预先定义好的总线接口相互连接。
我的开发流程是这样的:先在x86体系结构的软件上实现LZ77压缩算法,经过测试通过之后,转而开始开发硬件部分。首先使用Vivado HLS软件,移植软件C代码到硬件C代码,使用Directive规定接口和优化,生成IP核;打开Vivado,使用其中的IP Integrator,将Zynq处理系统 (Zynq Processing System) 的IP核以及其他各配套IP核与HLS开发的IP核连接在一起。综合实现生成比特流,导出硬件描述文件和比特流(到此为止的代码运行在PL端);切换到Vivado SDK中进行开发,使用硬件描述文件创建Standalone软件项目,编写在PS端运行的程序以及PL与PS的交互。到这里整体的开发流程就算完毕了。
在后面的文章里,我会依次的认真介绍一下各个部分的开发流程。
LZ77硬件实现项目:https://github.com/bjrjk/HLS-LZ77
LZ77软件实现项目:https://github.com/bjrjk/LZ77-Demo
Xilinx HLS设计流程课程:https://github.com/xupgit/High-Level-Synthesis-Flow-on-Zynq-using-Vivado-HLS