利用FPGA實(shí)現外設通信接口之: 典型實(shí)例-RS-232C(UART)接口的設計與實(shí)現
10.6典型實(shí)例16:RS-232C(UART)接口的設計與實(shí)現
10.6.1實(shí)例內容及目標
1.實(shí)例的主要內容
本節旨在通過(guò)分析UART控制器,設計實(shí)現了FPGA通過(guò)RS-232C接口與PC機的通信。設計過(guò)程中用Modelsim對UART控制器進(jìn)行仿真,幫助讀者進(jìn)一步了解UART協(xié)議的具體時(shí)序。
2.實(shí)例目標
通過(guò)本實(shí)例,讀者應達到以下目標。
·了解UART工作原理和時(shí)序。
·熟悉Modelsim仿真的流程。
·熟練掌握狀態(tài)機的使用。
·實(shí)現FPGA與PC機之間的RS-232C接口通信。
10.6.2實(shí)例詳解
系統上電復位后,先將20個(gè)數寫(xiě)入FPGA內部資源BlockRam(可以用IP核來(lái)實(shí)現),然后根據設定的協(xié)議(該協(xié)議可自己設定)來(lái)建立PC機與FPGA的通信,此處設定的協(xié)議如下。
PC機要從串口讀取數據時(shí),先從串口發(fā)送E4H、00H。E4H代表FPGA的地址(可以隨意設定一個(gè)數),00H表示要讀取數據。FPGA收到這兩個(gè)數據后,通過(guò)串口給PC機反饋信號。發(fā)送E4H、E1H,表示FPGA已經(jīng)收到了PC機的命令,要開(kāi)始向PC機發(fā)送數據。PC端準備接收數據,建立了此連接后,PC機可從FPGA讀出最初寫(xiě)入BlockRam中的值了。
10.6.3BlockRAM的實(shí)現方法
對于BlockRam,可以直接應用IP核來(lái)實(shí)現,具體實(shí)現步驟如下。
首先為工程添加新的設計文件,選擇“NewSource…”,如圖10.23所示。
圖10.23新建IP核設計文件
在彈出的對話(huà)框里面選擇創(chuàng )建IP(CoreGenArchitectureWizard)類(lèi)型文件,并為該文件設置文件名及路徑,單擊“Next”按鈕,如圖10.24所示。
圖10.24選擇IP核類(lèi)型
在選擇IP核類(lèi)型對話(huà)框中選擇“DualPortBlockMemory6-1”,即可生成一個(gè)雙口RAM。單擊“Next”按鈕進(jìn)入雙口RAM設置向導,如圖10.25所示。
在該向導中,要對該雙口RAM的屬性進(jìn)行設置。
圖10.25雙口BlockMemory設置向導
如圖10.25所示,WidthA、WidthB分別為寫(xiě)入兩個(gè)口的數據的位數,Depth為容量,在這里設為100,實(shí)際中只用到20個(gè)。對A口,上電復位后,就將20個(gè)數據寫(xiě)入A口,因此A口設為WriteOnly,對于B口,FPGA向PC機發(fā)送數據時(shí)從B口讀取數據,因此B口設為ReadOnly,設置完畢后單擊“Generate”按鈕即可。
10.6.4FPGA代碼的設計實(shí)現
整個(gè)代碼采用了4個(gè)狀態(tài)機來(lái)實(shí)現,其中兩個(gè)狀態(tài)機用于從串口讀取數據,另外兩個(gè)用于向串口寫(xiě)入數據。下面以從串口讀取數據為例來(lái)說(shuō)明狀態(tài)機的工作過(guò)程。
從串口讀取數據的兩個(gè)狀態(tài)機主要完成如下功能:從串口接收到字符,并判斷是不是E4H、00H(自定協(xié)議規定的內容),如果是,就給出Response(應答)信號,通知發(fā)送數據狀態(tài)機開(kāi)始向PC機發(fā)送數據。
這兩個(gè)狀態(tài)機,一個(gè)為主狀態(tài)機,用于連續從串口讀取數據;一個(gè)為輔狀態(tài)機,用于從串口讀取一個(gè)字節的數據。由于串口接收數據是一位一位地接收,該狀態(tài)機就控制從串口接收所有位,并將結果存入一個(gè)8位的寄存器。
當輔狀態(tài)機接收到一個(gè)字符后,就給主狀態(tài)機一個(gè)Received_char信號。主狀態(tài)機判斷是不是E4H信號,如果是,就跳到下一個(gè)狀態(tài),等待輔狀態(tài)機接收下一個(gè)字符;如果下一個(gè)接收到的字符是00H,那么就給出Response信號。
系統狀態(tài)圖如圖10.26所示。
圖10.26系統狀態(tài)圖
狀態(tài)機描述是一種非常好的方法,用戶(hù)可在此基礎上加以修改,用于自己的實(shí)際設計當中。單個(gè)字符接收的狀態(tài)機如圖10.27所示。
圖10.27單字符接收狀態(tài)機
對于發(fā)送數據的兩個(gè)狀態(tài)機,其工作機理與上面相同,不再贅述。詳細設計參考實(shí)例代碼。
10.6.5波特率的設定
串口通信必須要設定波特率。本設計中采用的波特率為9600kbit/s,采用的時(shí)鐘為50MHz,相當于傳送一位數據需要約5028個(gè)時(shí)鐘周期。這里采用減法計數器來(lái)控制,即計數器計到5028個(gè)時(shí)鐘周期后,就開(kāi)始傳輸下一位數據(也可以通過(guò)對時(shí)鐘分頻來(lái)實(shí)現)。
10.6.6ModelSim仿真驗證
FPGA從串口接收數據仿真結果,如圖10.28所示。
圖10.28從串口接收數據仿真結果
rxd為模擬PC機發(fā)出的E4H、00H信號。從圖中可以看到,當FPGA收到這兩個(gè)信號后,給出了Response脈沖。發(fā)送狀態(tài)機收到該信號后,給出txd的低電平信號,通知PC機要開(kāi)始發(fā)送數據了。
如圖10.29所示,txd為FPGA向PC機發(fā)送的數據。發(fā)送狀態(tài)機收到Response信號后,給出txd低電平信號,開(kāi)始發(fā)送數據。先發(fā)送應答信號E4H、E1H,之后開(kāi)始發(fā)送開(kāi)始寫(xiě)入BlockRam的20個(gè)數,從0~19。圖中raddr為BlockRam的地址,rdata為從BlockRam中讀取的數據。
圖10.29SDRAM控制器仿真結果
在仿真時(shí),為了顯示方便,沒(méi)有按照5028個(gè)時(shí)鐘傳輸一位,而是4個(gè)時(shí)鐘就傳輸一位。
10.6.7小結
本節對數字系統中常用的UART控制器做了初步的介紹,并在Modelsim中實(shí)現了對SDRAM控制器的仿真,最后通過(guò)編譯下載在紅色颶風(fēng)的開(kāi)發(fā)板上實(shí)現了預定功能。
通過(guò)這個(gè)實(shí)例,讀者能夠掌握UART控制器以及RS-232C接口的設計實(shí)現方法,并學(xué)會(huì )將這個(gè)控制器集成到更為復雜的設計中去。
評論