这个系列包含了我一步一步让ZYNQ从裸跑到自己的小操作系统,到Linux C,Linux Driver在到PYNQ的过程。其中涵盖了许多碎知识,包括AXI 总线、C语言内存管理、linux的移植等等,在此也对其做一个整理。
首先, ZYNQ是一个把FPGA作为ARM外设的结构(注意,ARM是主,FPGA是从,启动的时候也是先启动ARM)。其最大特点是方便了控制以及加速部分计算。众所周知,FPGA用于控制时最常用的就是有限状态机,它很高效但是对于复杂的情况开发维护都相对复杂。而软件也就是ARM重写个c就是分分钟的事情,这也是为何早起有了MicroBlaze。这时候,分工(异构) 的思想就绽放出来了,让FPGA做重复、并行的运算加速并处理一些高速接口,让ARM负责调度FPGA,进行随机性强的运算甚至重配置FPGA。由此,Xilinx把一切IP都AXI化了,其最大优势就是对于ARM总线的兼容性。可以说,不用AXI就无法发挥ZYNQ的优势,也不算真的使用ZYNQ。
当一切IP都AXI化,接入系统总线时,每个IP(设备)也就有了自己的地址,这时候关于C语言内存管理的知识就派上用场了。裸跑ZYNQ时如果你去阅读它的底层代码,你会发现他们都是结构体。那些初始化函数最大的作用就是将这些结构体指针指到具体的内存上去,这些地址都是通过从Vivado中导出的tcl文件获取并自动写入到xparameters.h文件中去的(之后你会发现这和设备树与驱动的概念非常类似)。这种结构体对应设备的方式极大地优化了代码执行效率,并提升了代码可读性。穿插在这之