摘 要:主要介紹以FPGA為硬件平臺的下位機與計算機(上位機)進行串行通信,將串口功能集成到單片FPGA內,運行中波特率可調,經過適當的倍、分頻實現了零誤差的波特率發生器,提高了數據傳輸的可靠性。上位機上編寫VB程序負責主設備的發送命令并接收顯示來自FPGA回發的數據,實驗結果表明通信可行,可靠性高。
關鍵詞:FPGA; 串行通信; VB; 可靠性
Implementation Between High Reliable Computer and FPGA Serial Communication
CAI De-sheng, FANG Shou-hai
(College of Electronics and Information Engineering, Nanjing University of Technology, Nanjing 210009, China)
Abstract: The serial communication between host computer and Field Programming Gate Array (FPGA) is introduced. In this design, the function of serial interface was integrated to a signal FPGA, the baud rate was alternative in running, a baud rate generator with no error was implemented by appropriate multiplier and divider, and the reliability of the transmission was improved. The host computer sent command to the slave equipment, received and displayed the data which was sent by FPGA. The system is feasible and stabile in running.
Keywords: FPGA; serial communication; VB; high reliability
串行通信廣泛應用于數字通信和工業控制領域\\,傳統的專用串口通信芯片接口復雜,體積較大,隨著微電子技術的發展,FPGA的等效門數迅速增加,可以完全將串口功能集成在單片FPGA內,減少了外圍電路的體積,降低了設計的復雜性,同時也提高通信的可靠性。
1 串行通信的原理
串行通信是指通信的發送和接收方之間數據信息的傳輸是在單根數據線上完成,以每次一個二進制的0或1為最小單位逐位進行傳輸\\,本文采用異步的全雙工通信方式,數據傳輸是以字符為單位,如圖1所示為異步通信的幀格式。
圖1 異步通信字符傳輸格式
其中,一幀數據包括起始位、數據位、校驗位和停止位。線路空閑狀態下,發送和接收端均保持高電平;通信開始時,通信一方發送一個起始位(低電平),表示通信的開始,緊接著發送有效的數據位,通常約定的數據位有5,6,7或者8位,根據用戶需要進行設定,然后發送校驗位,這里選用偶校驗,最后發送停止位,可以是1,1.5或2位不等,用戶自行約定即可。本文選用8位數據位、偶校驗、1位停止位,可以實現所有字符的收、發。
串行通信傳送數據是按位順序進行,最少只需要一根傳輸線即可完成,要實現全雙工的通信共需要2根數據線和1根接地線即可,通信雙方可以在同一時刻進行發送和接收的操作。本文采用的是RS 232C串行接口標準,是目前PC機與通信工業中應用最廣泛的一種串行接口。但計算機的串口是用正負電壓來表示邏輯狀態,與FPGA電路板上以高低電平表示的邏輯狀態的標準不同。因此,為了能夠同計算機進行通信,必須在兩者之間進行電平的邏輯關系轉換,本文采用集成電路芯片MAX232來完成兩種電平的雙向轉換。如圖2所示。
2 FPGA收發模塊的實現
要使FPGA具有數據的收發功能,則收、發兩模塊必不可少,與此相關聯的還需要收、發的時鐘即波特率產生器,收發監視器以及輸入/輸出緩沖器。本文采用先進先出存儲器(First in First Out,FIFO)作為收發數據的雙向緩沖器\\。如圖3所示為FPGA實現串口數據收發的整體框圖。收、發模塊原理基本相同,只是發送區的發送控制信號受FIFO的讀空信號控制。本文重點介紹接收數據的過程。
圖2 電平轉換示意圖
圖3 整體結構框圖
2.1 接收區模塊
接收區模塊負責數據的串行接收并轉換為并行數據,然后送入FIFO存儲器以備后用。它主要由起始位檢測模塊、波特率可調的波特率產生模塊和接收模塊組成。
(1) 波特率產生器
串行通信的傳輸受到通信雙方配備性能及通信線路的特性所左右,收、發雙方必須約定相同的速率進行串行通信,即收、發雙方采用相同的數據傳輸速率,就儀器和工業場合來說,最常見的數據傳輸率有4 800 b/s,9 600 b/s等,現在個人計算機提供的串行端口的數據傳輸率甚至達到115 200 b/s。若傳輸距離較近且設備提供的情況下使用最高的數據傳輸率。本文所列的波特率產生器靈活多變,可以根據實際條件選擇不同的數據傳輸率。設計中添加了一位撥碼開關(Key),故運行中可以在兩種波特率中進行選擇。這里選用了4 800 b/s,9 600 b/s兩種常見的數據傳輸速率,當Key為低電平時選擇4 800 b/s,為高電平時選擇9 600 b/s。當然,以此類推運用二個撥碼開關即可實現4種波特率的互調等。
本文采用50 MHz時鐘源,所以要得到4 800 b/s和9 600 b/s的傳輸率分別需要進行5 208次和31 250次分頻。分頻參數如表1所示。從表中第1,3兩行可以看出如果只用系統提供的50 MHz時鐘源,得到的兩種波特率均存在誤差0.006 4%。受文獻\\啟示,可以靈活運用倍、分頻原理進一步減小誤差。從表中第2,4行可以看出,當時鐘提高到150 MHz時,兩種數據傳輸率的分頻系數剛好能取到整數,也就是說實際可以得到理想的數據傳輸速率。但從50~150 MHz需要經過3倍頻,如果硬件允許的情況下可以采用3倍頻,能夠使傳輸可靠性更高,本文采用的就是此方法。由于設計中采用的硬件是Altera公司Cyclone Ⅱ系列FPGA,擁有2個鎖相環,可以進行靈活的倍、分頻,所以能夠滿足3倍頻的要求\\。
(2) 起始位檢測器與接收模塊
為使得程序清晰,這兩個模塊用狀態機進行實現,如圖4所示。系統復位后進入空閑狀態,空閑狀態時起始位檢測器不斷檢測接收管腳(RxD)上的信號,當檢測器檢測到低電平到來后,狀態轉移到接收狀態,接收模塊便按照約定的波特率開始接收數據,如圖5所示。與此同時建立相應的接收位計數器,當計數滿11后(1位起始位、8位數據位、1位校驗位和1位停止位),狀態又反跳到空閑狀態,如此循環下去,不斷接收來自上位機發送的數據。同時為使得接收的數據更加穩定,設計時在接收模塊接收時采用中間采樣的方法,如選擇9 600 b/s的數據傳輸率,則在半分頻系數即7 812時采樣數據。
圖4 接收區控制狀態機
2.2 存儲器
接收區接收一幀數據后將數據位存入臨時寄存器中,為防止新數據對其覆蓋,故在此添加一個存儲器,每接收1 B數據后將臨時寄存器中的數據寫入FIFO中。這里采用了異步的先進先出存儲器,實現簡單,直接調用相應的IP核\\。模塊中選擇8位數據位,存儲深度可根據器件特性靈活選擇,這里選則4個字的存儲深度。本文只是為了測試通信的正確性,且收、發速率相同,所以4個字的存儲深度能夠滿足要求。FIFO外部管腳主要包括讀/寫時鐘,數據輸入/輸出以及讀空信號,實驗中讀空信號rdempty送到發送檢測器輸入端用來控制FIFO對外的數據輸出。如圖6所示為其在Quartus Ⅱ下的功能仿真圖。wrclk和rdclk分別為寫時鐘和讀時鐘,當寫信號wrreq有效時將外部數據data寫入FIFO,本設計中讀信號rdreq由讀空信號rdempty控制,當讀空信號rdempty為低電平(FIFO非空)時讀信號rdreq有效,此時將FIFO中的數據讀出并通過q端輸出,讀空FIFO后讀空信號rdreq跳到高電平。
為了驗證PC機與FPGA硬件的通信,上位機采用Visual Basic開發Windows下的測控軟件。就串口而言,利用VB開發了串口通信程序有兩種方法:一是使用MSComm串口控件;二是調用Windows API函數。本文采用了前者,與調用API函數相比,MSComm控件實現更加方便、快捷。
MSComm是VB對使用串口通信的用戶定制的控件,它提供了一系列標準通信屬性和方法,簡單編寫相關程序便可實現串行端口的連接。主要用到的屬性如表2所示\\。
為驗證FPGA與PC的通信,需要編寫發送和接收程序,為簡化程序,部分屬性直接在注冊表中設定。如InPutMode設定為1即二進制方式讀取數據;由于程序接收部分使用OnComm事件,所以這里把SThreshold屬性設定為1,而RThreshold屬性設定為發送數據的字節數,即接收緩沖區接收到全部字節數后MSComm控件觸發OnComm事件,執行相應的接收程序。InBufferSize和OutBufferSize均設置為1 024即1 KB
End Sub
4 實驗驗證
實驗過程中串行數據的收、發等功能在Altera公司的Cyclone Ⅱ系列EP2C5芯片下實現,在VB 6.0中編寫相應的FPGA與PC通信的調試窗口,如圖7所示為數據傳輸率9 600 b/s的實驗結果。
圖7 FPGA與PC通信界面
打開應用程序,設置好通信端口、約定的通信速率、數據位等,在相應的輸入框輸入“FPGA與PC通信成功!”字符,點擊5次發送,從顯示區可以看到理想的結果,實驗結果表明FPGA與PC通信可靠。