通用異步收發(fā)器(UART, Universa lA synchronousRece iver Transm itter)是一種應用廣泛的短距離串行傳輸接口, 具有傳輸線少、成本低、可靠性高等優(yōu)點。 8250、8251等都是常見的UART 接口芯片, 但專用芯片一般引腳較多, 內含許多輔助模塊和一些輔助功能, 在實際使用時往往用不到這些功能, 基本的UART 通信只需要接收和發(fā)送兩條信號線, 接收與發(fā)送是全雙工形式, 因此若采用UART 專用芯片, 將會使電路變得復雜, PCB面積增大, 從而導致成本增加, 系統(tǒng)的穩(wěn)定性和可靠性降低。 由于FPGA 的功能日益強大, 開發(fā)周期短、可重復編程等優(yōu)點也越來越明顯, 可以在FPGA 芯片上集成UART 功能模塊, 從而簡化電路, 縮小PCB 面積, 提高系統(tǒng)可靠性。 此外, 基于FPGA 的設計具有很高的靈活性, 可以方便地進行升級和移植。
1、 UART 控制器的FPGA實現(xiàn)
異步收發(fā)器的頂層模塊由波特率發(fā)生器、UART 接收器和UART發(fā)送器構成。 UART 發(fā)送器的用途是將準備輸出的并行數據按照基本UART 幀格式轉為TXD 信號串行輸出; UART 接收器接收RXD 串行信號, 并將其轉化為并行數據, 但串并轉換的時鐘同發(fā)送器一樣處理, 收發(fā)設備間的時鐘是會累計的, 會導致接收數據不正確, 波特率發(fā)生器就是專門產生一個遠遠高于波特率的本地時鐘信號對輸入RXD 不斷采樣, 以不斷地讓接收器與發(fā)送器保持同步。
本設計主要分為波特率發(fā)生器模塊、發(fā)送模塊和接收模塊, 采用的芯片為康欣公司的KX _7C5系列芯片, 其具體型號為EP2C5T144, 具備4608個邏輯宏單元、兩個鎖相環(huán), 約20萬門、約12萬RAM bi.t 具體實現(xiàn)方法如下:
1. 1、波特率控制器
波特率控制可有多種方法實現(xiàn), 常用計數器分頻, 或利用片內鎖相環(huán)控制, 分頻較為簡單, 但對輸入頻率有要求, 分頻后的頻率必須在該波特率下頻率偏差允許范圍內, 設定較好的輸入頻率值, 可解決此問題,這樣可較少消耗片內資源, 鎖相環(huán)技術雖然對輸入頻率沒有過高要求, 但定制內部鎖相環(huán), 必然耗費較多的片內資源, 本設計出于對片內資源的考慮, 采用了分頻方法實現(xiàn)波特率控制器。 波特率發(fā)生器實際是一個頻率變換器。 可以根據給定的系統(tǒng)時鐘和要求的波特率, 通過內部的分頻或倍頻, 最終得到適宜雙方通信的一個時鐘頻率。 發(fā)送器和接收器以該頻率為基準, 進行發(fā)送和采樣接收。
1. 2、接收器
由于串行數據幀和接收時鐘是異步的, 由邏輯1轉為邏輯0可以被視為一個數據幀的起始位。 然而為了避免毛刺影響, 能夠得到正確的起始為信號, 必須要求接收到的起始位在波特率采樣過程中至少有一半是屬于邏輯0才可以認定接收到的是起始位。 由于內部采樣時鐘是發(fā)送和接收時鐘頻率的16倍, 所以起始位至少有8個連續(xù)采樣時鐘周期的邏輯0被收到, 才認為起始位接收到, 接著數據位和奇偶校驗位將每隔16個采樣時鐘周期被采樣一次(即每一個波特率時鐘采樣一次)。 如果起始位的確是16個采樣時鐘周期, 那么接下來數據在每位中點處被采樣, 采得的數據進行移位寄存, 當一幀接收完, 把移位接收寄存器中的內容放入接收緩沖寄存器, 同時產生接收完一幀的標志信號。
基于UART 的實現(xiàn)原理和通信協(xié)議, 本設計采用圖1的狀態(tài)機完成此模塊。

