基于FPGA的串口通信設(shè)計(jì)_第1頁
基于FPGA的串口通信設(shè)計(jì)_第2頁
基于FPGA的串口通信設(shè)計(jì)_第3頁
基于FPGA的串口通信設(shè)計(jì)_第4頁
基于FPGA的串口通信設(shè)計(jì)_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、基于FPGA的UART設(shè)計(jì)與實(shí)現(xiàn)0引言通用異步收發(fā)器(Universal Asynchronous ReceiverTransmitter,UART)可以和各種標(biāo)準(zhǔn)串行接口,如RS 232和RS 485等進(jìn)行全雙工異步通信,具有傳輸距離遠(yuǎn)、成本低、可靠性高等優(yōu)點(diǎn)。一般UART由專用芯片如8250,16450來實(shí)現(xiàn),但專用芯片引腳都較多,內(nèi)含許多輔助功能,在實(shí)際使用時(shí)往往只需要用到UART的基本功能,使用專用芯片會(huì)造成資源浪費(fèi)和成本提高。一般而言UART和外界通信只需要兩條信號(hào)線RXD和TXD,其中RXD是UART的接收端,TXD是UART的發(fā)送端,接收與發(fā)送是全雙工形式。由于可編程邏輯器件技術(shù)

2、的快速發(fā)展,F(xiàn)PGA的功能日益強(qiáng)大,其開發(fā)周期短、可重復(fù)編程的優(yōu)點(diǎn)也越來越明顯,在FPGA芯片上集成UART功能模塊并和其他模塊組合可以很方便地實(shí)現(xiàn)一個(gè)能與其他設(shè)備進(jìn)行串行通信的片上系統(tǒng)。FPGA(Field Programmable Gate Array)現(xiàn)場(chǎng)可編程門陣列在數(shù)字電路的設(shè)計(jì)中已經(jīng)被廣泛使用。這種設(shè)計(jì)方式可以將以前需要多塊集成芯片的電路設(shè)計(jì)到一塊大模塊可編程邏輯器件中,大大減少了電路板的尺寸,增強(qiáng)了系統(tǒng)的可靠性和設(shè)計(jì)的靈活性。1 UART 功能設(shè)計(jì)1.1 UART的工作原理異步通信時(shí),UART發(fā)送接收數(shù)據(jù)的傳輸格式表1所示,一個(gè)字符單位由開始位、數(shù)據(jù)位、停止位組成。表1 UART

3、發(fā)送接收數(shù)據(jù)的傳輸格式STARTD0D1D2D3D4D5D6D7PSTOP起始位數(shù) 據(jù) 位較驗(yàn)位停止位異步通信的一幀傳輸經(jīng)歷以下步驟:(1)無傳輸。發(fā)送方連續(xù)發(fā)送信號(hào),處于信息“1”狀態(tài)。(2)起始傳輸。發(fā)送方在任何時(shí)刻將傳號(hào)變成空號(hào),即“1”跳變到“O”,并持續(xù)1位時(shí)間表明發(fā)送方開始傳輸數(shù)據(jù)。而同時(shí),接收方收到空號(hào)后,開始與發(fā)送方同步,并期望收到隨后的數(shù)據(jù)。(3)奇偶傳輸。數(shù)據(jù)傳輸之后是可供選擇的奇偶位發(fā)送或接收。(4)停止傳輸。最后是發(fā)送或接收的停止位,其狀態(tài)恒為“1”。發(fā)送或接收一個(gè)完整的字節(jié)信息,首先是一個(gè)作為起始位的邏輯“0”位,接著是8個(gè)數(shù)據(jù)位,然后是停止位邏輯“1”位,數(shù)據(jù)線空閑

4、時(shí)為高或“1”狀態(tài)。起始位和停止位的作用是使接收器能把局部時(shí)鐘與每個(gè)新開始接收的字符再同步。異步通信沒有可參照的時(shí)鐘信號(hào),發(fā)送器可以隨時(shí)發(fā)送數(shù)據(jù),任何時(shí)刻串行數(shù)據(jù)到來時(shí),接收器必須準(zhǔn)確地發(fā)現(xiàn)起始位下降沿的出現(xiàn)時(shí)間,從而正確采樣數(shù)據(jù)。設(shè)計(jì)時(shí)可參考由專用芯片實(shí)現(xiàn)的UART的功能并進(jìn)行一定精簡(jiǎn),如可以用FPGA的片內(nèi)RAM替代UART的FIFO,不用單獨(dú)在UART模塊中實(shí)現(xiàn)。設(shè)計(jì)的基本原則是保留最主要的功能,基于FPGA的UART系統(tǒng)波特率時(shí)鐘發(fā)生器、接收器和發(fā)送器3個(gè)子模塊組成,如圖1所示。圖1 基于FPGA的UART組成模塊1.2 接收器設(shè)計(jì) 接收器的工作過程如下,如圖2所示,在接收數(shù)據(jù)寄存器被

