本文是我在学习FPGA时学到的相关知识与总结,希望可以帮助同行理解和掌握相关的FPGA知识。可以将本文档当作相应FPGA教程文档UG902的辅助文档学习。主要内容为文档中关于接口的部分。转载请注明出处。
Xilinx原版教程文档参见Xilinx Documentation navigator 中对应UG902:Vivado Design Suite User Guide High-Level Synthesis中的Manage Interface部分。
Manage Interface
在c语言的设计中,所有的输入输出操作都直接通过函数的参数(argument)来传递;在RTL设计中这些操作的进行都必须通过具体的I/O协议来完成。
vivado HLS通过两种方法来创建相应的IO 协议
Interface Synthesis:通过标准的工业接口来实现管脚创建。
手动确定接口:可以在源码中进行描述,这可以实现任意的IO协议。
当最高层级的函数被综合时,相应的参数就会被综合为RTL管脚,这个过程叫做接口综合。
例子:
- 这个程序里面包含两个输入,in1和in2
- 指针sum,对指针指向的位置行了读和写
- 函数return和temp值
这个函数被综合为下面 图1-37这个RTL块:
vivado HLS在RTL设计中创建了三个类型的管脚
- 时钟和复位管脚ap_clk和ap_rst
- block level的接口协议,这些在图1-37中显示:ap_start、ap_done、ap_ready、ap_idle
- port level的接口协议,这些接口为顶层函数中的参数创建,in1、in2、sum_i、sum_o、sum_o_ap_vld、ap_return
时钟与复位管脚
若是设计需要大于一个时钟周期才能结束,则需要一个时钟管脚和复位管脚,添加板子enable管脚可以在Solution > Solution Settings > General and config_interface configuration. 更多相关信息在clock,reset,RTL output这一章中。我们暂不讨论。
block-level的接口协议
默认情况下,block-level的接口协议会被加入设计之中,这些信号会控制相应的block。ap_start:block可以处理数据,ap_ready:块可以接受数据 ap_idle:块空闲 ap_done:块已完成操作
port-level的接口协议
最终确认的一系列管脚是数据管脚,IO协议创建了一系列基于c语言参数的管脚。所有的IO协议如图1-39所示。port-level的IO协议用于将数据送入和送出block。
D:default
I:输入,只能read
O:输出,只能written to
IO:输入输出参数,能被read和witten。
default模式下,参数值和指针的port是简单的线连接,并不需要handshaking signal,例如上面的程序例子中输入端口就没有相应的IO协议,如果port没有IO协议,则输入数据必须保持稳定直到它被接受。
default模式下,输出的信号必须连带一个output valid signal来说明输出数据是有意义的。上面的例子中,输出的port就是连带一个output valid signal:sum_o_ap_vld。 如果没有IO协议的话,很难知道输出端口什么时候会输出数据,因此尽量要在output上运用IO协议。
如果函数有一个返回值,则ap_return就被用于提供返回值,当block-level的协议用ap_done说明函数被执行完毕,同时说明ap_return是有效的并且可以被读取。(注意,返回值不能是指针)。
可以根据图1-38理解一下相应管脚的意思。
- ap_start高位的时候,函数开始
- ap_idle低位的时候表示程序正在运行
- 输入数据会在第一个时钟之后的时钟读取,ap_ready信号在所有数据读取完之后会高位。
- 输出sum被计算出之后,output handshake : sum_o_ap_vld高位表明数据可读。
- ap_idle高位表明程序可以再次开始。
管脚综合与OpenCL
- 在综合过程中,vivado HLS会把OpenCL的API C综合为下面这些:
- 所有scalar的接口和block level的接口会被综合为单个AXI4-Lite接口
- 所有数组和指针会被综合为单个AXI4接口(关于AXI4-lite与AXI4协议有何区别)
block-level的接口协议
block-level的接口协议是ap_ctrl_none和ap_ctrl_hls和ap_ctrl_chain. 这些只能在函数和函数返回时用。即使函数没有返回值,block-level的协议依然可以被当作函数返回来用。
ap_ctrl_hs
未完 UG 902 的 P91附近