zynq学习笔记
- zynq-7000簡介
?? ZYNQ-7000系列是Xilinx推出的一款全可編程片上系統(All Programmable SoC),該芯片集成了ARM Cortex A9雙核與FPGA,即PS部分和PL部分。
結構框圖如下:
?
1、PS部分
PS部分集成兩個ARM Cortex-A9處理器,AMBA互聯,外設包括USB總線接口、以太網接口、SD/SDIO接口、I2C總線接口、CAN總線接口、UART接口、GPIO等。PS部分可以完全獨立使用,不依賴PL部分。
2、PL部分
PL部分實質就是xilinx的FPGA。在ZYNQ中,我們可以把PL看成是PS的另一個具有可重配置特點的“外設”,它可以作為PS部分的一個從設備,受ARM處理器控制。也可以把PL部分看成一個不受ARM處理器控制,與ARM處理器對等的主設備,主動完成與外部芯片、接口的數據交互。更甚至PL部分也可以作為整個系統的主設備,主動從APU部分的存儲器中獲取、存儲數據,并可控制ARM處理器的運算。所以,理論上PL部分也可以像PS部分那樣獨立運行。但限制是必須使用JTAG接口對PL部分進行配置。如果沒有JTAG接口,就無法獨立運行,因為ZYNQ的PS部分和PL部分都必須依靠PS來完成芯片的初始化配置。
3、AXI總線
AXI(Advanced eXtensible Interface)是一種總線協議,該協議是ARM公司提出的AMBA(Advanced Microcontroller Bus Architecture)3.0協議中最重要的部分,是一種面向高性能、高帶寬、低延遲的片內總線。它的地址/控制和數據相位是分離的,支持不對齊的數據傳輸,同時在突發傳輸中,只需要首地址,同時分離的讀寫數據通道、并支持Outstanding傳輸訪問和亂序訪問,并更加容易進行時序收斂。AXI 是AMBA 中一個新的高性能協議。AXI 技術豐富了現有的AMBA 標準內容,滿足超高性能和復雜的片上系統(SoC)設計的需求。
在ZYNQ7000中,將FPGA和ARM集成在一個芯片內部,兩者之間的通信使用AXI_HP、AXI_GP、AXI_ACP三種接口通信,帶寬可達吉比特,基本上不會存在二者通信帶寬不足的問題。
AXI_ACP接口,是ARM多核架構下定義的一種64位高性能接口接口,理論帶寬1200MB/s,用來管理DMA之類的不帶緩存的AXI外設,PS端是Slave接口。
AXI_HP接口,是高性能/帶寬的AXI3.0標準的64位高性能接口接口,理論帶寬1200MB/s,總共有四個,PL模塊作為主設備連接。主要用于PL訪問PS上的存儲器(DDR和On-Chip RAM)
AXI_GP接口,是通用的AXI 32位低性能接口,理論帶寬600MB/S,總共有四個,包括兩個32位主設備接口和兩個32位從設備接口。
- Zynq7000啟動流程
詳細說明請參考官方文檔ug585第六章。
在Zynq上,有一塊靜態存儲區ROM,專門負責zynq剛上電時的啟動過程,這個區域稱之為boot ROM。系統上電后,根據用戶選擇的啟動方式,boot ROM讀取啟動方式寄存器內容來決定用戶設置的啟動方式。不過,只有當電源復位信號PS_POR_B和系統復位信號PS_SRST_B沒有處于復位狀態時,boot ROM才會讀取該寄存器。這里,用戶可以選擇的啟動方式包括Quad-SPI,SD卡,NAND Flash,NOR Flash和JTAG。上電自檢完成后,boot ROM會從先前選擇的啟動設備處讀取下一啟動階段會用到的啟動鏡像(fsbl鏡像),并先讀取該鏡像文件的頭部信息,然后根據這些信息對鏡像進行認證。通過認證后,就會把鏡像從Flash加載到OCM(On-Chip Memory),然后接下來的啟動過程就由FSBL控制。
在非JTAG啟動模式下,ARM將執行Boot ROM中的代碼,該部分代碼負責對NAND、NOR、Quad-SPI、SD卡與PACP的基本外設控制器進行初始化,使得ARM核可以訪問這些外設。而DDR等其他外設將在Stage 1或者之后進行初始化。處于安全考慮,在PS所有主要模塊當中,CPU總是最先啟動的。Boot ROM部分的代碼并不對PL部分做任何配置。
Boot ROM控制整個芯片的初始化過程。Boot ROM中的代碼是固化的,不可修改的,處理器在上電或者熱啟動時自動執行這部分代碼。
這個階段由FSBL(First Stage Boot Loader)負責啟動過程。Xilinx提供了FSBL代碼,我們可以通過SDK生成這部分代碼,這部分代碼可以幫我們完成了PS部分必要外設的初始化工作。當然這部分的代碼我們也可以根據自己的需要在SDK中進行修改。
FSBL主要完成以下幾項工作:
??? ? b、使用比特流文件對PL進行配置
????? c、加載SSBL或者裸跑程序到內存空間
????? d、跳轉執行SSBL或者裸跑程序
PL部分的比特流文件、SSBL/裸機程序需要封裝成特定格式的Flash分區鏡像或是SD卡啟動鏡像,因為FSBL會遍歷分區表來尋找比特流文件、SSBL/裸機程序,然后進行加載配置。
該階段是可選的。如果在ARM核上運行的是一個裸跑程序,那么該部分就可以省略了。其實,SSBL就是我們平常嵌入式系統開發中的Bootloader,主要負責將操作系統加載到內存中。
- FPGA原理
FPGA內部主要基本結構:可編程的邏輯單元、可編程的連線和可編程的IO模塊。
其基本結構某種存儲器(SRAM、FLASH等)制成的4輸入或6輸入1輸出地“真值表”加上一個D觸發器構成。任何一個4輸入1輸出組合邏輯電路,都有一張對應的“真值表”,同樣的如果用這么一個存儲器制成的4輸入1輸出地“真值表”,只需要修改其“真值表”內部值就可以等效出任意4輸入1輸出的組合邏輯。
任何的時序邏輯都可以轉換為組合邏輯和D觸發器來完成。
在這些連線上有很多用存儲器控制的鏈接點,通過改寫對應存儲器的值就可以確定哪些線是連上的而哪些線是斷開的。這就可以把很多可編程邏輯單元組合起來形成大型的邏輯電路。
布線資源連通FPGA內部的所有單元,而連線的長度和工藝決定著信號在連線上的驅動能力和傳輸速度。FPGA芯片內部有著豐富的布線資源,根據工藝、長度、寬度和分布位置的不同而劃分為4類不同的類別。第一類是全局布線資源,用于芯片內部全局時鐘和全局復位/置位的布線;第二類是長線資源,用以完成芯片 Bank間的高速信號和第二全局時鐘信號的布線;第三類是短線資源,用于完成基本邏輯單元之間的邏輯互連和布線;第四類是分布式的布線資源,用于專有時鐘、復位等控制信號線。
在實際中設計者不需要直接選擇布線資源,布局布線器可自動地根據輸入邏輯網表的拓撲結構和約束條件選擇布線資源來連通各個模塊單元。從本質上講,布線資源的使用方法和設計的結果有密切、直接的關系。
?
可編程輸入/輸出單元簡稱I/O單元,是芯片與外界電路的接口部分,完成不同電氣特性下對輸入/輸出信號的驅動與匹配要求。為了便于管理和適應多種電器標準,FPGA的IOB被劃分為若干個組(bank),每個bank的接口標準由其接口電壓VCCO決定,一個bank只能有 一種VCCO,但不同bank的VCCO可以不同。只有相同電氣標準的端口才能連接在一起,VCCO電壓相同是接口標準的基本條件。
四、開發環境
由于ZYNQ將CPU于FPGA集成在一起,開發人員既需要設計ARM的操作系統應用程序和設備驅動程序,有需要設計FPGA部分的硬件邏輯設計。開發中既要了解Linux操作系統,系統的構架,也需要搭建一個FPGA和ARM系統之間的硬件設計平臺。所以ZYNQ得開發是需要軟件人員和硬件人員協同設計的并開發,這既是ZYNQ開發中所謂的“軟硬件協同設計”。
ZYNQ系統的硬件系統和軟件系統的設計和開發需要用到以下開發環境和調試工具:
- Xilinx vivado設計套件實現FPGA部分的設計和開發,管教和時序的約束,編譯和仿真,實現RTL到比特流的設計流程。
- Xilinx SDK是xilinx軟件開發套件,在Vivado硬件系統的基礎上,系統會自動配置一些重要參數,其中包含工具和庫路徑、編譯器選項、JTAG和閃存設置,調試器連接裸機板支持包(BSP)。SDK也為所有支持的Xilinx IP硬核提供驅動程序。
- 交叉編譯工具鏈是一個由編譯器、連接器和解析器組成的綜合開發環境,交叉編譯工具鏈主要由binutils、gcc、和glibc 3個部分組成。xilinx zynq平臺的交叉編譯工具是基于GNU工具的(arm-xilinx-linux-gnueabi-gcc , arm-xilinx-linux-gnueabi-gdb)。
- FPGA的硬件調試工具有Xilinx提供的ChipScope Pro,可以在線觀察FPGA內部的信號。
?
2、交叉編譯工具鏈的安裝
?./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin ? ? ? //開始安裝,安裝路徑可以用默認路徑,為 /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux
export ARCH=arm
exportCROSS_COMPILE=arm-xilinx-linux-gnueabi-
exportPATH=/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/:$PATH
? ? ?若不想每次都輸入,就在通過gedit /etc/bash.bashrc指令打開bash.bashrc文件,在里面加入上述指令,這樣開機就會自動執行了。
3、Linux編譯
? ?將zynq_zed_defconfig文件拷貝到arch/arm/configs目錄下
?? make ARCH=arm xilinx_zynq_defconfig
?? make ARCH=arm menuconfig
?? make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- UIMAGE_LOADADDR=0x8000 uImage
?
4、u-boot編譯
?? make CROSS_COMPILE=arm-xilinx-linux-gnueabi- clean
?? make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_feima_defconfig
?? make CROSS_COMPILE=arm-xilinx-linux-gnueabi-
5、根文件系統制作
? 參考 http://blog.csdn.net/asklw/article/details/52611594
?
6、vivado使用
7、開發流程
?
總結
- 上一篇: Minecraft 从安装到入门
- 下一篇: centos 8 使用 nmcli 配置