赫忠天,曾慶立,芮天喆
(吉首大學 通信與電子工程學院,湖南吉首,416000)
目前FPGA 器件具有的并發處理數據的顯著優勢,而且功耗低,可用于實時處理視頻圖像數據.但是有外設控制能力不足的缺陷。本文介紹了Xilinx 公司推出的ZYNQ 高性能芯片[1],并指出了ZYNQ 系列芯片采用了ARM 處理器和FPGA 邏輯資源的高效結合,以及處理器與FPGA 之間通過高速的AXI 總線互聯的特性[2~3]。這些特點能夠最大化處理速度、控制能力和傳輸速率,并且通過Xilinx 官方的PetaLinux 工具可以更方便地移植Linux 系統,FPGA 也可以在Linux 系統中作為可編程外設使用。ZYNQ 在單芯片內實現了ARM+FPGA 架構,為應用和設計帶來了諸多方便和優點。
綜上所述,ZYNQ 高性能芯片具有強大的處理能力和靈活的可編程性,是應用和設計的理想選擇。對于設計人員來說,了解ZYNQ 芯片的架構和特性,并掌握ARM 處理器和FPGA 之間的數據連通技術,將有助于更好地利用ZYNQ 芯片的潛力,實現高效的系統設計。ZYNQ 面臨著有開發人員要求高,開發成本高的缺點。
ARM 和FPGA 交互有三種接口,分別是GP,HP,ACP,這三個接口都是PS 端的接口[3]。而PS 與PL 最主要的連接方式則是一組AXI 接口。AXI 互聯接口作為MPSOC PS 和PL 之間的橋梁,能夠使兩者協同工作,進而形成一個完整的、高度集成的系統。在邏輯環境下,控制PL 端資源,需要通過硬件資源與參考的庫文件,操作寄存器來實現,需要較多的知識儲備和對AXI 的理解。如果把PL 資源映射為Linux下的一個設備,方便用戶的控制。本文嘗試將在ARM 端移植Linux[4~5],并通過編寫設備樹與驅動文件,將PL 的PWM 邏輯塊映射為塊設備,有較大的靈活性。
ZYNQ 是由賽靈思公司推出的新一代可拓展平臺,采用異構架構,同時擁有ARM 端處理器的軟件可編程性與FPGA 端的硬件可編程性,并且雙核通過AXI 高速接口相連接,具備高效的系統性能與可擴展性。根據官方的信息,可以看到ZYNQ 可以大致分為三個系列,低端的7000 系列,中端的MPSoC 系列,高端的RFSoc 系列。
Zynq UltraScale+MPSoC 屬于ZYNQ 的中端系類產品,主要針對控制、網絡和圖形這幾大領域,基于ZynqMPSoC的硬件系統在視頻監視、物聯網、工廠自動化等領域有廣泛應用,既能利用FPGA 的邏輯資源實現數據的高速并行處理,又能利用ARM 移植操作系統帶來的控制便利性與拓展性。Zynq MPSoC 在單個芯片上集成了四核Arm Cortex-A53 芯片與賽靈思可編程邏輯資源,采用這種交互式協同工作的方式具有顯著優勢。其中一個優勢是它可以大大縮小嵌入式系統的體積,同時提供適當的性能功耗比和功能安全性。這種方式可以增強系統的性能,方便嵌入式系統的設計。另一個優勢是它可以提高系統的功能安全性。通過多個處理單元或處理器的協作,系統可以更加可靠地進行操作,從而增強系統的性能和可靠性。
由圖1 可知,在Vivado 下采用Block Design 的方式,連接IP 核,其中PWM 為Verilog 的IP 核,ZYNQ 為ARM 端,Processor System Reset 為復位控制模塊,AXI Interconnect為官方IP 核,通過AXI 協議實現ARM 與FPGA 的數據傳輸。生成硬件資源后,輸出xsa 文件。