接收器共設有5個工作狀態(tài): R_START (等待起始位)、R_CENTER (求中點)、R_WA IT (等待采樣)、R_SAMPLE (采樣)、R_STOP(停止位接收) 。
( 1) R_START狀態(tài): 當UART接收器復位后, 接收狀態(tài)機將處于這一個狀態(tài)。 在此狀態(tài), 狀態(tài)機一直在等待RXD的電平跳轉, 從邏輯1變?yōu)檫壿?, 即起始位, 這意味著新的一幀UART數據幀的開始, 一旦起始位被確定, 狀態(tài)機將被轉入R_CENTER狀態(tài)。
( 2) R_CENTER 狀態(tài): 在本狀態(tài), 判定起始位是否真實, 通過對采樣時鐘的個數進行計數( RCNT16為采樣時鐘個數計數器) , 可以認為保持邏輯0超過1 /2個位時間的信號一定是起始位。
( 3) R_WA IT狀態(tài): 當狀態(tài)機處于這一狀態(tài), 等待計滿15個采樣時鐘周期, 在第16個采樣時鐘周期是進入R_SAMPLE狀態(tài)進行數據位的采樣檢測, 同時也判斷是否采集的數據位長度已達到數據幀的長度( FRAMELEN ) , 如果到來, 就說明停止位來臨了。
( 4) R_SAMPLE 狀態(tài): 即數據位采樣檢測, 完成后無條件狀態(tài)機轉入R_WA IT狀態(tài), 等待下次數據位的到來。
( 5) R_STOP狀態(tài): 無論停止位是1還是1. 5位, 或是2位, 狀態(tài)機在R_STOP不具體檢測RXD, 只是輸出幀接收完畢信號(REC_DONE《 = ‘1’), 停止位后狀態(tài)機轉回到R START狀態(tài), 等待下一個幀的起始位。
1. 3、發(fā)送器
發(fā)送器在收到發(fā)送命令后, 先發(fā)送一個寬度為16個采樣周期的起始位, 并且將發(fā)送緩沖區(qū)數據放入發(fā)送移位寄存器, 然后每隔16個采樣周期移位寄存器移位輸出1個數據, 當數據發(fā)送完, 根據需要選擇發(fā)送停止位的長度(常用長度有0、1、2) , 停止位的寬度同樣是16個采樣。 發(fā)送器只要每隔16個波特率周期輸出1個數據即可, 次序遵循1位起始位, 8位數據位和1位停止位。 在本設計中沒有校驗位。 該模塊也用狀態(tài)機實現(xiàn), 狀態(tài)圖如圖2:

發(fā)送器也設以下5個工作狀態(tài): X_IDLE (空閑)、X_START (起始位)、X_WA IT (移位等待)、X_SH IFT(移位)、X_STOP(停止) 。
( 1) X_IDLE狀態(tài): 當UART 被復位信號RESETL復位后, 狀態(tài)機將立刻進入這一狀態(tài)。 在這個狀態(tài)下, UART的發(fā)送器一直在等待一個數據幀發(fā)送命令, 當數據幀發(fā)送命令到來, 狀態(tài)轉入X_START, 準備發(fā)送起始位。
( 2) X_START狀態(tài): 在這個狀態(tài)下, UART的發(fā)送器一個位時間寬度的邏輯0 信號至TXD, 即起始位。 緊接著狀態(tài)機轉入X_WA IT 狀態(tài)。
( 3) X_WA IT狀態(tài): 同UART接收狀態(tài)機中的R_WA IT狀態(tài)類似。
( 4) X_SH IFT狀態(tài): 當狀態(tài)機處于這一狀態(tài)時, 實現(xiàn)待發(fā)數據的并串轉換。 轉換完成立即回到X_WA IT狀態(tài)。
( 5) X_STOP: 停止位發(fā)送狀態(tài), 當數據幀發(fā)送完畢, 狀態(tài)機轉入該狀態(tài), 并發(fā)送16個采樣時鐘周期的邏輯1信號, 即1位停止位。 狀態(tài)機送完停止位后回到X_IDLE狀態(tài), 并等待另一個數據幀的發(fā)送命令。
2、仿真測試
2. 1、 Testbench
通常是這樣的代碼: 它對輸入產生預定的激勵, 然后有選擇地觀察響應, 并檢查該響應是否為我們所期望。 功能驗證的核心不僅是這個平臺, 更在于對被測對象施加了什么樣的激勵以及在此激勵下被測對象的輸出是什么。 Testbench與被測對象的關系如圖3:

