李漢青
(徐州科亞機電有限公司 江蘇省徐州市 221700)
串行通信是通信雙方使用一條信號線對二進制位進行傳輸的一種通信方法。串行通信作為一種靈活、方便、可靠的通信技術,長期以來被廣泛應用在信息技術及工業控制領域。串行通信要求通信雙方遵守相同的串口協議。一般來講,串行通信方式一次只能實現兩個設備之間的點對點傳輸,若需要局部端的多個設備和主機端的一個設備進行通信則需要主機端的設備依次和局部端的設備連接實現,通常使用專用的器件來實現該需求,但由于串行通信標準多,靈活性大,就目前而言,還不能夠提供將局部端多路串行數據合成一路發送給主機端,將主機端的一路高速串行數據分解成多路并自動發給局部端指定設備的收發器件。為此,本文介紹一種基于FPGA 的一對多路的串行通信方法及系統。
整個系統要實現的功能是將局部端的多路數據,一般是多個功能模塊采集的數據在本地端進行處理,將這些數據合并成一路數據,通過一路高速串行通信借口發送到主機端。同時,主機端的數據,通過高速串行通信接口發送到本地端,本地端對接收到的數據進行分析、處理,并將數據發送給主機指定的各個模塊中。這樣就實現了一路對多路的雙向通信。
本文所介紹的系統是實現的1 路對8 路的系統。在設計中,本地端負責處理8 個模塊和主機端的數據,8 個模塊和主機端都是串行通信接口,因此,本地端需要9 個UART,其中8 個和多路的模塊通信,1 個和主機通信。對于通用的MCU 芯片,一般外設有2對UART,要實現9 個或更多的UART,MCU 無能為力。不過,這樣的需求可以在FPGA 上輕松實現,理論上,只要FPGA 的資源充足,可以實現足夠多的UART 和其他外設。本文所介紹的設計中采用ALTERA 公司的EP3C10 器件,可以使用Quartus II 開發軟件包。Quartus II 還包含一個SOPCBulid 設計平臺,用戶可以在該平臺上設計自定義的NIOS II 嵌入式軟核處理器。通過SOPCBuild 的設置,可以在EP3C10 上實現一個有9 個UARTR 外設的軟核處理器,正好滿足一對多的通信需求。
前文中描述了實現一對多通信中多個UART 的總體思想。本部分描述如何在基于FPGA 的NIOS ii 軟核上進行數據的處理及轉發。
圖1 是要在FPGA 上實現的系統組成圖。該系統包括兩種端口,主機端端口和局部端端口。主機端端口包括主機端接收器、主機端發送器、主機端接收緩存、主機端發送緩存,主機端數據處理控制單元、主機數據處理單元、主機端發送控制單元。局部端端口包括8 個局部端接收器、8 個局部端發送器、8 個局部端接收緩存、8 個局部端發送緩存、局部端數據處理控制單元、局部數據處理單元、局部端發送控制單元。主機端端口和局部端端口的接收器、發送器由NIOS ii 的UART 外設實現,主機端和局部端的接收緩存、發送緩存由NIOS ii 的FIFO 實現,主機端和局部端的處理單元由基于NIOS II 的C 代碼實現。

圖1:系統組成圖

圖2:單路信號流示意圖
接收器和發送器用來收發數據,接收緩存用來暫時存放收到的還未處理的數據,發送緩存用來存放處理好將要發送的數據。接收緩存和發送緩存的大小要結合數據傳輸速率、FPGA 邏輯單元的資源合理設置。局部端數據處理控制單元作用是將接收的數據放到各自對應的接收緩存中,并監測各個接收緩存中的數據量,達到一定數量時,將數據轉給局部數據處理單元。局部數據處理單元按照和主機約定的協議打包,并將數據存放到主機發送緩存中。主機端發送控制單元監測主機發送緩存中的數據,當數量達到某個值時就將數據寫入主機端發送器,數據便通過發送器傳輸到主機端。主機根據協議可以確認接收到的數據來自哪個局部端的模塊。系統和主機的連接可根據傳輸的距離選擇合適的串行通信方式,比如RS232、RS485 或CAN 等方式。