5、讀出一幀數(shù)據(jù)或系統(tǒng)開始工作以后,接收進(jìn)程被啟動(dòng)。接收進(jìn)程啟動(dòng)之后,檢測(cè)起始位,檢測(cè)到有效起始位后,以約定波特率的時(shí)鐘開始接收數(shù)據(jù),根據(jù)數(shù)據(jù)位數(shù)的約定,計(jì)數(shù)器統(tǒng)計(jì)接收位數(shù)。一幀數(shù)據(jù)接收完畢之后,如果使用了奇偶校驗(yàn),則檢測(cè)校驗(yàn)位,如無誤則接收停止位。停止位接收完畢后,將接收數(shù)據(jù)轉(zhuǎn)存到數(shù)據(jù)寄存器中。圖2 數(shù)據(jù)接收?qǐng)D為確保接收器可靠工作,在接收端開始接收數(shù)據(jù)位之前,處于搜索狀態(tài),這時(shí)接收端以16倍波特率的速率讀取線路狀態(tài),檢測(cè)線路上出現(xiàn)低電平的時(shí)刻。因?yàn)楫惒絺鬏數(shù)奶攸c(diǎn)是以起始位為基準(zhǔn)同步的。然而,通信線上的噪音也極有可能使傳號(hào)“1”跳變到空號(hào)“0”。所以接收器以16倍的波特率對(duì)這種跳變進(jìn)行檢測(cè),直至在

6、連續(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ù)位的中央。由于在起始位檢測(cè)時(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)行檢測(cè),若正確檢測(cè)到高電平,說明本幀的各位正確接收完畢,將數(shù)據(jù)轉(zhuǎn)存到數(shù)據(jù)寄存器中,否則出錯(cuò)。采用有限狀態(tài)機(jī)模型可以更清晰明確地描述接收器的

7、功能,便于代碼實(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)作見圖中的文字說明。圖3 接收器狀態(tài)轉(zhuǎn)換圖根據(jù)狀態(tài)圖其主要的程序如下所示:else if( RX_En_Sig ) case ( i ) 4'd0 : if( H2L_Sig ) begin i <= i + 1'b1; isCount <= 1'b1; end 4'd1 : if( BPS_CLK ) begin i <=

8、 i + 1'b1; end 4'd2, 4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8, 4'd9 : if( BPS_CLK ) begin i <= i + 1'b1; rData i - 2 <= RX_Pin_In; end 4'd10 : if( BPS_CLK ) begin i <= i + 1'b1; end 4'd11 : if( BPS_CLK ) begin i <= i + 1'b1; end 4'd12

9、 : begin i <= i + 1'b1; isDone <= 1'b1; isCount <= 1'b0; end 4'd13 : begin i <= 4'd0; isDone <= 1'b0; end endcase其中起始位檢測(cè)正確會(huì)觸發(fā)RX_En_Sig,一次的定時(shí)采集時(shí)第 0 、1位數(shù)據(jù)(起始位),保持忽略態(tài)度。定時(shí)采集的是八位數(shù)據(jù)位,每一位數(shù)據(jù)位會(huì)依低位到最高位儲(chǔ)存入 rData寄存器。此時(shí)程序前兩位省略取2-9位就是傳送的數(shù)據(jù)1.3波特率發(fā)生器設(shè)計(jì)波特率發(fā)生器實(shí)質(zhì)是設(shè)計(jì)一個(gè)分頻器,用于產(chǎn)生和RS

10、232通信同步的時(shí)鐘。在系統(tǒng)中用一個(gè)計(jì)數(shù)器來完成這個(gè)功能,分頻系數(shù)N決定了波特率的數(shù)值。該計(jì)數(shù)器一般工作在一個(gè)頻率較高的系統(tǒng)時(shí)鐘下,當(dāng)計(jì)數(shù)到N2時(shí)將輸出置為高電平,再計(jì)數(shù)到N2的數(shù)值后將輸出置為低電平,如此反復(fù)即可得到占空比50的波特率時(shí)鐘,具體的波特率依賴于所使用的系統(tǒng)時(shí)鐘頻率和N的大小。如系統(tǒng)時(shí)鐘頻率是50 MHz,要求波特率是9600,N=1/50MHz=5208,如果從零開始算起就是5207個(gè)計(jì)數(shù)。然而,采集數(shù)據(jù)要求“在周期的中間”,那么結(jié)果是5208/2,結(jié)果等于2604?;旧蟫x_bps_module.v只有在Count_Sig拉高的時(shí)候,模塊才開始計(jì)數(shù)。利用verlog 所寫的