2. 1. 1、為何要寫Testbench
( 1)畫波形圖只能提供極低的功能覆蓋率。
( 2)畫波形圖無法實現(xiàn)驗證自動化。
( 3)畫波形圖難以定位錯誤。
( 4)畫波形圖的可重用性和平臺移植性極差。
( 5)通過畫波形圖的驗證速度極慢(特別是基于數據幀長度大的通信類設計, 畫波形幾乎是不可能的)。
2. 1. 2、Testbench的結構
一個好的Testbench結構應該包含兩點要求: 層次清晰和具備較好的重用性。 這兩點要求之間也有很重要聯(lián)系: 只有層次清晰的Testbench才是可重用的, 重用性也將使Testbench層次更加清晰。

圖4是一個不可重用的Testbench結構, 它將所有的處理放在一個模塊中, 當進行新的設計時必然不可重用。
圖5是一個可重用的Testbench結構, 它將不同處理放在不同的模塊, 然后再層次化封裝, 當下一次進行類似的設計時, 必然有一部分模塊是可以直接調用, 或者只需修改相應參數。
2. 1. 3、本設計的Testbench結構
本設計采用上述可重用的Testbench結構進行了Testbench的設計, 其中Testcase中主要進行了自發(fā)自收的測試, 定義了如下的測試序列, 發(fā)送數據FF- 00- A5。
2. 2、模塊仿真測試
2. 2. 1、波特率控制模塊
波特率模塊主要是一個計數分頻器, 輸入為高速時鐘和波特率因子(即分頻系數) , 即可實現(xiàn)任意整數分頻, 圖6是分頻系數為3時的波形仿真圖。

2. 2. 2、發(fā)送器模塊和接收模塊
由于可使用自發(fā)自收進行測試, 所以發(fā)送和接收模塊的測試可以同時進行, 設計中的測試數據為A5循環(huán)發(fā)送。 圖7是測試數據的仿真波形圖。

分析上圖得出結論: 標尺黃線開始, RXD 開始重新接收一幀數據, 同時通過TXD 把tbuf中的數據由低位到高位移位發(fā)送。 state為各過程的狀態(tài)標志, 發(fā)送接收狀態(tài)顯示都為011. t b itcnt和r b itcnt分別是發(fā)送數據和接收數據計數位, 且發(fā)送跟接收數據都準確無誤。
2. 3、和PC機通訊的測試
仿真驗證功能之后, 將綜合后的電路寫入FPGA 芯片中, 通過一片RS232轉接與PC 機進行串行通信, 上位機使用的是串口調試助手軟件, 下位機的結果采用LED顯示。 設置好波特率9 600后, PC 機發(fā)送的數據可下位機接收, 并由LED顯示(字符串除外) , 并可以通過轉發(fā)回PC 機在串口小助手上顯示, 所測數據正確無誤。
3、結束語
本文完成了UART控制器的設計, 實現(xiàn)了異步串行通訊的基本功能, 并通過簡單的串口通訊進行了功能調試。 實際運用中可根據外設和處理器的不同需求, 在其基本功能基礎上進行波特率調整、不同幀格式的設置等升級改進, 運用于不同的數字系統(tǒng)。
電子發(fā)燒友App















評論