圖3:系統工作流程
同樣的,主機端數據處理控制單元負責將主機發過來的數據放入主機端緩存中,監測其中的數據量,達到一定量的時候交由主機數據處理單元對接收的數據進行解析,根據協議對數據進行分類,確認收到的數據是哪個局部端端口的,并將數據寫入對應端口的發送緩存中。局部端發送控制單元監測發送緩存中的數據,達到一定量時寫入對應的發送器。中。局部端的收發器對應分散在不同地方的多個數據采集控制模塊,系統和各個局部端模塊的連接也可以使用多種串行通信方式。
在這種通信方式下,系統和主機間的協議保證了數據轉發的可靠性。局部端數據發給主機前的打包中需要包含包頭、長度、通道標識等信息。主機通過通道標識來確認數據是來自于局部端的哪個設備。同樣的,主機接收緩存中的數據也是包含了通道標識的數據包,主機數據處理單元在解析的時候根據通道標識,將解析好的數據寫入對應的局部發送緩存中。
局部端發送控制單元和主機端發送控制單元既監測發送緩存中的數據量,同時監測發送器狀態,只有在數據量達到設定值同時發送器空閑時才將數據傳給發送器,向外發送數據。
在主機端和局部端同時工作時就實現了數據的雙向通信。
以下結合圖2 單路信號流示意圖、圖3 系統工作流程圖來描述系統工作的過程。主機接收器或局部接收器對相應的主機端接口和局部端接口進行監測,監測接口是否有數據,沒有數據時則繼續監測。當局部端接口或主機端接口有數據的時候,接收數據,并將接收的數據傳送到主機接收緩存或局部端接口對應的緩存中,由局部數據處理控制單元或主機數據處理單元監測局部接收緩存和主機接收緩存中的數據量是否達到設定值,若沒達到設定值,主機接收緩存和局部接收緩存繼續接收數據。當數據量達到設定值時,將局部接收緩存或主機接收緩存中的數據傳送至局部數據處理單元或主機數據處理單元,并由局部數據處理單元或主機數據處理單元對數據進行處理,并將處理的數據發送至主機大宋緩存或局部發送緩存中。同時,主機數據發送控制單元或局部數據發送控制單元監測主機發送緩存或局部發送緩存中是否有接收到的數據,若沒有接收到數據則繼續監測。當監測到有數據時,由局部數據處理單元或主機數據處理大怒眼控制主機發送緩存或局部發送緩存中的數據發送至主機發送器或局部發送器,然后由局部數據發送控制單元或主機數據發送控制單元將主機發送器或局部發送器接收的數據發送到主機端接口或局部端接口,并通過主機端接口或著局部端接口將數據傳送至微處理器進行處理。當局部端的多個局部接收器同時有數據接收時,微處理器控制多個設備的數據將以中斷方式分別寫入各自對用的局部接收緩存中,而局部數據處理控制單元或主機數據處理控制單元將不剪短的對局部接收緩存或主機接收緩存中的數據量進行查詢和計算,若某個或多個局部接收緩存或主機緩存中的數據量達到設定值時(可根據緩存大小和傳輸速率設置為10bytes 左右)。此時需要啟動局部端和主機端的通信協議,在數據前加上包頭、長度、和通道標識等信息,完成打包,然后將該完整的數據包發送至主機發送緩存或局部發送緩存中。
由于局部端有多條數據傳輸通道,這些通道的數據都要發送到主機發送緩存中,因此主機發送緩存的空間應該盡量大一些,可以容納多個局部端通道發送的數據。主機端的主機發送控制單元監測主機發送緩存和主機發送器的工作狀態,當主機發送緩存中有數據且主機發送器空閑時,主機發送控制單元控制主機反射緩存將數據傳輸給主機發送器,并控制主機發送器將數據發到主機端接口。主機接口通過串行通信方式傳輸給微處理器進行處理,微處理器收到數據后進行解析,根據通道標識確定收到的數據來自于哪個局部端的設備。
同時,主機接收器若接收到主機端接口的數據,同樣以中斷方式寫入到主機接收緩存中,當該主機接收緩存中有數據,并達到設定值時,主機數據處理控制單元啟動主機數據處理單元,使主機數據處理單元讀取主機接收緩存中的數據,并對該接收的數據進行處理,讀出的數據中包括包頭、長度、通道標識等,主機數據處理單元依據通信協議對數據包解析,并根據解析出的通道標識將該包中的數據發送到與指定通道對應的局部發送緩存中。
當主機端和局部端的數據通路同時工作,實現雙工通信,而且,多個局部接收器可以同時工作來接收局部端的數據,實現多路通信。主機收發器采用高波特率以實現高速通信。
這種基于在FPGA 中實現外設和NIOSII 內核的方式實現一對多串行通信的系統,具有很高的靈活性、而且成本低廉。理論上,只要FPGA 資源足夠可實現任意多個串行接口和多個設備連接。
在實驗中的系統中,采用常見的低成本EP3C10 器件實現了10個本地設備端和一個主機端的通信,主機端以5Mbuad 的速率可以可靠運行。