11、具體代碼如下:module rx_bps_module( CLK, RSTn, Count_Sig, BPS_CLK); input CLK; input RSTn; input Count_Sig; output BPS_CLK; /*/ reg 12:0Count_BPS; always ( posedge CLK or negedge RSTn ) if( !RSTn ) Count_BPS <= 13'd0; else if( Count_BPS = 13'd5207 ) Count_BPS <= 13'd0; else if( Count_Sig

12、) Count_BPS <= Count_BPS + 1'b1; else Count_BPS <= 13'd0; /*/ assign BPS_CLK = ( Count_BPS = 12'd2604 ) ? 1'b1 : 1'b0; /*/endmodule1.4發(fā)送器設(shè)計(jì) 圖4發(fā)送數(shù)據(jù)原理圖當(dāng)發(fā)送數(shù)據(jù)時(shí),對(duì)于每一個(gè)數(shù)據(jù)的發(fā)送,每一位采用的是定時(shí)發(fā)送。假設(shè),配置的波特率是9600bps,那么當(dāng)有一個(gè)發(fā)送標(biāo)志位時(shí),數(shù)據(jù)將會(huì)以1/9600 的節(jié)拍將數(shù)據(jù)一位一位的發(fā)送出去。一幀數(shù)據(jù)有11位,需要12次定時(shí)。主要代碼為:always ( pose

13、dge CLK or negedge RSTn ) if( !RSTn ) begin i <= 4'd0; rTX <= 1'b1; isDone <= 1'b0;end else if( TX_En_Sig ) case ( i ) 4'd0 : if( BPS_CLK ) begin i <= i + 1'b1; rTX <= 1'b0; end 4'd1, 4'd2, 4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8 : if

14、( BPS_CLK ) begin i <= i + 1'b1; rTX <= TX_Data i - 1 ; end 4'd9 : if( BPS_CLK ) begin i <= i + 1'b1; rTX <= 1'b1; end 4'd10 : if( BPS_CLK ) begin i <= i + 1'b1; rTX <= 1'b1; end 4'd11 : if( BPS_CLK ) begin i <= i + 1'b1; isDone <= 1'b1

15、; end 4'd12 : begin i <= 4'd0; isDone <= 1'b0; end endcase2 數(shù)據(jù)傳輸仿真Modelsim仿真工具是Model公司開發(fā)的。它支持Verilog、VHDL以及他們的混合仿真,它可以將整個(gè)程序分步執(zhí)行,使設(shè)計(jì)者直接看到他的程序下一步要執(zhí)行的語句,而且在程序執(zhí)行的任何步驟任何時(shí)刻都可以查看任意變量的當(dāng)前值,可以在Dataflow窗口查看某一單元或模塊的輸入輸出的連續(xù)變化等,比quartus自帶的仿真器功能強(qiáng)大的多,是目前業(yè)界最通用的仿真器之一。2.1仿真串口發(fā)送模塊編寫一個(gè)仿真激勵(lì)程序用于單獨(dú)仿真串口發(fā)送模

16、塊。步驟0的時(shí)候,將數(shù)據(jù) 8'h2E 發(fā)送至串口發(fā)送模塊后使能串口發(fā)送模塊,然后等待串口發(fā)送模塊反饋完成信號(hào)。同樣的動(dòng)作也有 . 步驟1是發(fā)送數(shù)據(jù) 8'h3f, 然而步驟2是發(fā)送數(shù)據(jù) 8'hdd。步驟3是停止動(dòng)作圖5 發(fā)送數(shù)據(jù)仿真放大第二個(gè)數(shù)據(jù)0x3f的發(fā)送過程,如下圖所示??梢钥闯龃诎l(fā)送模塊,發(fā)送數(shù)據(jù)的格式是一幀11 位。0開始位-邏輯0,1:8數(shù)據(jù)位,9校驗(yàn)位沒有需要可以隨便填,這里填邏輯1,10停止位邏輯1。 圖6 發(fā)送過程仿真結(jié)果圖7 發(fā)送數(shù)據(jù)的延時(shí)仿真串口發(fā)送模塊配置的波特率是9600kbps ,所以一個(gè)數(shù)據(jù)逗留的時(shí)間是大約104us。在仿真結(jié)果中,在B0B

