本站小編為你精心準備了雙處理器通信方案的研習與策劃參考范文,愿這些范文能點燃您思維的火花,激發您的寫作靈感。歡迎深入閱讀并收藏。
目前,基于FPGA的雙處理器之間的通信按照通信方式來劃分,主要有:共享存儲器、郵箱核(mailbox)、串口通訊和DMA等四種方式。共享存儲器通信是一種兩個處理器之間的阻塞通信方式。在雙處理器系統中,可以通過共享片上RAM的方式來實現處理器之間的數據交互。為了防止死鎖的發生,需要通過設置標志位或者中斷信號的方式,實現雙處理器的異步接收或發送。同時發送進程和接收進程必須在兩個處理器上成對出現,只有當兩個處理器上的發送進程和接收進程同時到來時,兩個處理器才能共同退出當前通信進程,進入下一條指令。郵箱核主要提供了兩組互斥體,一個用于保證對共享存儲器的唯一寫訪問,另外一個用于保證對共享存儲器唯一的讀訪問。郵箱核結合片上RAM,可以實現雙處理器之間的數據交換。郵箱核加片上RAM的組合方式,適合于雙處理器之間的單向傳輸數據,具有實時性好,速度快的優點,但是對于通信的數據結構有一些要求。串口通訊在雙處理器之間的數據交換主要是通過串口通信設備完成的。將系統中的處理器分為主設備和從設備,當主設備要讀取從設備數據時,就向從設備發送一個讀取的指令,從設備接收到指令后將數據發送到主設備中。主設備向從設備寫入數據過程也是如此。這種通信方式,對于軟件程序方面依賴性較小,但是傳輸模式單一,存在一定的延時。DMA方式主要是用于數據量比較大的情況下,通過對數據整塊的處理,能夠有效的縮減數據通信占用處理器的時間。
互聯模塊概要設計
通過對以上雙處理器之間通信方式的優缺點分析,結合本系統通信的特點,設計出符合本系統的FIFO互聯模塊。在該系統中,使用的是定制IP核的方式來設計該模塊,在IP核中設計相關的寄存器,設計出相關的讀寫控制邏輯。該IP核的設計主要分為以下幾個方面。第一是對于系統的非實時部分而言,要在操作系統的層次上,讀取FIFO緩沖區數據和將數據寫入FIFO緩沖區,保證數據的讀取和寫入正常。在操作系統中編寫該FIFO緩沖區設備的驅動,在驅動中判斷該設備的讀寫狀態。第二是對系統的實時部分而言,要在規定的時間內,將數據從該FIFO緩沖區中讀取,同時將反饋數據在規定的時間內寫入到FIFO緩沖區中。通過對該IP核中定義的控制寄存器的讀取,實時的判斷該FIFO設備的狀態,保證及時的讀取或寫入數據。第三就是要實現對該FIFO緩沖區的互斥訪問,保證每次讀取或者寫入的數據都是完整的,確保數據的準確。通過對緩沖區的大小進行設定,當讀或者寫完成時,設置控制寄存器中相應的標志位,達到互斥訪問的目的。
詳細設計
1IP核的設計
該IP核主要的功能一是對寫入的數據進行緩沖,二是對輸入的數據進行分隔,保證每次讀寫的數據都是完整的一幀。該IP核在QuartusII環境中頂層模塊如圖2所示。該FIFO的緩沖區大小為128位,寬度為32。使用了一個讀指針READ_POINTER和一個寫指針WRITE_POINTER來控制CPU對該緩沖區的讀寫,讀寫指針大小都設置為2。該FIFO的讀寫數據模型如圖3所示。當對該緩沖區進行讀或者寫操作時,相應的指針發生變化。當讀或寫指針達到一定的條件時,就設置相關寄存器的狀態。當從該緩沖區中讀取數據完成時,就將READ_DONE置1,同時將READ_ENABLE置0,將WRITE_ENABLE置1,從而完成讀操作,保證讀取數據的完整性。同理,當寫數據完成了,將WRITE_DONE置1,同時將READ_ENABLE置1,將WRITE_ENABLE置0,完成寫操作。這樣就可以控制CPU對緩沖區的讀寫,保證數據的唯一性。
可以看出通過對讀寫標志位的判斷,可以達到對該FIFO狀態的判斷,從而控制讀寫數據的時機。整個狀態的判斷和控制是通過控制寄存器(CONTROL_REG)來實現的,在控制寄存器中判斷FIFO可讀或者可寫狀態是由CONTROL_REG[7:6]來控制的,而向FIFO中每次寫入或讀取數據的大小是由CONTROL_REG[1:0]來控制的,系統可以隨時讀取該寄存器來確定FIFO的讀寫狀況。該IP核的控制寄存器結構如圖4所示。在QuartusII下進行功能仿真如圖5所示。從圖5中可以看出,IP核復位后,FIFO的狀態是可寫的。此時,讀取寄存器的狀態位0x80,表明該FIFO是可寫的。將0x2寫入到控制寄存器(CONTROL_REG[1:0])中,就確定了FIFO中每幀的大小。讀取寄存器,為0x82,表明數據已經寫入到控制寄存器中。然后向FIFO中寫入數據0x12345678和0x87654321后,可以看到WRITE_DONE置1,READ_ENABLE被置1,WRITE_ENABLE被置0,同時寫指針WRITE_POINTER也是正確的,此時讀取寄存器,為0x42,表明寫操作完成,數據可讀。在后面對FIFO進行讀操作可以看出,各個標志位和讀寫指針都是正確的,可以看到讀出的數據為0x87654321和0x12345678。此時,讀取寄存器中數據,為0x82,表明數據可寫。
2FIFO的驅動的設計
在實時部分和非實時部分之間通過FIFO傳遞數據,非實時部分運行的是µClinux操作系統,需要對FIFO編寫驅動。在µClinux下開發FIFO設備的驅動和常規Linux下開發驅動流程一樣。在Linux系統中,設備的驅動程序被組織為一組完全不同任務的函數的集合,通過這些函數使得設備操作猶如文件一般。在應用程序看來,硬件設備只是一個設備文件,應用程序可以像操作普通文件一樣對硬件進行操作。如open()、close()、read()、write()等等。Linux主要將設備分為兩類:字符設備和塊設備。字符設備是指設備發送和接收數據以字符的形式進行;而塊設備則以整個數據緩沖區的形式進行。本文中FIFO設備屬于字符設備,其設備驅動主要定義一下幾個函數初始化完成后,對設備的讀寫主要是通過調用write_data()和read_data()來實現的。µClinux針對無MMU的處理器做了移植,與Linux使用虛擬內存不同,µClinux采用真實地址方式,這樣操作硬件設備非常方便。SOPC系統把存儲設備,IO映射為統一編制的存儲設備。
自定義IP核在雙處理器中應用
1雙處理器平臺的搭建
根據設計的需要,構建一個完整的SOPC系統后,才能真正實現雙處理器的設計。在SOPCBuilder中加入CPU1和CPU2,一個Timer,定制的FIFO組件以及sdram、flash、JTAG等外圍設備。其中非實時部分的CPU1選擇NIOSII/f,復位向量設置為flash,異常向量設置為sdram。另外連接CPU1的Timer要選擇全功能型(Full-featured),并將該Timer的優先級設置為0。而實時部分的CPU2也要選擇NIOSII/f,復位向量設置為flash,異常向量設置為sdram。
2自定義IP核功能驗證
將定制的IP組件添加入到系統中,在CPU1上運行µClinux操作系統,CPU2的程序是在NIOSIIIDE環境下運行。在CPU1上運行的程序首先使用函數open()打開該FIFO設備,然后通過讀函數read()和寫函數write()區讀寫數據,從而實現CPU1讀取和發送數據。而在NIOSIIIDE環境下,使用查詢方式,來讀取該定制FIFO數據,使用函數IORD()存器CONTROL_REG的狀態,如果為可讀的,則執行讀操作,如果為不可讀,則什么都不執行。寫數據也是如此。經過驗證,數據都能按時按序到達,該IP核很好的滿足了設計的需要。
結束語
本文提出的設計,是在傳統的雙處理器通信技術的基礎上,對傳統雙處理器通信技術流程進行改進。針對不同的業務邏輯,提出不同的解決方案。所設計的IP核很好的滿足了實時系統和非實時系統之間的通信需要。整個系統的設計體現了自頂向下的模塊化設計思想,同時還充分利用了SOPC技術的優勢,具有很好的可擴展性和易裁剪性,具有較好的應用前景。
作者:朱偉偉彭建朝 代俊鋒 單位:北 京工業大 學計算機學院北京首科凱 奇電 氣技術有限公司