通用異步收發器(UART, Universa lA synchronousRece iver Transm itter)是一種應用廣泛的短距離串行傳輸接口, 具有傳輸線少、成本低、可靠性高等優點。 8250、8251等都是常見的UART 接口芯片, 但專用芯片一般引腳較多, 內含許多輔助模塊和一些輔助功能, 在實際使用時往往用不到這些功能, 基本的UART 通信只需要接收和發送兩條信號線, 接收與發送是全雙工形式, 因此若采用UART 專用芯片, 將會使電路變得復雜, PCB面積增大, 從而導致成本增加, 系統的穩定性和可靠性降低。 由于FPGA 的功能日益強大, 開發周期短、可重復編程等優點也越來越明顯, 可以在FPGA 芯片上集成UART 功能模塊, 從而簡化電路, 縮小PCB 面積, 提高系統可靠性。 此外, 基于FPGA 的設計具有很高的靈活性, 可以方便地進行升級和移植。
1、 UART 控制器的FPGA實現
異步收發器的頂層模塊由波特率發生器、UART 接收器和UART發送器構成。 UART 發送器的用途是將準備輸出的并行數據按照基本UART 幀格式轉為TXD 信號串行輸出; UART 接收器接收RXD 串行信號, 并將其轉化為并行數據, 但串并轉換的時鐘同發送器一樣處理, 收發設備間的時鐘是會累計的, 會導致接收數據不正確, 波特率發生器就是專門產生一個遠遠高于波特率的本地時鐘信號對輸入RXD 不斷采樣, 以不斷地讓接收器與發送器保持同步。
本設計主要分為波特率發生器模塊、發送模塊和接收模塊, 采用的芯片為康欣公司的KX _7C5系列芯片, 其具體型號為EP2C5T144, 具備4608個邏輯宏單元、兩個鎖相環, 約20萬門、約12萬RAM bi.t 具體實現方法如下:
1. 1、波特率控制器
波特率控制可有多種方法實現, 常用計數器分頻, 或利用片內鎖相環控制, 分頻較為簡單, 但對輸入頻率有要求, 分頻后的頻率必須在該波特率下頻率偏差允許范圍內, 設定較好的輸入頻率值, 可解決此問題,這樣可較少消耗片內資源, 鎖相環技術雖然對輸入頻率沒有過高要求, 但定制內部鎖相環, 必然耗費較多的片內資源, 本設計出于對片內資源的考慮, 采用了分頻方法實現波特率控制器。 波特率發生器實際是一個頻率變換器。 可以根據給定的系統時鐘和要求的波特率, 通過內部的分頻或倍頻, 最終得到適宜雙方通信的一個時鐘頻率。 發送器和接收器以該頻率為基準, 進行發送和采樣接收。
1. 2、接收器
由于串行數據幀和接收時鐘是異步的, 由邏輯1轉為邏輯0可以被視為一個數據幀的起始位。 然而為了避免毛刺影響, 能夠得到正確的起始為信號, 必須要求接收到的起始位在波特率采樣過程中至少有一半是屬于邏輯0才可以認定接收到的是起始位。 由于內部采樣時鐘是發送和接收時鐘頻率的16倍, 所以起始位至少有8個連續采樣時鐘周期的邏輯0被收到, 才認為起始位接收到, 接著數據位和奇偶校驗位將每隔16個采樣時鐘周期被采樣一次(即每一個波特率時鐘采樣一次)。 如果起始位的確是16個采樣時鐘周期, 那么接下來數據在每位中點處被采樣, 采得的數據進行移位寄存, 當一幀接收完, 把移位接收寄存器中的內容放入接收緩沖寄存器, 同時產生接收完一幀的標志信號。
基于UART 的實現原理和通信協議, 本設計采用圖1的狀態機完成此模塊。
接收器共設有5個工作狀態: R_START (等待起始位)、R_CENTER (求中點)、R_WA IT (等待采樣)、R_SAMPLE (采樣)、R_STOP(停止位接收) 。
( 1) R_START狀態: 當UART接收器復位后, 接收狀態機將處于這一個狀態。 在此狀態, 狀態機一直在等待RXD的電平跳轉, 從邏輯1變為邏輯0, 即起始位, 這意味著新的一幀UART數據幀的開始, 一旦起始位被確定, 狀態機將被轉入R_CENTER狀態。
( 2) R_CENTER 狀態: 在本狀態, 判定起始位是否真實, 通過對采樣時鐘的個數進行計數( RCNT16為采樣時鐘個數計數器) , 可以認為保持邏輯0超過1 /2個位時間的信號一定是起始位。
( 3) R_WA IT狀態: 當狀態機處于這一狀態, 等待計滿15個采樣時鐘周期, 在第16個采樣時鐘周期是進入R_SAMPLE狀態進行數據位的采樣檢測, 同時也判斷是否采集的數據位長度已達到數據幀的長度( FRAMELEN ) , 如果到來, 就說明停止位來臨了。
( 4) R_SAMPLE 狀態: 即數據位采樣檢測, 完成后無條件狀態機轉入R_WA IT狀態, 等待下次數據位的到來。
( 5) R_STOP狀態: 無論停止位是1還是1. 5位, 或是2位, 狀態機在R_STOP不具體檢測RXD, 只是輸出幀接收完畢信號(REC_DONE《 = ‘1’), 停止位后狀態機轉回到R START狀態, 等待下一個幀的起始位。
1. 3、發送器
發送器在收到發送命令后, 先發送一個寬度為16個采樣周期的起始位, 并且將發送緩沖區數據放入發送移位寄存器, 然后每隔16個采樣周期移位寄存器移位輸出1個數據, 當數據發送完, 根據需要選擇發送停止位的長度(常用長度有0、1、2) , 停止位的寬度同樣是16個采樣。 發送器只要每隔16個波特率周期輸出1個數據即可, 次序遵循1位起始位, 8位數據位和1位停止位。 在本設計中沒有校驗位。 該模塊也用狀態機實現, 狀態圖如圖2:
發送器也設以下5個工作狀態: X_IDLE (空閑)、X_START (起始位)、X_WA IT (移位等待)、X_SH IFT(移位)、X_STOP(停止) 。
( 1) X_IDLE狀態: 當UART 被復位信號RESETL復位后, 狀態機將立刻進入這一狀態。 在這個狀態下, UART的發送器一直在等待一個數據幀發送命令, 當數據幀發送命令到來, 狀態轉入X_START, 準備發送起始位。
( 2) X_START狀態: 在這個狀態下, UART的發送器一個位時間寬度的邏輯0 信號至TXD, 即起始位。 緊接著狀態機轉入X_WA IT 狀態。
( 3) X_WA IT狀態: 同UART接收狀態機中的R_WA IT狀態類似。
( 4) X_SH IFT狀態: 當狀態機處于這一狀態時, 實現待發數據的并串轉換。 轉換完成立即回到X_WA IT狀態。
( 5) X_STOP: 停止位發送狀態, 當數據幀發送完畢, 狀態機轉入該狀態, 并發送16個采樣時鐘周期的邏輯1信號, 即1位停止位。 狀態機送完停止位后回到X_IDLE狀態, 并等待另一個數據幀的發送命令。
2、仿真測試
2. 1、 Testbench
通常是這樣的代碼: 它對輸入產生預定的激勵, 然后有選擇地觀察響應, 并檢查該響應是否為我們所期望。 功能驗證的核心不僅是這個平臺, 更在于對被測對象施加了什么樣的激勵以及在此激勵下被測對象的輸出是什么。 Testbench與被測對象的關系如圖3:
2. 1. 1、為何要寫Testbench
( 1)畫波形圖只能提供極低的功能覆蓋率。
( 2)畫波形圖無法實現驗證自動化。
( 3)畫波形圖難以定位錯誤。
( 4)畫波形圖的可重用性和平臺移植性極差。
( 5)通過畫波形圖的驗證速度極慢(特別是基于數據幀長度大的通信類設計, 畫波形幾乎是不可能的)。
2. 1. 2、Testbench的結構
一個好的Testbench結構應該包含兩點要求: 層次清晰和具備較好的重用性。 這兩點要求之間也有很重要聯系: 只有層次清晰的Testbench才是可重用的, 重用性也將使Testbench層次更加清晰。
圖4是一個不可重用的Testbench結構, 它將所有的處理放在一個模塊中, 當進行新的設計時必然不可重用。
圖5是一個可重用的Testbench結構, 它將不同處理放在不同的模塊, 然后再層次化封裝, 當下一次進行類似的設計時, 必然有一部分模塊是可以直接調用, 或者只需修改相應參數。
2. 1. 3、本設計的Testbench結構
本設計采用上述可重用的Testbench結構進行了Testbench的設計, 其中Testcase中主要進行了自發自收的測試, 定義了如下的測試序列, 發送數據FF- 00- A5。
2. 2、模塊仿真測試
2. 2. 1、波特率控制模塊
波特率模塊主要是一個計數分頻器, 輸入為高速時鐘和波特率因子(即分頻系數) , 即可實現任意整數分頻, 圖6是分頻系數為3時的波形仿真圖。
2. 2. 2、發送器模塊和接收模塊
由于可使用自發自收進行測試, 所以發送和接收模塊的測試可以同時進行, 設計中的測試數據為A5循環發送。 圖7是測試數據的仿真波形圖。
分析上圖得出結論: 標尺黃線開始, RXD 開始重新接收一幀數據, 同時通過TXD 把tbuf中的數據由低位到高位移位發送。 state為各過程的狀態標志, 發送接收狀態顯示都為011. t b itcnt和r b itcnt分別是發送數據和接收數據計數位, 且發送跟接收數據都準確無誤。
2. 3、和PC機通訊的測試
仿真驗證功能之后, 將綜合后的電路寫入FPGA 芯片中, 通過一片RS232轉接與PC 機進行串行通信, 上位機使用的是串口調試助手軟件, 下位機的結果采用LED顯示。 設置好波特率9 600后, PC 機發送的數據可下位機接收, 并由LED顯示(字符串除外) , 并可以通過轉發回PC 機在串口小助手上顯示, 所測數據正確無誤。
3、結束語
本文完成了UART控制器的設計, 實現了異步串行通訊的基本功能, 并通過簡單的串口通訊進行了功能調試。 實際運用中可根據外設和處理器的不同需求, 在其基本功能基礎上進行波特率調整、不同幀格式的設置等升級改進, 運用于不同的數字系統。
評論