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