圖1 系統原理框圖
PWM 在嵌入式設備中使用很多,常用于控制電機、控制振動器件、調節背光、呼吸燈等等??梢酝ㄟ^調節脈沖的占空比來調節 LED 的亮度。
通過編寫Verilog 代碼,并把它封裝成IP 核的形式方便調用??刂芇WM 輸出有兩個關鍵參數,一是頻率,二是占空比。自定義IP 可以理解為配置FPGA 的寄存器資源變成我們想要的設備,添加IP 后,我們就可以像操作ARM 資源一樣,通過操作寄存器來操作FPGA 的資源。框圖連接完成后,點擊Assign Address 實現地址的分配。

圖2 PWM 配置模塊

圖3 ZYNQ 硬核
通過配置嵌入式最小系統生成需要的硬件環境,最小系統有兩個要求,第一它是以PS 端為主,是使系統正常工作的最小條件;第二它為其他系統建立起基礎。ZYNQ 硬核的架構圖通過圖形界面配置,連接時鐘與信號后,設置自動連接,并點擊Validate Design 驗證連接圖。通過該圖形界面,配置PS 端口的DDR、串口、時鐘等模塊。
PetaLinux 操作系統是Xilinx 公司推出的全功能嵌入式Linux 操作系統,將針對ZYNQ 定制的u-boot 源碼、Linux內核源碼以及開發板相應的硬件平臺配置,集成到一個對應的開發包,方便開發人員生成、配置、編譯及自定義 Linux系統。PetaLinux 根據嵌入式開發的需求采用板級支持包,并且PetaLinux 包含部分常用IP 核的驅動程序,方便用戶移植,減少驅動編寫的工作量。通過PetaLinux 與Xilinx硬件設計工具Vivado 協同工作,幫助開發者簡化了ZYNQ移植Linux 系統的開發工作。
虛擬機安裝PetaLinux 環境。利用Xilinx 公司的Vivado 軟件進行FPGA 開發,然后使用PetaLinux 軟件構建與硬件平臺適配的嵌入式Linux 系統,最終將驅動軟件及應用程序導入嵌入式Linux 系統中。此外,通過配置zynq_altk_defconfig 文件與makefile 等文件來增加驅動模塊。
ZYNQ 中MPSoC 系列的嵌入式軟件棧??梢砸評boot作為分界線,uboot 之前的與硬件的關系比較密切,我們借助PetaLinux 工具進行配置。先使ZYNQ UltraScale+MPSoC 上電,開始由BootROM 對ZYNQ 進行初始化啟動,進而加載fsbl 到OCM 用于啟動fsbl;fsbl 之后加載PMU Firmware,進而加載ARM Trusted Firmware 用于配置DDR,之后將uboot 加載到DDR 以啟動uboot。Uboot 配置與Linux 內核與硬件平臺關系不大,可以參考類似的設計,采用uboot 來加載Linux 系統鏡像文件到DDR 成功啟動Linux。
PetaLinux 的設計流程:通過Vivado 創建硬件平臺,得到xsa 文件。
通過xsa 硬件配置文件獲取fsbl、uboot、內核等的配置信息。使用Petalinux 開發工具,根據xsa 文件自動分析ZYNQ MPSoC PS 端的配置,從而自動配置uboot 和linux 內核,相當于自動移植了uboot 和linux 內核。
Uboot 介紹:這是一個常用的開源bootloader。在系統啟動過程中,bootloader 是一個重要的組成部分。它在操作系統運行之前執行,通過初始化硬件設備,建立內存空間的映射表,為操作系統內核做好準備。Uboot 是一款廣泛使用的bootloader,支持多種處理器架構。它的主要功能是將Linux 內核從閃存(如SD 卡、eMMC、NAND 和NOR FLASH 等)中復制到DDR 內存中,初始化和配置硬件設備,然后啟動Linux 內核。這使得Uboot 成為開發嵌入式系統的關鍵組成部分,可以在各種不同的硬件平臺上運行。在啟動過程中,Uboot 首先會初始化外設(如DDR、串口、網卡等),然后通過讀取閃存中的配置文件,將Linux 內核加載到DDR 中,并將控制權交給Linux 內核。在此過程中,Uboot 還提供了一些有用的功能,例如通過網絡或串口進行遠程調試和更新固件。
Bootloader 不僅依賴于CPU 的體系結構,而且依賴于嵌入式系統板級設備的配置。這意味著即使兩個不同的嵌入式開發板使用相同的處理器,要想讓在一個板子上運行的bootloader 也能在另一個板子上運行,通常需要修改bootloader 的源代碼以適應不同的硬件環境。因此,由于嵌入式系統中存在大量的不同的硬件平臺和處理器架構,建立通用的bootloader 幾乎是不可能的。每個嵌入式系統都需要定制的bootloader 來確保正確的初始化和配置硬件設備,并啟動操作系統內核。
總之,bootloader 是嵌入式系統中重要的組成部分,它確保了正確地初始化和配置硬件設備,并為操作系統內核做好準備。但由于嵌入式系統中存在大量的不同的硬件平臺和處理器架構,建立通用的bootloader 幾乎是不可能的。每個嵌入式系統都需要特定的bootloader 來滿足不同的硬件環境和要求。
ps 端的基本配置使用設備樹來描述,pl 作為ps 的外設,也是作為設備樹中的一部分。通過打開 system-user.dtsi文件,在根節點中添加pwm 的節點。配置compatible 節點兼容性與物理地址。設備樹devicetree,也稱作Open Firmware(OF)或FlattenedDevice Tree(FDT)。本質上是一個字節碼格式的數據結構,其中包含信息在內核啟動時非常有用。bootloader 在跳到內核入口點之前將這一組數據復制到RAM 中的已知地址。
設備樹的嚴格的規范,卻沒有規定哪些內容可以放置其中以及放置的位置。內核可以搜索設備樹中的任意路徑和參數。程序員來決定哪些配置作為參數放進設備樹里,以及放置在什么地方。采取標準的樹結構,則可用一套方便的APl來操作。例如,約定好如何定義總線上的外設,那么API 可以獲取到驅動所需的基本信息:地址、中斷和自定義變量。后面會介紹更多。對于我們大多數人來說,我們用設備樹來向內核描述對硬件的添加或刪除操作,作為響應,內核就可以加載或卸載相應的驅動。硬件的特殊信息也可以通過設備樹來向內核傳達。
本文討論了硬件設備的分類以及它們在內核中的驅動編寫和維護的問題。標準設備的驅動可以參考類似設計,作為主內核源碼樹的一部分。與此同時,更多的非標準設備的驅動不屬于內核子系統,并且通常使用內核內部函數和宏,這增加了驅動的編寫和維護的復雜性,并且這些驅動不能進入主內核源碼。為了解決這個問題,提出了用戶空間I/O 框架(Userspace I/O framework)。
用戶空間I/O 框架采用用戶態驅動和uio 機制來實現FPGA 驅動的控制。用戶空間I/O 框架通過將設備的控制流程從內核轉移到用戶空間,實現了驅動的解耦和靈活性,減少了驅動編寫和維護的復雜性,并且可以將這些驅動加入到主內核源碼中。這種方法的一個優點是可以利用用戶空間庫和工具,例如C 和C++庫和調試工具。另一個優點是可以利用現有的用戶空間應用程序和框架,例如網絡協議棧和文件系統。
總之,用戶空間I/O 框架是一個解決驅動編寫和維護的復雜性問題的創新方法。它可以通過將設備的控制流程從內核轉移到用戶空間,實現驅動的解耦和靈活性,并且可以將這些驅動加入到主內核源碼中。這種方法不僅可以利用用戶空間庫和工具,還可以利用現有的用戶空間應用程序和框架。
使用 PetaLinux 新建名為“ax-pwm”的驅動程序,編寫ax-pwm.c 代碼。完成編寫后執行PetaLinux-config-c rootfs 命令選上新增的驅動程序。本PWM 驅動按照字符設備編寫,使用結構體alinx_char_dev,設置該字符設備號、設備地址與映射的虛擬地址。驅動完成后,可以通過操作/dev/ax-pwm 控制該驅動。pwm 的處理也很簡單,從設備樹中獲取地址,然后在操作函數中操作地址。也可在Vitis 中采用交叉編譯環境,生成Linux 下可執行的elf 文件來測試。
本文涉及了ARM 和FPGA 之間的互聯以及使用AXI總線來傳輸數據和外設控制數據的內容。在這種互聯中,FPGA被視為ARM的外設,需要通過AXI總線進行數據交互。為了完成這種交互,需要驅動兩者之間的總線。由于嵌入式軟件功能通常在Linux 系統上進行開發,因此AXI 總線的驅動軟件開發需要遵循Linux 驅動框架。
總之,ARM 和FPGA 的互聯非常重要,AXI 總線是實現這種互聯的關鍵。對于嵌入式軟件開發人員來說,熟悉Linux 驅動框架是必要的,因為這可以幫助他們開發出符合標準的AXI 總線驅動程序,從而實現ARM 和FPGA 之間的數據交互。
本次設計使用的仿真工具為Vivado 自帶仿真器Simulate,通過編寫Testbench 文件仿真。在仿真文件中提供25MHz 時鐘信號,采用狀態機的方式,周期性的讓占空比在最小值最大值之間變化。圖4 為信號的變化圖。通過圖中波形可發現,占空比隨著時鐘周期變換,仿真結果表明,該PWM 控制器邏輯功能正確,符合本次設計要求。

