Verilog實現(xiàn)串口通信(好)_第1頁
Verilog實現(xiàn)串口通信(好)_第2頁
Verilog實現(xiàn)串口通信(好)_第3頁
Verilog實現(xiàn)串口通信(好)_第4頁
Verilog實現(xiàn)串口通信(好)_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、eainthea.i.etnv gain.man.- e.tan.r eporti n-achpostsoudbedilope du.eahiassemspecial ceclealexaminal ostmyc an-teeevaitigUabnsSte.ten” Heupe-s mai deami nato, .e cadttgael .mma nd, alpea.nsadVoi aosoeati ng - "n yeea>"prid_Ii n “ecn a. ement,e qUpme.acae sa - o- nead . nts sxs.la ccrU ,.

2、"e - entiflee cuiyi .,“,”-e OdlfCuly"eve" “,i gilkuieFPGA實現(xiàn)串行接口 RS232時間:2007-06-29 來源: 作者:點擊:26463 字體大?。骸敬?中 小】EEI3C3-串行接口(RS-232)串行接口是連接FPGA和PC機的一種簡單方式。這個項目向大家展示了如果使用FPGA來創(chuàng)建RS-232收發(fā)器。我dat/h hAsync ReceiverAsync Transrnitter lassal Lln_Imtingirgaiz>nn>s-e scca - fimsemesa ndusie

3、 -rsst ha-usteduisiedit helepame'ipepimine .nnaaeyc,e:eecI>alIaSl”Ia notesope3ardig ite-e-fhehazadUe.nbunitiubi elil.”.nfirmeat整個項目包括5個部分RS232是怎樣工作的如何產(chǎn)生需要的波特率發(fā)送模塊接收模塊應(yīng)用實例RS-232接口是怎樣工作的作為標(biāo)準(zhǔn)設(shè)備,大多數(shù)的計算機都有1到2個RS-232串口特性RS-232有下列特性:使用9針的"DB-9"插頭(舊式計算機使用25針的"DB-25"插頭).允許全雙工的雙向通訊(

4、也就是說計算機可以在接收數(shù)據(jù)的同時發(fā)送數(shù)據(jù) ).最大可支持的傳輸速率為10KBytes/s.DB-9插頭你可能已經(jīng)在你的計算機背后見到過這種插頭它一共有9個引腳,但是最重要的3個引腳是:引腳2: RxD (接收數(shù)據(jù)).引腳3: TxD (發(fā)送數(shù)據(jù)).弓I腳5: GND (地).僅使用3跟電纜,你就可以發(fā)送和接收數(shù)據(jù).串行通訊數(shù)據(jù)以每次一位的方式傳輸;每條線用來傳輸一個方向的數(shù)據(jù)。由于計算機通常 至少需要若干位數(shù)據(jù),因此數(shù)據(jù)在發(fā)送之前先 串行化”。通常是以8位數(shù)據(jù)為1 組的。先發(fā)送最低有效位,最后發(fā)送最高有效位。異步通訊RS-232使用異步通訊協(xié)議。也就是說數(shù)據(jù)的傳輸沒有時鐘信號。接收端必須有某

5、種方式,使之與接收數(shù)據(jù)同步。對于RS-232來說,是這樣處理的:串行線纜的兩端事先約定好用行傳輸?shù)膮?shù)(傳輸速度、傳輸格式等)當(dāng)沒有數(shù)據(jù)傳輸?shù)臅r候,發(fā)送端向數(shù)據(jù)線上發(fā)送 “1”每傳輸一個字節(jié)之前,發(fā)送端先發(fā)送一個"0”來表示傳輸已經(jīng)開始。這樣接收端 便可以知道有數(shù)據(jù)到來了。開始傳輸后,數(shù)據(jù)以約定的速度和格式傳輸,所以接收端可以與之同步每次傳輸完成一個字節(jié)之后,都在其后發(fā)送一個停止位(“1")讓我們來看看0x55是如何傳輸?shù)模簂ine rs idleline is idfe again0x55的二進制表示為:。但是由于先發(fā)送的是最低有效位,所以發(fā)送序列是這樣的:1-0-1-0

6、-1-0-1-0.下面是另外一個例子:1IF1Iyline is idlestart ( shopline is idle againbit brt0bft傳輸?shù)臄?shù)據(jù)為0xC4,你能看出來嗎?從圖中很難看出來所傳輸?shù)臄?shù)據(jù),這也說明了事先知道傳輸?shù)乃俾蕦τ诮邮斩擞?多么重要。數(shù)據(jù)傳輸可以多快?數(shù)據(jù)的傳輸速度是用波特來描述的,亦即每秒鐘傳輸?shù)臄?shù)據(jù)位,例如 1000波特 表示每秒鐘傳輸1000比特的數(shù)據(jù),或者說每個數(shù)據(jù)位持續(xù)1毫秒。波特率不是隨意的,必須服從一定的標(biāo)準(zhǔn),如果希望設(shè)計波特的RS-232接口,對不起,你很不幸運,這是不行的。常用的串行傳輸速率值包括以下幾種:1200波特.9600波特.3

