新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 利用FPGA實現外設通信接口之: 典型實例-RS-232C(UART)接口的設計與實現

        利用FPGA實現外設通信接口之: 典型實例-RS-232C(UART)接口的設計與實現

        作者: 時間:2017-06-05 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201706/348804.htm

        10.6典型實例16:RS-232C()接口的設計與實現

        10.6.1實例內容及目標

        1.實例的主要內容

        本節旨在通過分析控制器,設計實現了通過與PC機的通信。設計過程中用Modelsim對控制器進行仿真,幫助讀者進一步了解UART協議的具體時序。

        2.實例目標

        通過本實例,讀者應達到以下目標。

        ·了解UART工作原理和時序。

        ·熟悉Modelsim仿真的流程。

        ·熟練掌握狀態機的使用。

        ·實現與PC機之間的通信。

        10.6.2實例詳解

        系統上電復位后,先將20個數寫入內部資源BlockRam(可以用IP核來實現),然后根據設定的協議(該協議可自己設定)來建立PC機與FPGA的通信,此處設定的協議如下。

        PC機要從串口讀取數據時,先從串口發送E4H、00H。E4H代表FPGA的地址(可以隨意設定一個數),00H表示要讀取數據。FPGA收到這兩個數據后,通過串口給PC機反饋信號。發送E4H、E1H,表示FPGA已經收到了PC機的命令,要開始向PC機發送數據。PC端準備接收數據,建立了此連接后,PC機可從FPGA讀出最初寫入BlockRam中的值了。

        10.6.3的實現方法

        對于BlockRam,可以直接應用IP核來實現,具體實現步驟如下。

        首先為工程添加新的設計文件,選擇“NewSource…”,如圖10.23所示。

        圖10.23新建IP核設計文件

        在彈出的對話框里面選擇創建IP(CoreGenArchitectureWizard)類型文件,并為該文件設置文件名及路徑,單擊“Next”按鈕,如圖10.24所示。

        圖10.24選擇IP核類型

        在選擇IP核類型對話框中選擇“DualPortBlockMemory6-1”,即可生成一個雙口RAM。單擊“Next”按鈕進入雙口RAM設置向導,如圖10.25所示。

        在該向導中,要對該雙口RAM的屬性進行設置。

        圖10.25雙口BlockMemory設置向導

        如圖10.25所示,WidthA、WidthB分別為寫入兩個口的數據的位數,Depth為容量,在這里設為100,實際中只用到20個。對A口,上電復位后,就將20個數據寫入A口,因此A口設為WriteOnly,對于B口,FPGA向PC機發送數據時從B口讀取數據,因此B口設為ReadOnly,設置完畢后單擊“Generate”按鈕即可。

        10.6.4FPGA代碼的設計實現

        整個代碼采用了4個狀態機來實現,其中兩個狀態機用于從串口讀取數據,另外兩個用于向串口寫入數據。下面以從串口讀取數據為例來說明狀態機的工作過程。

        從串口讀取數據的兩個狀態機主要完成如下功能:從串口接收到字符,并判斷是不是E4H、00H(自定協議規定的內容),如果是,就給出Response(應答)信號,通知發送數據狀態機開始向PC機發送數據。

        這兩個狀態機,一個為主狀態機,用于連續從串口讀取數據;一個為輔狀態機,用于從串口讀取一個字節的數據。由于串口接收數據是一位一位地接收,該狀態機就控制從串口接收所有位,并將結果存入一個8位的寄存器。

        當輔狀態機接收到一個字符后,就給主狀態機一個Received_char信號。主狀態機判斷是不是E4H信號,如果是,就跳到下一個狀態,等待輔狀態機接收下一個字符;如果下一個接收到的字符是00H,那么就給出Response信號。

        系統狀態圖如圖10.26所示。

        圖10.26系統狀態圖

        狀態機描述是一種非常好的方法,用戶可在此基礎上加以修改,用于自己的實際設計當中。單個字符接收的狀態機如圖10.27所示。

        圖10.27單字符接收狀態機

        對于發送數據的兩個狀態機,其工作機理與上面相同,不再贅述。詳細設計參考實例代碼。

        10.6.5波特率的設定

        串口通信必須要設定波特率。本設計中采用的波特率為9600kbit/s,采用的時鐘為50MHz,相當于傳送一位數據需要約5028個時鐘周期。這里采用減法計數器來控制,即計數器計到5028個時鐘周期后,就開始傳輸下一位數據(也可以通過對時鐘分頻來實現)。

        10.6.6ModelSim仿真驗證

        FPGA從串口接收數據仿真結果,如圖10.28所示。

        圖10.28從串口接收數據仿真結果

        rxd為模擬PC機發出的E4H、00H信號。從圖中可以看到,當FPGA收到這兩個信號后,給出了Response脈沖。發送狀態機收到該信號后,給出txd的低電平信號,通知PC機要開始發送數據了。

        如圖10.29所示,txd為FPGA向PC機發送的數據。發送狀態機收到Response信號后,給出txd低電平信號,開始發送數據。先發送應答信號E4H、E1H,之后開始發送開始寫入BlockRam的20個數,從0~19。圖中raddr為BlockRam的地址,rdata為從BlockRam中讀取的數據。

        圖10.29SDRAM控制器仿真結果

        在仿真時,為了顯示方便,沒有按照5028個時鐘傳輸一位,而是4個時鐘就傳輸一位。

        10.6.7小結

        本節對數字系統中常用的UART控制器做了初步的介紹,并在Modelsim中實現了對SDRAM控制器的仿真,最后通過編譯下載在紅色颶風的開發板上實現了預定功能。

        通過這個實例,讀者能夠掌握UART控制器以及的設計實現方法,并學會將這個控制器集成到更為復雜的設計中去。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 苗栗市| 德阳市| 广水市| 尼木县| 安康市| 台安县| 涟源市| 出国| 肇州县| 绥德县| 元氏县| 上犹县| 阳新县| 钟山县| 芮城县| 新巴尔虎右旗| 桦甸市| 永新县| 普陀区| 滦南县| 富锦市| 固原市| 黎平县| 赤壁市| 淮安市| 玛纳斯县| 海南省| 大同县| 南丹县| 晋城| 旺苍县| 商都县| 万山特区| 广德县| 色达县| 若羌县| 藁城市| 含山县| 衡东县| 汕头市| 绥江县|