圖4 PWM 波形仿真
本文提到了利用Xilinx 公司的Vivado 軟件完成FPGA側的開發并導出硬件平臺文件,然后使用PetaLinux 軟件構建與硬件平臺適配的嵌入式Linux 系統,最終將驅動軟件及應用程序導入嵌入式Linux 系統中,以完成嵌入式設備的開發。最后,需要重新給設備加電以使其生效。
在這個過程中,FPGA 的開發需要使用Xilinx 公司的Vivado 軟件進行。Vivado 提供了許多工具和資源,可以幫助設計師完成從電路設計到綜合和驗證的各個步驟。在開發完成后,需要將硬件平臺文件導出,以便在PetaLinux 中使用。
PetaLinux 是一個嵌入式Linux 系統開發工具,可以根據硬件平臺文件構建與硬件平臺適配的嵌入式Linux 系統。使用PetaLinux 可以簡化Linux 系統的開發和調試,同時提高開發效率。完成系統移植后,需要將驅動軟件及應用程序導入嵌入式Linux 系統中。這可以通過文件傳輸協議(FTP)或者其他通信方式實現。在將驅動軟件和應用程序導入系統之前,需要確保它們與硬件平臺和嵌入式Linux 系統的適配性。
最后,在完成上述操作后需要重新給設備加電,以使其生效。這個步驟非常重要,因為只有重新加電才能使設備正確地加載并運行新的軟件和驅動程序。在QT 中編寫測試代碼,使得PL 端占空比不斷改變,操作/dev/ax_pwm 模塊,可以觀察到PL 端的LED 呼吸燈閃爍。
BOOT.BIN 的文件由fsbl、uboot、設備樹文件、linux內核、根文件系統與PL 端的system.bit 組成。System.bit 為FPGA 配置文件,在啟動的第二階段FSBL 中,由BootROM 引導加載到片上RAM,配置FPGA。PeteLinux根據xsa 文件可以配置并生成設備樹文件,在/device-tree目錄,其中pl.dtsi 為部分IP 核的設備樹文件,systemuser.dtsi 是我們根據需要修改的用戶文件。
本文首先對比分析MPSoC 裸機硬件平臺ZYNQ 的優缺點,提出一種在Linux 下將FPGA 端作為可編程外設的方法。經過測試,驗證了MPSoC 硬件平臺Linux 控制FPGA 端可行,并將映射到ARM 端的dev 設備。本方案的成功實現對后續ZYNQ 設計具有一定的指導意義,同時,對其他系統高性能、高實時的嵌入式應用具有一定的參考價值。