基于FPGA器件實(shí)現(xiàn)UART適應(yīng)自頂向下的設(shè)計(jì)_第1頁
基于FPGA器件實(shí)現(xiàn)UART適應(yīng)自頂向下的設(shè)計(jì)_第2頁
基于FPGA器件實(shí)現(xiàn)UART適應(yīng)自頂向下的設(shè)計(jì)_第3頁
基于FPGA器件實(shí)現(xiàn)UART適應(yīng)自頂向下的設(shè)計(jì)_第4頁
基于FPGA器件實(shí)現(xiàn)UART適應(yīng)自頂向下的設(shè)計(jì)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

基于FPGA器件實(shí)現(xiàn)UART適應(yīng)自頂向下的設(shè)計(jì)UART(通用異步收發(fā)器)是廣泛使用的串行數(shù)據(jù)傳輸協(xié)議。UART允許在串行鏈路上進(jìn)行全雙工的通信。專用的UART集成電路如8250,8251,NS16450等已經(jīng)相當(dāng)復(fù)雜,有些含有許多輔助的模塊(如FIF0),在實(shí)際應(yīng)用中,往往只需要用到UART的幾個(gè)基本功能,使用專用芯片會造成資源浪費(fèi)和成本提高,我們可以將所需要的UART功能集成到FPGA內(nèi)部,從而簡化了整個(gè)系統(tǒng)電路,提高了可靠性、穩(wěn)定性和靈活性。l、UART簡介基本的UART通信只需要兩條信號線(RXD,TXD)就可以完成數(shù)據(jù)的相互通信,接收與發(fā)送是全雙工形式,其中TXD是UART發(fā)送端,RXD是UART接收端。UART的基本特點(diǎn)是:在信號線上有2種狀態(tài),可分別用邏輯1(高電平)和邏輯0(低電平)來區(qū)分。在發(fā)送器空閑時(shí),數(shù)據(jù)線應(yīng)保持在邏輯高電平狀態(tài)。發(fā)送器是通過發(fā)送起始位而開始一個(gè)字符傳送,起始位使數(shù)據(jù)線處于邏輯0狀態(tài),提示接收器數(shù)據(jù)傳輸即將開始。數(shù)據(jù)位一般為8位一個(gè)字節(jié)的數(shù)據(jù)(也有6位、7位的情況),低位(LSB)在前,高位(MSB)在后。校驗(yàn)位一般用來判斷接收的數(shù)據(jù)位有無錯(cuò)誤,一般是奇偶校驗(yàn)。停止位在最后,用以標(biāo)志一個(gè)字符傳送的結(jié)束,它對應(yīng)于邏輯1狀態(tài)。UART數(shù)據(jù)幀格式如表1所示。2、UART功能實(shí)現(xiàn)基于FPGA的UART由3個(gè)子模塊組成:波特率發(fā)生器模塊;發(fā)送模塊;接收模塊。2.1波特率發(fā)生器模塊波特率發(fā)生器實(shí)際上就是一個(gè)分頻器。波特率發(fā)生器的功能是產(chǎn)生和RS-232通信所采用的波特率同步的時(shí)鐘,這樣才能按照RS-232串行通信的時(shí)序要求進(jìn)行數(shù)據(jù)接收或發(fā)送。實(shí)現(xiàn)波特率時(shí)鐘的基本思路就是設(shè)計(jì)一個(gè)計(jì)數(shù)器,該計(jì)數(shù)器工作在速度很高的系統(tǒng)時(shí)鐘下,當(dāng)計(jì)數(shù)到某數(shù)值時(shí)將輸出置為高電平,再計(jì)數(shù)一定數(shù)值后將輸出置為低電平,如此反復(fù)就能得到所需的波特率時(shí)鐘。例如FPGA的系統(tǒng)時(shí)鐘為50MHz,RS-232通信的波特率為9600,則波特率時(shí)鐘的每個(gè)周期約相當(dāng)于5208個(gè)系統(tǒng)時(shí)鐘的周期。假如要得到占空比為50%的波特率時(shí)鐘,只要使計(jì)數(shù)器在計(jì)數(shù)到520850%=2604時(shí)將輸出置為高電平,之后在計(jì)數(shù)到5208時(shí)輸出低電平并重新計(jì)數(shù),就能得到和9600波特率同步的時(shí)鐘。波特率發(fā)生器VHDL實(shí)現(xiàn)的關(guān)鍵代碼如下:entitybaudisPort(clk,resetb:instd_logic;bclk:outstd_logic);endbaud;architectureBehavioralofbaudisbeginprocess(clk,resetb)variablecnt:integer;beginifresetb=‘1’thencnt:=0;bclk《=‘0’;--復(fù)位elsifrising_edge(clk)thenifcnt》=208thencnt:=0;bclk《=‘1’;--設(shè)置分頻系數(shù)elsecnt:=cnt+1;bclk《=‘0’;endif;endif;endprocess;endBehavioral;Modelsim下的仿真波形如圖1所示。2.2發(fā)送模塊在發(fā)數(shù)據(jù)寄存器被寫入一幀數(shù)據(jù)之后,發(fā)送過程被啟動。發(fā)送過程啟動后,發(fā)送串行移位寄存器被啟動。同時(shí)發(fā)送使能標(biāo)志被清空。首先發(fā)送的是起始位,同時(shí)啟動發(fā)數(shù)據(jù)計(jì)算器,記錄發(fā)送數(shù)據(jù)的個(gè)數(shù)。根據(jù)工作模式寄存器的要求,將要發(fā)送的一幀數(shù)據(jù)串行發(fā)送出去,如果需要校驗(yàn),則產(chǎn)生校驗(yàn)位并發(fā)送出去。最后需要發(fā)送的是停止位,根據(jù)停止位個(gè)數(shù)的要求,發(fā)送停止位。最后設(shè)置發(fā)送完畢標(biāo)志位。圖2為發(fā)送模塊狀態(tài)機(jī)示意圖。圖2發(fā)送狀態(tài)機(jī)示意圖發(fā)送模塊VHDL程序關(guān)鍵代碼如下:architectureBehavioraloftransferistypestatesis(x_idle,x_start,x_wait,x_shift,x_stop);--定義各子狀態(tài)signalstate:states:=x_idle;signaltcnt:integer:=0;beginprocess(bclkt,resett,xmit_cmd_p,txdbuf)--主控時(shí)序、組合進(jìn)程variablexcnt16:std_logic_vector(4downto0):=“00000”;--定義中間變量variablexbitcnt:integer:=0;variabletxds:std_logic;beginifresett=‘1’thenstate《=x_idle;txd_done《=‘0’;txds:=‘1’;--復(fù)位elsifrising_edge(bclkt)thencasestateiswhenx_idle=》--狀態(tài)1,等待數(shù)據(jù)幀發(fā)送命令ifxmit_cmd_p=‘1’thenstate《=x_start;txd_done《=‘0’;elsestate《=x_idle;endif;whenx_start=》--狀態(tài)2,發(fā)送信號至起始位ifxcnt16》=“01111”thenstate《=x_wait;xcnt16:=“00000”;elsexcnt16:=xcnt16+1;txds:=‘0’;state《=x_start;endif;whenx_wait=》--狀態(tài)3,等待狀態(tài)ifxcnt16》=“01110”thenifxbitcnt=framlentthenstate《=x_stop;xbitcnt:=0;elsestate《=x_shift;endif;xcnt16:=“00000”;elsexcnt16:=xcnt16+1;state《=x_wait;endif;whenx_shift=》txds:=txdbuf(xbitcnt);xbitcnt:=xbitcnt+1;state《=x_wait;--狀態(tài)4,將待發(fā)數(shù)據(jù)進(jìn)行并串轉(zhuǎn)換whenx_stop=》--狀態(tài)5,停止位發(fā)送狀態(tài)ifxcnt16》=“01111”thenifxmit_cmd_p=‘0’thenstate《=x_idle;xcnt16:=“00000”;elsexcnt16:=xcnt16;state《=x_stop;endif;txd_done《=‘1’;elsexcnt16:=xcnt16+1;txds:=‘1’;state《=x_stop;endif;whenothers=》state《=x_idle;endcase;endif;txd《=txds;endprocess;endBehavioral;UART發(fā)送器的仿真波形如圖3所示。2.3接收模塊在接收數(shù)據(jù)寄存器被讀出一幀數(shù)據(jù)或系統(tǒng)開始工作之后,接收過程被啟動。接收過程啟動之后,等待檢測起始位。檢測到有效的起始位后,根據(jù)高于數(shù)據(jù)速率的時(shí)鐘同步開始接收數(shù)據(jù)。根據(jù)數(shù)據(jù)位數(shù)的設(shè)定,計(jì)數(shù)器統(tǒng)計(jì)接收位數(shù)。一幀數(shù)據(jù)接收完畢之后,如果使用校驗(yàn)位,則檢測校驗(yàn)位,否則接收停止位。停止位接收完畢,則設(shè)定接收狀態(tài)寄存器中接收完畢寄存器,同時(shí)產(chǎn)生接收中斷,通知控制器讀取。接收狀態(tài)機(jī)的實(shí)現(xiàn)與發(fā)送部分類似,限于篇幅,在這里不再敘述。在具體實(shí)現(xiàn)接收部分電路的時(shí)候,我們采用的是基于高速多倍率采樣的方法。比如將采樣速率設(shè)置在三倍信息速率上,就是以三倍于波特率的頻率對接收引腳Rx進(jìn)行采樣,這樣既保證檢測到“起始位”,又可以調(diào)整采樣的時(shí)間間隔。將有效數(shù)據(jù)位的采樣點(diǎn)控制在碼元的中間1/3處,最大限度地減少誤碼,提高接收的準(zhǔn)確性。圖4是該方法的示意圖,在圖中為了分析方便,將起始位和部分?jǐn)?shù)據(jù)位放大,把每個(gè)信息位分為三等份,每等份的時(shí)間寬度設(shè)為TS。以三倍頻對信息位進(jìn)行采樣時(shí),每個(gè)信息位都將可能被采樣到三次。當(dāng)處于空閑狀態(tài)并檢測起始位時(shí),盡管每次具體的采樣點(diǎn)會在S0區(qū)。檢測到起始位低電平后,間隔4×TS時(shí)間,正好是第一位數(shù)據(jù)位的中間1/3部分S1區(qū),即箭頭所指部位。此后的數(shù)據(jù)位、校驗(yàn)位和停止位的采樣間隔都是3×TS,當(dāng)所有采樣點(diǎn)均落在碼元的中間1/3部分時(shí),采樣數(shù)據(jù)最可靠。3、結(jié)束語用FPGA實(shí)現(xiàn)UART功能,可以減小系統(tǒng)的面積,降低系統(tǒng)的功耗,提高系統(tǒng)的穩(wěn)定性,這種硬件軟件化的方法已經(jīng)成為當(dāng)今電子設(shè)計(jì)領(lǐng)域中的主導(dǎo)趨勢。在實(shí)際應(yīng)用中,我們將文中實(shí)現(xiàn)的UART電路作為一個(gè)功能塊嵌入到一個(gè)FPGA

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論