两个网址:
https://www.xilinx.com/html_docs/xilinx2017_4/sdaccel_doc/jka1504034359550.html
https://blog.csdn.net/lulugay/article/details/83242633
学习sdsoc从这里开始:(重要)
注意,array_partition
pragma通过允许并行读取数组元素来增加内部循环的内存带宽。另一方面,管道编译指示执行循环的流水线操作,并允许循环的多次迭代并行运行。
Note that the array_partition
pragmas increase the memory bandwidth for the inner loop by allowing array elements to be read in parallel. The pipeline pragma on the other hand performs pipelining of the loop and allows multiple iterations of a loop to run in parallel.
关于BRAM与DRAM:https://blog.csdn.net/u014485485/article/details/78882027
结构不同:
1.BRAM是使用FPGA中的整块双口RAM资源
2.DRAM是FPGA中的查找表(LUT)拼凑出来的,要占用逻辑资源。
3.物理上看,BRAM 是单纯的存储资源,但是要一块一块的用,不像DRAM 想要多少bit都可以。
4.DRAM可以是纯组合逻辑,即给出地址马上出数据,BRAM是有时钟的。
CLB是xilinx基本逻辑单元,每个CLB包含两个slices,每个slices由4个(A,B,C,D)6输入LUT和8个寄存器组成。
如何选择:
1、较大的存储应用,建议用BRAM;零星的小RAM,一般就用DRAM。(小于或等于64bit容量的用分布式实现,深度在64~128之间的,若无额外的block可用分布式RAM。数据宽度大于16时用Block RAM)
2、dram可以是纯组合逻辑,即给出地址马上出数据,也可以加上register变成有时钟的ram。而bram一定是有时钟的。(要求异步读取就使用分布式RAM)
3、如果要产生大的FIFO或timing要求较高,就用Block RAM。否则,就可以用Distributed RAM。块RAM是比较大块的RAM,即使用了它的一小部分,那么整个Block RAM就不能再用了。所以,当你要用的RAM比较小,时序要求不高时,可以用分布式RAM,节省资源。
FPGA中的资源位置是固定的,例如BRAM就是一列一列分布的(存储器阵列),会产生较大的布线时延。在大规模FPGA中,如果用光所有的BRAM,性能一般会下降,甚至出现route不通的情况,就是这个原因。
4.用户申请存储资源,FPGA先提供Block RAM ,当Block RAM 数量不够时再用分布式RAM补充。
总结:灵活的运用B-RAM和D-RAM可以有效利用FPGA资源,提升性能。不管是什么RAM,它都是RAM,用于存储数据,可以随机访问,先用起来再去细究。
但是,我在看sdsoc例程中没有找到DRAM这个词,也是有提到ram大多都还是讲DDR
个人感觉,程序在sd卡中像是软件部分,硬件加速函数,是将sd卡的数据,提取到ddr中,一旦设置HW标记后,该函数内的申请内存,属于ddr内的内存,
下文是摘自:http://xilinx.eetrend.com/d6-xilinx/webinar/2018-02/12593.html
另外,我们是否可以不用BRAM来存储数据,用PL端的reg来储存数据,这样的话,PS端来直接操作这些寄存器,相当于只用BRAM的读写端口,特别是PS通过一些简单的指令来控制PL端的操作,还是很有用的。对应的代码操作如下图:
BRAM的PS端就是ARM对BRAM的读写,BRAM的读写就2个函数,即一个读,一个写,可以在底层库文件xbram_hw.h中找到,函数格式如下图:
5. BRAM的PS操作Bug
现象:每次Debug运行到BRAM读写函数时,发现调试的ARM直接跑飞,屡试不爽;
原因:因为BRAM数据位宽设的是32位,而此时读写字节地址不是4的倍数,最终导致CPU访问无效地址后直接跑飞。如下面的操作就会导致ARM跑飞:
XBram_Out32(XPAR_BRAM_0_BASEADDR+1, 250)。
举一反三:CPU跑飞大部分是地址访问出错,程序指令阻塞等原因,可以作为以后调试的一个经验。
ps与pl学习可以参考http://xilinx.eetrend.com/d6-xilinx/blog/2014-06/7287.html直接搜ZYNQ-7000使用总结
在这个例子中,我们只用到了PS部分,PL部分,也即FPGA部分并没有使用
直接看转载的https://blog.csdn.net/luoqindong/article/details/42968657
AXI4-Stream接口就像FIFO一样,数据传输的时候不需要地址,而是主从设备直接连续读写数据,主要用于如视频、高速AD、PCIe、DMA接口等需要高速数据传输的场合,跟Xilinx原来的Local Link协议类似。
AXI_HP接口,是高性能/带宽的AXI3.0标准的接口,总共有四个,PL模块作为主设备连接。主要用于PL访问PS上的存储器(DDR和On-Chip RAM)