7、8400波特.波特(通常情況下是你可以使用的最高速度).在波特傳輸速度下,每位數(shù)據(jù)持續(xù)(1/) = 8.7巴s如果傳輸8位數(shù)據(jù),共持續(xù)8 x 8.7仙=69但是每個字節(jié)的傳輸又要求額外的開始位”和 停止位”所以實際上需要花費10 x 8.7 ps= 87ps的時間。最大的有效數(shù)據(jù)傳輸率只能達到11.5KBytes 每秒。在波特傳輸速度下,一些使用了不好的芯片的計算機要求一個長的停止位(1.5或2位數(shù)據(jù)的長度),這使得最大傳輸速度降到大約10.5KBytes每秒物理層電纜上的信號使用正負電壓的機制:"1"用-10V的電壓表示(或者在-5V與-15V之間的電壓)."0

8、"用+10V的電壓表示(或者在5V與15V之間的電壓).所以沒有數(shù)據(jù)傳輸?shù)碾娎|上的電壓應(yīng)該為-10V或-5到-10之間的某個電壓。eainthea cci denti nvestigation,managementandr eporti ng,eachpostshoul dbedevel ope dunderthissystemspecialistscheck,cl eartheexaminations,time,cy clesa ndot herreleva ntregulations.Strengthe ning sitesupervisi onandexamination,t

9、odete ctandinvestigateillegalcomma nd,illegaloperationsandviolationsofoperatingrules.Secondsafetyreferstotheement,e qui pment,facilities,andsoonca nleadt oaccidentsrisk sexist.1,a ccordi ngtotheextentofthese curityri sks,solvingi sdivi dedi ntoa,b,andclevelsofdifficulty;A-level:difficult,mini ngdiff

10、icultie波特率發(fā)生器這里我們使用串行連接的最大速度波特,其他較慢的波特也很容易由此產(chǎn)生。FPGA通常運行在遠高于Hz的時鐘頻率上(對于今天的標(biāo)準(zhǔn)的來說 RS-232真是太慢了) , 這就意味著我們需要用一個較高的時鐘來分頻產(chǎn)生盡量接近于Hz 的時鐘信號。從 1.8432MHz 的時鐘產(chǎn)生通常 RS-232 芯片使用1.8432MHz 的時鐘, 以為這個時鐘很容易產(chǎn)生標(biāo)準(zhǔn)的波特率,所以我們假設(shè)已經(jīng)擁有了一個這樣的時鐘源。只需要將1.8432MHz 16分頻便可得到Hz 的時鐘,多方便啊!reg 3:0 BaudDivCnt;always (posedge clk) BaudDivCnt &

11、lt;= BaudDivCnt + 1;wire BaudTick = (BaudDivCnt=15);所以 "BaudTick" 每 16個時鐘周期需要置位一次,從而從1.8432MHz 的時鐘得到 Hz 的時鐘。從任意頻率產(chǎn)生早期的發(fā)生器假設(shè)使用1.8432MHz 的時鐘。但如果我們使用2MHz 的時鐘怎么辦呢?要從2MHz 的時鐘得到Hz, 需要將時鐘"17 " 分頻, 并不是一個整數(shù)。我的解決辦法是有時候17分頻, 有時候 18分頻, 使得整體的分頻比保持在"17."。這是很容易做到的。下面是實現(xiàn)這個想法的C 語言代碼:whi

12、le(1) / 死循環(huán)acc += ;if(acc >=) printf("*"); else printf(" ");acc %= ;這段代碼會精確的以平均每"17" 個時鐘間隔打印出一個"*" 。為了從FPGA得到同樣的效果,考慮到串行接口可以容忍一定的波特率誤差,所以即使我們使用17.3或者 17.4這樣的分頻比也是沒有關(guān)系的。FPGA波特率發(fā)生器我們希望是2 的整數(shù)冪,但很可惜,它不是。所以我們改變分頻比,"/" 約等于“1024/59" = 17.356.這跟我們要求的

13、分頻比很接近,并且使得在 FPGA上實現(xiàn)起 來相當(dāng)有效。/10 位的累加器(9:0), 1 位進位輸出(10)reg 10:0 acc; /一共11 位 !always (posedge clk)acc <= acc9:0 + 59; /我們使用上一次結(jié)果的低10位,但是保留11 位結(jié)果wire BaudTick = acc10; /第 11 位作為進位輸出使用 2MHz 時鐘 , "BaudTick" 為 波特 , 跟理想的波特存在0.03% 的誤差。參數(shù)化的FPGA波特率發(fā)生器前面的設(shè)計我們使用的是10位的累加器,如果時鐘頻率提高的話,需要更多的 位數(shù)。下面是一個

