内容速览
一、FPGA结构特点
现场可编程门阵列FPGA为用户提供了可编程和自己制造的能力,极大的缩短了设计和制造时间。它主要由以下四部分组成:
1.IOB(IO单元)
2.CLB(可编程逻辑块)
3.BRAM(存储单元)
4.DCM(数字时钟管理)
FPGA还具有以下基本特点:
1.内部有丰富的触发器和I/O引脚
2.设计周期短,开发费用低,风险小
3.提高系统集成度和可靠性
CLB的内部结构如下:
LUT查找表通常会将输出结果提前存储起来,类似于RAM,通过输入的地址位信号输出对应地址单元的内容。
二、AXI总线协议和应用
1.接口类型
AXI总线协议提供了以下三种接口
——AXI_GP
通用型接口。包括两个32位主设备接口和两个32位从设备接口。
——AXI_HP
高性能/带宽接口。主要用于PL访问PS上的存储器。
——AXI_ACP
加速器一致性端口。用来管理DMA之类的不带缓存的AXI外设。
2.总线类型
——AXI_Lite
——AXI4
——AXI_Stream
三、指令并行优化
1.pipeline
流水线调度,在不冲突的情况下尽可能的让指令并行执行,提高了程序的并行度。
2.unroll
循环展开,在单次循环中做更多的操作,可以提高程序的并行性,代价是消耗了更多的资源
before unroll:
int x;
for (x = 0; x < 100; x++)
{
delete(x);
}
after unroll循环展开4次:
int x;
for (x = 0; x < 100; x += 5 )
{
delete(x);
delete(x + 1);
delete(x + 2);
delete(x + 3);
delete(x + 4);
}
四、数据并行优化
1.array partition
数组分割,在vivado_hls中提供以下三种数组分割的方法:block按块分,cyclic交叉分,complete完全分割。
分割之后相当于使用了额外的端口,增加了资源消耗但是提高了吞吐量。
2.array map
数组映射,基本思想是将多个小数组合并为一个大数组,与数组分割思想相反,array map减少了端口的使用,当然也降低了吞吐量。数组映射可以分为水平方向和竖直方向的拼接。
——Horizontal mapping
水平方向拼接,拼接的效果如下图所示,数组的长度为两数组长度之和,宽度为最宽的数组的宽度,同时允许空隙的存在。
——Vertical mapping
纵向拼接,将数组对应位置的元素拼接,最终得到的数组长度是最长数组的长度,宽度增加。
3.array_reshape
数组重组,实现的方法就是对一个数组先进行array_partition再进行Vertical_mapping,array_partition有三种方式,那么对应的重组也就有三种方法。
4.dataflow
Dataflow针对循环产生的依赖问题进行优化,例如:Dataflow可以将三个有依赖关系的循环体拆分成多个小循环,拆分后的循环体与流水线相似具有并行性。
为了进行Dataflow做出的转换:
上图由于Loop3同时依赖于Loop1和Loop2,无法进行Dataflow,所以需要调整依赖关系并实现Dataflow。
五、其他
fifo是先进先出寄存器,主要用于数据缓冲,一般是快速设备和慢速设备接口间用。
pingpong用于慢速设备处理高速数据,里面的缓冲用fifo思想,多个fifo在宏观上看相当于将高速数据分频,然后每个低速时钟同时处理,处理完后汇集起来变成高速数据。
希望考的都是我看过的=-=