基于FPGA的UART設(shè)計(jì)與實(shí)現(xiàn)
比較而言,UART發(fā)送器的設(shè)計(jì)相對(duì)容易,只要每隔一個(gè)發(fā)送周期并按照數(shù)據(jù)幀格式輸出數(shù)據(jù)即可,本文將對(duì)接收器的設(shè)計(jì)和實(shí)現(xiàn)做詳細(xì)說明,發(fā)送器的設(shè)計(jì)方法基本相同。
接收器的工作過程如下,在接收數(shù)據(jù)寄存器被讀出一幀數(shù)據(jù)或系統(tǒng)開始工作以后,接收進(jìn)程被啟動(dòng)。接收進(jìn)程啟動(dòng)之后,檢測起始位,檢測到有效起始位后,以約定波特率的時(shí)鐘開始接收數(shù)據(jù),根據(jù)數(shù)據(jù)位數(shù)的約定,計(jì)數(shù)器統(tǒng)計(jì)接收位數(shù)。一幀數(shù)據(jù)接收完畢之后,如果使用了奇偶校驗(yàn),則檢測校驗(yàn)位,如無誤則接收停止位。停止位接收完畢后,將接收數(shù)據(jù)轉(zhuǎn)存到數(shù)據(jù)寄存器中。
為確保接收器可靠工作,在接收端開始接收數(shù)據(jù)位之前,處于搜索狀態(tài),這時(shí)接收端以16倍波特率的速率讀取線路狀態(tài),檢測線路上出現(xiàn)低電平的時(shí)刻。因?yàn)楫惒絺鬏數(shù)奶攸c(diǎn)是以起始位為基準(zhǔn)同步的。然而,通信線上的噪音也極有可能使傳號(hào)“1”跳變到空號(hào)“0”。所以接收器以16倍的波特率對(duì)這種跳變進(jìn)行檢測,直至在連續(xù)8個(gè)接收時(shí)鐘以后采樣值仍然是低電平,才認(rèn)為是一個(gè)真正的起始位,而不是噪音引起的,其中若有一次采樣得到的為高電平則認(rèn)為起始信號(hào)無效,返回初始狀態(tài)重新等待起始信號(hào)的到來。找到起始位以后,就開始接收數(shù)據(jù),最可靠的接收應(yīng)該是接收時(shí)鐘的出現(xiàn)時(shí)刻正好對(duì)著數(shù)據(jù)位的中央。由于在起始位檢測時(shí),已使時(shí)鐘對(duì)準(zhǔn)了位中央,用16倍波特率的時(shí)鐘作為接收時(shí)鐘,就是為了確保在位寬的中心時(shí)間對(duì)接收的位序列進(jìn)行可靠采樣,當(dāng)采樣計(jì)數(shù)器計(jì)數(shù)結(jié)束后所有數(shù)據(jù)位都已經(jīng)輸入完成。最后對(duì)停止位的高電平進(jìn)行檢測,若正確檢測到高電平,說明本幀的各位正確接收完畢,將數(shù)據(jù)轉(zhuǎn)存到數(shù)據(jù)寄存器中,否則出錯(cuò)。本文引用地址:http://butianyuan.cn/article/191633.htm
采用有限狀態(tài)機(jī)模型可以更清晰明確地描述接收器的功能,便于代碼實(shí)現(xiàn)。接收器的狀態(tài)轉(zhuǎn)換圖如圖3所示,為突出主要過程,圖中省略了奇偶校驗(yàn)的情況。接收器狀態(tài)機(jī)由5個(gè)工作狀態(tài)組成,分別是空閑狀態(tài)、起始位確認(rèn)、采樣數(shù)據(jù)位、停止位確認(rèn)和數(shù)據(jù)正確,觸發(fā)狀態(tài)轉(zhuǎn)換的事件和在各個(gè)狀態(tài)執(zhí)行的動(dòng)作見圖中的文字說明。
在狀態(tài)機(jī)模型的基礎(chǔ)上,使用VHDL來描述接收器功能,其主要代碼如下:
實(shí)現(xiàn)用16倍波特率時(shí)鐘確定起始位的具體方法是設(shè)計(jì)兩個(gè)輸入數(shù)據(jù)位寄存器rxd1和rxd2,使用語句“rxd1=rxd;rxd2=rxd1;”接收數(shù)據(jù)并進(jìn)行判斷。當(dāng)檢測到rxdl=O并且rxd2=1時(shí)可以確定下降沿發(fā)生,連續(xù)7個(gè)時(shí)鐘rxd2=0即確定檢測到起始位,之后為了確保在數(shù)據(jù)位中央接收數(shù)據(jù),同樣用16倍波特率時(shí)鐘對(duì)數(shù)據(jù)位進(jìn)行采樣。接收數(shù)據(jù)的方法是設(shè)計(jì)一個(gè)寄存器rxd_buf(7 downto 0),用語句“rxd_buf(7)=rxd2;rxd_buf(6 DOWNTO 0)=rxd_buf(7 DOWNTO 1);”實(shí)現(xiàn)移位寄存器右移操作,執(zhí)行8次后接收到一個(gè)完整數(shù)據(jù)。
1.3 波特率發(fā)生器設(shè)計(jì)
波特率發(fā)生器實(shí)質(zhì)是設(shè)計(jì)一個(gè)分頻器,用于產(chǎn)生和RS 232通信同步的時(shí)鐘。在系統(tǒng)中用一個(gè)計(jì)數(shù)器來完成這個(gè)功能,分頻系數(shù)N決定了波特率的數(shù)值。該計(jì)數(shù)器一般工作在一個(gè)頻率較高的系統(tǒng)時(shí)鐘下,當(dāng)計(jì)數(shù)到N/2時(shí)將輸出置為高電平,再計(jì)數(shù)到N/2的數(shù)值后將輸出置為低電平,如此反復(fù)即可得到占空比50%的波特率時(shí)鐘,具體的波特率依賴于所使用的系統(tǒng)時(shí)鐘頻率和N的大小。如系統(tǒng)時(shí)鐘頻率是40 MHz,要求波特率是9 600,則16倍波特率時(shí)鐘的周期約等于260個(gè)系統(tǒng)時(shí)鐘周期,則計(jì)數(shù)器取260/2=130時(shí),當(dāng)計(jì)數(shù)溢出時(shí)輸出電平取反就可以得到16倍約定波特率的時(shí)鐘。
使用VHDL來描述波特率發(fā)生器的完整代碼如下:
評(píng)論