14、使用25MHz時鐘和16位累加器的設(shè)計,該設(shè)計是參數(shù)化的,所以 很容易根據(jù)具體情況修改。parameter ClkFrequency = ; / 25MHzparameter Baud =;parameter BaudGeneratorAccWidth = 16;parameter BaudGeneratorInc = (Baud<<BaudGeneratorAccWidth)/ClkFrequency;reg BaudGeneratorAccWidth:。 BaudGeneratorAcc;always (posedge clk)BaudGeneratorAcc <= Ba

15、udGeneratorAccBaudGeneratorAccWidth-1:0 + BaudGeneratorInc;wire BaudTick = BaudGeneratorAccBaudGeneratorAccWidth;上面的設(shè)計中存在一個錯誤:"BaudGeneratorInc"的計算是錯誤的,因為 Verilog使用32位的默認結(jié)果,但實際計算過程中的某些數(shù)據(jù)超過了 32位,所以改變 一種計算方法。ParameterBaudGeneratorInc(Baud<<(BaudGeneratorAccWidth-4)+(ClkFrequency>>

16、;5)/(ClkFrequency>>4);這行程序也使得結(jié)果成為整數(shù),從而避免截斷。這就是整個的設(shè)計方法了?,F(xiàn)在我們已經(jīng)得到了足夠精確的波特率,可以繼續(xù)設(shè)計用行接收和發(fā)送模塊了。RS-232發(fā)送模塊下面是我們所想要實現(xiàn)的:/二,TxD start法 liz erAsync Transmitter它應(yīng)該能像這樣工作:發(fā)送器接收8位的數(shù)據(jù),并將其用行輸出。("TxD_start”置位后開始傳輸). 當(dāng)有數(shù)傳輸?shù)臅r候,使"busy”信號有效,此時“TxD_startW號被忽略. RS-232模塊的參數(shù)是固定的:8位數(shù)據(jù),2個停止位,五奇偶校驗.數(shù)據(jù)申行化假設(shè)我們已經(jīng)

17、有了一個波特的"BaudTick”信號.我們需要產(chǎn)生開始位、8位數(shù)據(jù)以及停止位。用狀態(tài)機來實現(xiàn)看起來比較合適。reg 3:0 state;always (posedge clk)case(state)4'b0000: if(TxD_start) state <= 4'b0100;4'b0100: if(BaudTick) state <= 4'b1000; / 開始位4'b1000: if(BaudTick) state <= 4'b1001; / bit 0lullssalcinnatmii ngirgaizlinn

18、as acca - fima-esandusle isrSst h_usledu>s>edlt hepame"peplmine unaaey,e ctla asi".n|J_a nuIeS ope3a ccrdlg ilesnelylheha zadlle dlbbunltiubi eliil n.iaa lnfirm teainthea _l deti nv - ga.n,ma.eme.an.,eH n.- c.” .oude.eve ope dus s. he-learthe m.aiostmy cesa ndot heeeva nf.nsS.e nghe

19、. s.pe i maniexmi nato, .-e,ndiv - g l egacmma n”、a>peao - dv>iaosoeat ngr - aSnfey - s."prduci emente qUpmet,aCie. . nd . ntsakcodi ngotheexe ntiflee .yis - ssg ." n"a"n.c eVSifilkulyAl . 一 "”.“ He4'b1001: if(BaudTick) state <= 4'b1010; / bit 14'b1010:

20、if(BaudTick) state <= 4'b1011; / bit 24'b1011: if(BaudTick) state <= 4'b1100; / bit 34'b1100: if(BaudTick) state <= 4'b1101; / bit 44'b1101: if(BaudTick) state <= 4'b1110; / bit 54'b1110: if(BaudTick) state <= 4'b1111; / bit 64'b1111: if(BaudTic

21、k) state <= 4'b0001; / bit 74'b0001: if(BaudTick) state <= 4'b0010; / 停止位 14'b0010: if(BaudTick) state <= 4'b0000; / 停止位 2default: if(BaudTick) state <= 4'b0000; endcase注意看這個狀態(tài)機是怎樣實現(xiàn)當(dāng)"TxD_start”有效就開始,但只在"BaudTick"有效的時候才轉(zhuǎn)換狀態(tài)的。.現(xiàn)在,我們只需要產(chǎn)生"TxD”輸出即

22、可.reg muxbit;always (state2:0)case(state2:0)0: muxbit <= TxD_data0;1: muxbit <= TxD_data1;2: muxbit <= TxD_data2;3: muxbit <= TxD_data3;4: muxbit <= TxD_data4;5: muxbit <= TxD_data5;6: muxbit <= TxD_data6;7: muxbit <= TxD_data7; endcase/將開始位、數(shù)據(jù)以及停止位結(jié)合起來assign TxD = (state<

23、4) | (state3 & muxbit);RS232接收模塊下面是我們想要實現(xiàn)的模塊:|se ria 厄 erdata*d.IcJata_read/Async Receiver我們的設(shè)計目的是這樣的:1 .當(dāng)RxD線上有數(shù)據(jù)時,接收模塊負責(zé)識別RxD線上的數(shù)據(jù)2 .當(dāng)收到一個字節(jié)的數(shù)據(jù)時,鎖存接收到的數(shù)據(jù)到"data"總線,并使"data ready1有效一個周期。注意:只有當(dāng)"data_ready'方效時,"data”總線的數(shù)據(jù)才有效,其他的時間里不要 使用"data”總線上的數(shù)據(jù),因為新的數(shù)據(jù)可能已經(jīng)改變了其中

24、的部分數(shù)據(jù)。過采樣異步接收機必須通過一定的機制與接收到的輸入信號同步(接收端沒有辦法得到 發(fā)送斷的時鐘)。這里采用如下辦法。1 .為了確定新數(shù)據(jù)的到來,即檢測開始位,我們使用幾倍于波特率的采樣時鐘對接收到的信號進行采樣。2 .一旦檢測到"開始位",再將采樣時鐘頻率降為已知的發(fā)送端的波特率。典型的過采樣時鐘頻率為接收到的信號的波特率的16 倍,這里我們使用8 倍的采樣時鐘。當(dāng)波特率為時,采樣時鐘為Hz。假設(shè)我們已經(jīng)有了一個8倍于波特率的時鐘信號”Baud8Tick”,其頻率為Hz。具體設(shè)計首先, 接受到的 "RxD" 信號與我們的時鐘沒有任何關(guān)系,所以采用

25、兩個D 觸發(fā)器對其進行過采樣,并且使之與我們的時鐘同步。reg 1:0 RxD_sync;always (posedge clk) if(Baud8Tick) RxD_sync <= RxD_sync0, RxD;首先我們對接收到的數(shù)據(jù)進行濾波,這樣可以防止毛刺信號被誤認為是開始信號。reg 1:0 RxD_cnt;reg RxD_bit;always (posedge clk)if(Baud8Tick)beginif(RxD_sync1 && RxD_cnt!=2'b11) RxD_cnt <= RxD_cnt + 1;elseif(RxD_sync1 &

26、amp;& RxD_cnt!=2'b00) RxD_cnt <= RxD_cnt - 1;if(RxD_cnt=2'b00) RxD_bit <= 0;elseif(RxD_cnt=2'b11) RxD_bit <= 1;end一旦檢測到"開始位",使用如下的狀態(tài)機可以檢測出接收到每一位數(shù)據(jù)。reg 3:0 state;always (posedge clk)if(Baud8Tick)case(state)4'b0000: if(RxD_bit) state <= 4'b1000; / start bi

27、t found?4'b1000: if(next_bit) state <= 4'b1001; / bit 04'b1001: if(next_bit) state <= 4'b1010; / bit 14'b1010: if(next_bit) state <= 4'b1011; / bit 24'b1011: if(next_bit) state <= 4'b1100; / bit 34'b1100: if(next_bit) state <= 4'b1101; / bit 44&

28、#39;b1101: if(next_bit) state <= 4'b1110; / bit 54'b1110: if(next_bit) state <= 4'b1111; / bit 64'b1111: if(next_bit) state <= 4'b0001; / bit 74'b0001: if(next_bit) state <= 4'b0000; / stop bitdefault: state <= 4'b0000;endcase注意,我們使用了"next_bit"

29、; 來遍歷所有數(shù)據(jù)位。eainthea cci denti nvestigation,managementandr eporti ng,eachpost shoul dbedevel ope dunderthissystemspecialistscheck,cl eartheexaminati ons,time,cy clesa ndot herreleva ntregulations.Stre ngthe ning sitesupervisi onandexami nation,t odete ctandinvestigateill egalcomma nd,illegaloperation

30、sandviolationsofoperati ngrules.Secondsafetyreferstotheproducti onsite,technologymanagement,e qui pment,facilitie s,andsoonca nleadt oaccidentsrisk sexist.1,a ccordi ngtotheexte ntofthese curityri sks,solvingi sdivi dedi ntoa,b,andcl evelsofdifficulty;A-l evel:difficult,mini ngdifficultie s,shallbereportedtothecompany'sproblems.B-class:difficulttoresolvedifreg 2:0 bit_spacing;always (posedge clk)if(state=0)bit_spacing <= 0;elseif(Baud8Tick)bit_spacing <= bit_spacing + 1;wire

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論