之前剛開始學FPGA的時候用的是基於spartan的FPGA開發板,當上手ZYNQ后一直以為ZYNQ就是在資源上做了升級,我所要做的工作無非是把開發工具從ISE升級到VIVADO罷了,后來發現自己還是過於天真了,很多事都有存在的意思,上手之后便發現ZYNQ和之前的板子有區別。
SOC FPGA
區別就是ZYNQ除了傳統FPGA外,還把ARM核和FPGA結合在了一起,成為了內嵌處理器硬核的FPGA,即SOC FPGA,二者利用高速總線AXI4進行通信。
內部結構 PL與PS
由於它既有FPGA又有ARM,所以它同時具有ARM軟件的可編程性和FPGA 的硬件可編程性,不僅可實現重要分析與硬件加速,同時還在單個器件上高度集成 CPU、DSP、ASSP 以及混合信號功能。
從結構來看,支持FPGA的部分稱為PL(Programmable Logic),支持ARM的部分稱為PS(Processing System),如下圖所示。
可以看出PS部分有很多接口,如SPI,UART,CAN等等,這些接口的存在可以讓FPGA不用寫控制器去傳輸,節省了資源但是犧牲了速度。
工作
PL端和PS端一般通過AXI4總線通信,使用AXI4的PL模塊會有相應c驅動文件,用於PL端模塊的控制。這些驅動文件有裸機版本,也有linux版本,linux運行時,如果調用pl端模塊就使用這些驅動即可。
Zynq的啟動分三個階段。階段0是BOOTROM的固化代碼,不用管;階段1中,first stage boot loader 首先配置PS端,之后硬件比特流對PL進行配置。階段2運行用戶程序,Linux的BOOT loader在這個階段才開始運行。
ZYNQ並不能說是一個嵌入ARM核的FPGA。從它的啟動過程就可以發現,絕對是ARM主導的,因此稱它為以高性能FPGA為外設的雙核ARM或許更為合適。
那么就有一個問題Zynq可以作為獨立的ARM或者獨立的FPGA使用嗎?答案是肯定的,可以的。
首先,Zynq可以作為獨立的ARM使用是顯而易見的,因為Zynq中ARM就是主處理器,上電啟動過程也是由ARM來完成的,除了新建ARM工程時需要HDL硬件描述文件(HDL硬件描述文件的制作也很簡單),其他都一樣。
其次,Zynq作為獨立的FPGA使用其實也是可以的,首先我們可以跟使用傳統的FPGA一樣使用Vivado集成開發環境綜合編譯工程並通過JTAG接口下載bit文件。唯一的不同是在我們燒寫啟動時,我們需要把bit文件和FSBL源碼合成為一個bin文件燒寫后才能啟動,上電啟動時ARM會先運行加載FSBL程序,然后通過FSBL會加載FPGA的程序。FSBL程序是Xilinx提供的集成在SDK里的二級boot loader程序,我們在SDK集成開發環境中通過很簡單的操作就可以完成FSBL程序和bit文件的合成。
上圖中紅色框框出來的是二級boot loader程序,黃色框框出來的是FPGA程序,藍色框框出來的是ARM的用戶應用程序,如果我們把Zynq作為獨立的FPGA使用時,我們就可以刪除藍色框即ARM用戶應用程序,保留紅色框二級boot loader程序和黃色框FPGA程序即可。