文/劉旸
現代社會對嵌入式雙核系統的需求越來越大,同時Linux的巨大優勢使得它在嵌入式領域的應用備受關注。本文中的硬件平臺采用國產CCFC9000PA(一下簡稱C9000)嵌入式微處理器和JXCSX95T(以下簡稱95T)FPGA芯片,在嵌入式Linux系統下設計并實現了CPU與FPGA之間的硬件接口以及相應的驅動程序、測試程序,完整地實現并驗證了該雙核通信接口的設計。
C9000處理器有一個外部總線控制模塊即External Bus Controlloer(EBC控制器)。CPU通過此存儲控制器與外部設備進行數據的傳輸。目前能支持的外部設備包括ROM、EPROM、SRAM、Flash等。因此CPU可以經過EBC總線控制器與95T內部的RAM進行數據傳輸。C9000與95T的硬件電路如圖1所示。
C9000通過外部總線與95T進行數據通信,即CPU發出相應的使能信號、讀寫信號以及地址信號,然后通過16位數據總線實現與FPGA內部SRAM的讀寫交互。另外,當95T有數據需要上報到C9000時,95T將產生中斷通知C9000,C9000收到此中斷后,發起對95T的讀操作。控制信號說明如表1所示。

表1:控制信號說明

圖1:C9000與95T的硬件連接

圖2:驅動主要流程

圖4:測試結果
在本系統中的軟件設計主要是Linux下的FPGA設備驅動程序。在 Linux下,設備驅動程序位于應用程序和硬件之間,為二者傳遞數據、消息等。Linux應用程序可以通過設備驅動,把硬件設備當成一個普通文件進行操作。本驅動的主要功能有:
(1)注冊FPGA設備、申請中斷等;
(2)接收并處理來自FPGA的中斷信號,然后接收FPGA發送來的數據;
(3)將CPU側的數據寫入FPGA內部RAM,即發送數據到FPGA設備。
驅動主要流程如圖2所示。
在Linux內核中,file_operations結構體是字符設備驅動的操作接口。本系統中的文件操作結構體定義如下:struct fi le_operations FPGA_fops = {

open主要用于提供驅動初始化,首先調用ioremap(addr,size)把95T的內部RAM映射到一個驅動程序可以訪問的虛擬地址上 去:fpga_base=ioremap (FPGA_PHY_START,FPGA_PHY_SIZE)。其次,在打開設備時通過request_irq(GPIO_IRQ,FPGA_ISR,0,DEV_NAME,NULL)申請95T發送來的中斷。close執行與open相反的操作。
在通過ioremap將95T內部RAM的物理地址映射成Linux虛擬地址后,驅動模塊就可以通過標準的讀寫函數訪問95T內部RAM了。讀寫函數原型如下:
unsinged int readw(void *address);
void writew(unsinged int data,void*address);
當應用程序通過read函數調用驅動中的FPGA_read時,如果FPGA設備暫無數據可供CPU讀取時,進程進入休眠。如果95T有數據需要上報C9000,95T將通過下降沿中斷通知C9000可以進行讀操作了,open函數中注冊的中斷程序FPGA_ISR會接收此中斷,完成讀操作。讀操作主要通過調用readw和copy_to_user將讀取到的數據從內核空間傳入用戶空間,完成應用層的讀操作。寫操作與讀操作類似,不再重復。
測試方案如圖3所示:測試程序使用pthread_create系統函數創建讀寫子線程,讀線程負責接收來自95T的數據;同時,寫線程向95T發送數據。如果接受和發送的數據一致,則測試通過。測試結果如圖4所示。
隨著現代半導體產業的發展,嵌入式雙核系統必將迎來廣闊的發展。本文系統地介紹了一種CPU和 FPGA雙核通信接口的設計方案,實現并驗證了數據的雙向傳輸。