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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rè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實(shí)現(xiàn)串行接口 RS232時(shí)間:2007-06-29 來源: 作者:點(diǎn)擊:26463 字體大?。骸敬?中 小】EEI3C3-串行接口(RS-232)串行接口是連接FPGA和PC機(jī)的一種簡單方式。這個(gè)項(xiàng)目向大家展示了如果使用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整個(gè)項(xiàng)目包括5個(gè)部分RS232是怎樣工作的如何產(chǎn)生需要的波特率發(fā)送模塊接收模塊應(yīng)用實(shí)例RS-232接口是怎樣工作的作為標(biāo)準(zhǔn)設(shè)備,大多數(shù)的計(jì)算機(jī)都有1到2個(gè)RS-232串口特性RS-232有下列特性:使用9針的"DB-9"插頭(舊式計(jì)算機(jī)使用25針的"DB-25"插頭).允許全雙工的雙向通訊(

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

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

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

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

8、"用+10V的電壓表示(或者在5V與15V之間的電壓).所以沒有數(shù)據(jù)傳輸?shù)碾娎|上的電壓應(yīng)該為-10V或-5到-10之間的某個(gè)電壓。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通常運(yùn)行在遠(yuǎn)高于Hz的時(shí)鐘頻率上(對(duì)于今天的標(biāo)準(zhǔn)的來說 RS-232真是太慢了) , 這就意味著我們需要用一個(gè)較高的時(shí)鐘來分頻產(chǎn)生盡量接近于Hz 的時(shí)鐘信號(hào)。從 1.8432MHz 的時(shí)鐘產(chǎn)生通常 RS-232 芯片使用1.8432MHz 的時(shí)鐘, 以為這個(gè)時(shí)鐘很容易產(chǎn)生標(biāo)準(zhǔn)的波特率,所以我們假設(shè)已經(jīng)擁有了一個(gè)這樣的時(shí)鐘源。只需要將1.8432MHz 16分頻便可得到Hz 的時(shí)鐘,多方便??!reg 3:0 BaudDivCnt;always (posedge clk) BaudDivCnt &

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

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

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

14、使用25MHz時(shí)鐘和16位累加器的設(shè)計(jì),該設(shè)計(jì)是參數(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è)計(jì)中存在一個(gè)錯(cuò)誤:"BaudGeneratorInc"的計(jì)算是錯(cuò)誤的,因?yàn)?Verilog使用32位的默認(rèn)結(jié)果,但實(shí)際計(jì)算過程中的某些數(shù)據(jù)超過了 32位,所以改變 一種計(jì)算方法。ParameterBaudGeneratorInc(Baud<<(BaudGeneratorAccWidth-4)+(ClkFrequency>>

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

17、有了一個(gè)波特的"BaudTick”信號(hào).我們需要產(chǎn)生開始位、8位數(shù)據(jù)以及停止位。用狀態(tài)機(jī)來實(shí)現(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注意看這個(gè)狀態(tài)機(jī)是怎樣實(shí)現(xiàn)當(dāng)"TxD_start”有效就開始,但只在"BaudTick"有效的時(shí)候才轉(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接收模塊下面是我們想要實(shí)現(xiàn)的模塊:|se ria 厄 erdata*d.IcJata_read/Async Receiver我們的設(shè)計(jì)目的是這樣的:1 .當(dāng)RxD線上有數(shù)據(jù)時(shí),接收模塊負(fù)責(zé)識(shí)別RxD線上的數(shù)據(jù)2 .當(dāng)收到一個(gè)字節(jié)的數(shù)據(jù)時(shí),鎖存接收到的數(shù)據(jù)到"data"總線,并使"data ready1有效一個(gè)周期。注意:只有當(dāng)"data_ready'方效時(shí),"data”總線的數(shù)據(jù)才有效,其他的時(shí)間里不要 使用"data”總線上的數(shù)據(jù),因?yàn)樾碌臄?shù)據(jù)可能已經(jīng)改變了其中

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

25、兩個(gè)D 觸發(fā)器對(duì)其進(jìn)行過采樣,并且使之與我們的時(shí)鐘同步。reg 1:0 RxD_sync;always (posedge clk) if(Baud8Tick) RxD_sync <= RxD_sync0, RxD;首先我們對(duì)接收到的數(shù)據(jù)進(jìn)行濾波,這樣可以防止毛刺信號(hào)被誤認(rèn)為是開始信號(hào)。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一旦檢測(cè)到"開始位",使用如下的狀態(tài)機(jī)可以檢測(cè)出接收到每一位數(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等.壓縮文件請(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)論