17、1 是數(shù)據(jù)0,B1B2 是數(shù)據(jù)1 . B10B11 是數(shù)據(jù)10。BxBx之間的時(shí)間大約是104us。2.2仿真串口接收模塊用串口發(fā)送模塊作為串口接收模塊的刺激,亦即串口接收模塊的輸入(復(fù)雜輸入)。用串口發(fā)送模塊作為串口接收模塊的刺激,亦即串口接收模塊的輸入(復(fù)雜輸入)。下圖是仿真虛擬環(huán)境env_rx_module.v 它組合了串口發(fā)送模塊和串口接收模塊。env_rx_module.v 擁有TX_En_Sig , TX_Data , TX_Done_Sig , RX_En_Sig, RX_Done_Sig,RX_Data 等信號(hào)。在激勵(lì)的過程中,需要對(duì)這些信號(hào)控制。圖8 接收模塊仿真建模圖當(dāng)RX

18、_En_Sig 拉高的時(shí)候,串口接收模塊開始準(zhǔn)備接收數(shù)據(jù)了。當(dāng)一幀11 位數(shù)據(jù)發(fā)送至串口接收模塊,并且被串口接收模塊過濾。最后經(jīng)過過濾的數(shù)據(jù)會(huì)輸出至RX_Data ,然后產(chǎn)生一個(gè)完成信號(hào)至RX_Done_Sig。(在這里數(shù)據(jù)格式四1 幀11 位,并且波特率為9600kbps。仿真結(jié)果如下圖所示:圖10 發(fā)送結(jié)果仿真圖上圖仿真結(jié)果顯示了“ 串口發(fā)送模塊作為串口接收模塊的刺激” 的激勵(lì)過程。( Cursor省略為C) 在C1C2之間是第一幀數(shù)據(jù)的傳送, C2C3是第二位 數(shù)據(jù)的傳送,其他的以此類推,然和 C1C12是一幀數(shù)據(jù)11位的傳送過程。注意,每 個(gè)CxCx之間的時(shí)間大約是104us,亦即96

19、00kbps的波特率3 結(jié)語本設(shè)計(jì)是基于FPGA的UART設(shè)計(jì),用時(shí)較少,邏輯消耗小,成熟穩(wěn)定的實(shí)現(xiàn)了數(shù)據(jù)的發(fā)送與接收,可以兼容到自己的程序中。本設(shè)計(jì)的仿真程序?qū)崿F(xiàn)了激勵(lì)的所有功能,完成初步設(shè)計(jì)要求。附錄1:發(fā)送模塊module tx_control_module( CLK, RSTn, TX_En_Sig, TX_Data, BPS_CLK, TX_Done_Sig, TX_Pin_Out ); input CLK; input RSTn; input TX_En_Sig; input 7:0TX_Data; input BPS_CLK; output TX_Done_Sig; output

20、 TX_Pin_Out; /*/ reg 3:0i; reg rTX; reg isDone; always ( posedge CLK or negedge RSTn ) if( !RSTn ) begin i <= 4'd0; rTX <= 1'b1; isDone <= 1'b0;end else if( TX_En_Sig ) case ( i ) 4'd0 : if( BPS_CLK ) begin i <= i + 1'b1; rTX <= 1'b0; end 4'd1, 4'd2, 4&

21、#39;d3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8 : if( BPS_CLK ) begin i <= i + 1'b1; rTX <= TX_Data i - 1 ; end 4'd9 : if( BPS_CLK ) begin i <= i + 1'b1; rTX <= 1'b1; end 4'd10 : if( BPS_CLK ) begin i <= i + 1'b1; rTX <= 1'b1; end 4'd11 : if

22、( BPS_CLK ) begin i <= i + 1'b1; isDone <= 1'b1; end 4'd12 : begin i <= 4'd0; isDone <= 1'b0; end endcase /*/ assign TX_Pin_Out = rTX; assign TX_Done_Sig = isDone; /*/ Endmodule附錄2:接收模塊:module rx_control_module( CLK, RSTn, H2L_Sig, RX_Pin_In, BPS_CLK, RX_En_Sig, Count

23、_Sig, RX_Data, RX_Done_Sig ); input CLK; input RSTn; input H2L_Sig; input RX_En_Sig; input RX_Pin_In; input BPS_CLK; output Count_Sig; output 7:0RX_Data; output RX_Done_Sig; /*/ reg 3:0i; reg 7:0rData; reg isCount; reg isDone; always ( posedge CLK or negedge RSTn ) if( !RSTn ) begin i <= 4'd0

24、; rData <= 8'd0; isCount <= 1'b0; isDone <= 1'b0; end else if( RX_En_Sig ) case ( i ) 4'd0 : if( H2L_Sig ) begin i <= i + 1'b1; isCount <= 1'b1; end 4'd1 : if( BPS_CLK ) begin i <= i + 1'b1; end 4'd2, 4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8, 4'd9 : if( BPS_CLK ) begin i <= i + 1'b1; rData i - 2 <= RX_Pin_In; end 4'd10 : if( BPS_CLK

溫馨提示

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

評(píng)論

0/150

提交評(píng)論