EDA課程設(shè)計實驗_第1頁
EDA課程設(shè)計實驗_第2頁
EDA課程設(shè)計實驗_第3頁
EDA課程設(shè)計實驗_第4頁
EDA課程設(shè)計實驗_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

PAGEPAGE2EDA課程設(shè)計實驗報告題目:全雙工UART電路的設(shè)計院系:XXXXXXX學(xué)院班級:XXXXXXX工程學(xué)號:XXXXXXXXX姓名:張XXXX指導(dǎo)老師:林XXXX時間:2012-05-29目錄1設(shè)計要求 12UART設(shè)計 22.1UART結(jié)構(gòu) 22.2UART的幀格式 33UART的VerilogHDL語言設(shè)計 43.1UART分頻器 43.2UART發(fā)送模塊 53.3UART的接收模塊 103.4UART的硬件測試 144總結(jié) 161設(shè)計要求一、設(shè)計一個全雙工UART電路,具體要求如下:支持?jǐn)?shù)據(jù)格式:起始位(1bit)+數(shù)據(jù)(8bit)+奇偶校驗位(1bit)+終止位(1bit)奇/偶校驗可配置可配置支持115200以下的常見波特率支持115200以下的波特率自適應(yīng),自適應(yīng)過程如下:復(fù)位后,UART首先接收輸入,不斷自動調(diào)整波特率,直到以一定波特率正確連續(xù)接收到3個bytes的0x55接著UART以此波特率連續(xù)發(fā)送3個bytes0xaa之后兩端以此波特率進(jìn)行通信波特率自適應(yīng)只在電路復(fù)位后進(jìn)行一次,如欲再次自適應(yīng)波特率應(yīng)對電路再次復(fù)位波特率自適應(yīng)過程中不能對UART的波特率作任何設(shè)置,自適應(yīng)完成后可以對波特率作設(shè)置自動計算校驗位用于發(fā)送數(shù)據(jù);對接收到的校驗位和數(shù)據(jù)進(jìn)行校驗,發(fā)現(xiàn)錯誤應(yīng)設(shè)置錯誤標(biāo)志,并丟棄數(shù)據(jù)對接收不正常數(shù)據(jù)(如無終止位、無校驗位、數(shù)據(jù)位數(shù)不正確等)應(yīng)能自動識別并設(shè)置錯誤標(biāo)志、丟棄額外任何你認(rèn)為有用又可以實現(xiàn)的功能二、設(shè)計工具:1)所有電路采用VerilogHDL或原理圖方法進(jìn)行設(shè)計2)在QuartusII下進(jìn)行設(shè)計3)綜合和仿真可以采用其他工具,如綜合可以采用Synplify,仿真可以采用ModelSim4)目標(biāo)器件采用與實驗箱相同的器件2UART設(shè)計通常設(shè)計數(shù)字電路大都采用自頂向下將系統(tǒng)按功能逐層分割的層次化設(shè)計方法,這比傳統(tǒng)自下向上的EDA設(shè)計方法有更明顯的優(yōu)勢(當(dāng)時的主要設(shè)計文件是電路圖)。因為由自頂向下的設(shè)計過程可以看出,從總體行為設(shè)計開始到最終邏輯綜合,形成網(wǎng)絡(luò)表為止。每一步都要進(jìn)行仿真檢查,這樣有利于盡早發(fā)現(xiàn)系統(tǒng)設(shè)計中存在的問題,從而可以大大縮短系統(tǒng)硬件的設(shè)計周期。UART(即UniversalAsynchronousReceiverTransmitter通用異步收發(fā)器)是一種應(yīng)用廣泛的短距離串行傳輸接口。UART允許在串行鏈路上進(jìn)行全雙工的通信。串行外設(shè)用到的RS232-C異步串行接口,一般采用專用的集成電路即UART實現(xiàn)。如8250、8251、NS16450等芯片都是常見的UART器件,這類芯片已經(jīng)相當(dāng)復(fù)雜,有的含有許多輔助的模塊(如FIFO),有時我們不需要使用完整的UART的功能和這些輔助功能。或者設(shè)計上用到了FPGA/CPLD器件,那么我們就可以將所需要的UART功能集成到FPGA內(nèi)部。使用VHDL將UART的核心功能集成,從而使整個設(shè)計更加緊湊、穩(wěn)定且可靠。本文應(yīng)用EDA技術(shù),基于FPGA/CPLD器件設(shè)計與實現(xiàn)UART。2.1UART結(jié)構(gòu)

UART主要有由數(shù)據(jù)總線接口、控制邏輯、波特率發(fā)生器、發(fā)送部分和接收部分等組成。本設(shè)計主要設(shè)計UART中最重要的發(fā)送部分和接收部分,結(jié)構(gòu)如下圖2-1-1:圖2-1-12.2UART的幀格式UART的幀格式如圖2-2-1圖2-2-1發(fā)送數(shù)據(jù)過程:空閑狀態(tài),線路處于高電位;當(dāng)收到發(fā)送數(shù)據(jù)指令后,拉低線路一個數(shù)據(jù)位的時間T,接著數(shù)據(jù)按低位到高位依次發(fā)送,數(shù)據(jù)發(fā)送完畢后,接著發(fā)送奇偶校驗位和停止位(停止位為高電位),一幀資料發(fā)送結(jié)束。接收數(shù)據(jù)過程:空閑狀態(tài),線路處于高電位;當(dāng)檢測到線路的下降沿(線路電位由高電位變?yōu)榈碗娢唬r說明線路有數(shù)據(jù)傳輸,按照約定的波特率從低位到高位接收數(shù)據(jù),數(shù)據(jù)接收完畢后,接著接收并比較奇偶校驗位是否正確,如果正確則通知后續(xù)設(shè)備準(zhǔn)備接收數(shù)據(jù)或存入緩存。UART是異步傳輸,沒有傳輸同步時鐘。為了能保證數(shù)據(jù)傳輸?shù)恼_性,UART采用16倍數(shù)據(jù)波特率的時鐘進(jìn)行采樣。每個數(shù)據(jù)有16個時鐘采樣,取中間的采樣值,以保證采樣不會滑碼或誤碼。一般UART一幀的數(shù)據(jù)位數(shù)為8,這樣即使每個數(shù)據(jù)有一個時鐘的誤差,接收端也能正確地采樣到數(shù)據(jù)。UART的接收數(shù)據(jù)時序為:當(dāng)檢測到數(shù)據(jù)的下降沿時,表明線路上有數(shù)據(jù)進(jìn)行傳輸,這時計數(shù)器CNT開始計數(shù),當(dāng)計數(shù)器為24=16+8時,采樣的值為第0位數(shù)據(jù);當(dāng)計數(shù)器的值為40時,采樣的值為第1位數(shù)據(jù),依此類推,進(jìn)行后面6個數(shù)據(jù)的采樣。如果需要進(jìn)行奇偶校驗,則當(dāng)計數(shù)器的值為152時,采樣的值即為奇偶位;當(dāng)計數(shù)器的值為168時,采樣的值為“1”表示停止位,一幀數(shù)據(jù)接收完成。3UART的VerilogHDL語言設(shè)計3.1UART分頻器假設(shè)數(shù)據(jù)的波特率為p,則所需時鐘的頻率為16*p。以波特率p為9600為例,系統(tǒng)時鐘為12MHz,則分頻系數(shù)為12000000/(16*9600)=78.125,取整為78。VerilogHDL語言代碼如下:moduleclkdiv(clk,clkout);inputclk;//系統(tǒng)時鐘outputclkout;//采樣時鐘輸出regclkout;reg[15:0]cnt;always@(posedgeclk)//分頻進(jìn)程beginif(cnt==16'd38)beginclkout<=1'b1;cnt<=cnt+16'd1;endelseif(cnt==16'd77)beginclkout<=1'b0;cnt<=16'd0;endelsebegincnt<=cnt+16'd1;endendendmodule保存文件為clkdiv.v,單擊Files→Create/Update→CreateSymbolFilesforCurrentFile命令,為clkdiv.v生成原理圖模塊。新建一個原理圖文件,在原理圖空白處雙擊,在彈出的Symbol對話框中選擇Project→clkidv模塊,單擊OK按鈕退出Symbol對話框。在原理圖的適當(dāng)位置放置clkdiv模塊,并添加輸入輸出模塊。保存原理圖為uartrxtx.bdf。編譯工程文件,編譯無誤后單擊Processing→GenerateFunctionalSimulationNetlist,產(chǎn)生功能仿真網(wǎng)表。新建波形仿真文件,加入輸入輸出信號,設(shè)置系統(tǒng)時鐘信號clk的周期為20ns,保存波形文件為uartrxtx.vwf,單擊按鈕進(jìn)行分頻器的波形仿真。圖3-1-13.2UART發(fā)送模塊UART發(fā)送模塊的功能:接收到發(fā)送指令后,把數(shù)據(jù)按UART協(xié)議輸出,先輸出一個低電平的起始位,然后從低到高輸出8個數(shù)據(jù)位,接著是可選的奇偶校驗位,最后是高電平的停止位。VerilogHDL語言代碼如下:moduleuarttx(clk,datain,wrsig,idle,tx);inputclk;

//UART時鐘input[7:0]datain;//需要發(fā)送的數(shù)據(jù)inputwrsig;

//發(fā)送命令,上升沿有效outputidle;

//線路狀態(tài)指示,高為線路忙,低為線路空閑outputtx;

//發(fā)送數(shù)據(jù)信號regidle,tx;regsend;regwrsigbuf,wrsigrise;regpresult;reg[7:0]cnt;

//計數(shù)器parameterparitymode=1'b0;//檢測發(fā)送命令是否有效always@(posedgeclk)beginwrsigbuf<=wrsig;wrsigrise<=(~wrsigbuf)&wrsig;endalways@(posedgeclk)beginif(wrsigrise&&

(~idle))

//當(dāng)發(fā)送命令有效且線路為空閑時,啟動新的數(shù)據(jù)發(fā)送進(jìn)程beginsend<=1'b1;endelseif(cnt==8'd176)

//一幀資料發(fā)送結(jié)束beginsend<=1'b0;endendalways@(posedgeclk)beginif(send==1'b1)begincase(cnt)

//產(chǎn)生起始位8'd0:begintx<=1'b0;idle<=1'b1;cnt<=cnt+8'd1;end8'd16:begintx<=datain[0];

//發(fā)送數(shù)據(jù)0位presult<=datain[0]^paritymode;idle<=1'b1;cnt<=cnt+8'd1;end8'd32:begintx<=datain[1];

//發(fā)送數(shù)據(jù)1位presult<=datain[1]^presult;idle<=1'b1;cnt<=cnt+8'd1;end8'd48:begintx<=datain[2];

//發(fā)送數(shù)據(jù)2位presult<=datain[2]^presult;idle<=1'b1;cnt<=cnt+8'd1;end8'd64:begintx<=datain[3];

//發(fā)送數(shù)據(jù)3位presult<=datain[3]^presult;idle<=1'b1;cnt<=cnt+8'd1;end8'd80:begintx<=datain[4];

//發(fā)送數(shù)據(jù)4位presult<=datain[4]^presult;idle<=1'b1;cnt<=cnt+8'd1;end8'd96:begintx<=datain[5];

//發(fā)送數(shù)據(jù)5位presult<=datain[5]^presult;idle<=1'b1;cnt<=cnt+8'd1;end8'd112:begintx<=datain[6];

//發(fā)送數(shù)據(jù)6位presult<=datain[6]^presult;idle<=1'b1;cnt<=cnt+8'd1;end8'd128:begintx<=datain[7];

//發(fā)送數(shù)據(jù)7位presult<=datain[7]^presult;idle<=1'b1;cnt<=cnt+8'd1;end8'd144:begintx<=presult;

//發(fā)送奇偶校驗位presult<=datain[0]^paritymode;idle<=1'b1;cnt<=cnt+8'd1;end8'd160:begintx<=1'b1;

//發(fā)送停止位

idle<=1'b1;cnt<=cnt+8'd1;end8'd176:begintx<=1'b1;

idle<=1'b0;

//一幀資料發(fā)送結(jié)束cnt<=cnt+8'd1;enddefault:begincnt<=cnt+8'd1;endendcaseendelsebegintx<=1'b1;cnt<=8'd0;idle<=1'b0;endendendmodule保存文件為uarttx.v,單擊Files→Create/Update→CreateSymbolFilesforCurrentFile命令,為uarttx.v生成原理圖模塊。為了測試UART發(fā)送模塊的正確性,需要編寫一個測試模塊來測試UART發(fā)送模塊,VerilogHDL語言代碼如下:moduletestuart(clk,dataout,wrsig);inputclk;output[7:0]dataout;outputwrsig;reg[7:0]dataout;regwrsig;reg[7:0]cnt;always@(posedgeclk)beginif(cnt==254)begindataout<=dataout+8'd1;

//每次數(shù)據(jù)加“1”wrsig<=1'b1;

//產(chǎn)生發(fā)送命令cnt<=8'd0;endelsebeginwrsig<=1'b0;cnt<=cnt+8'd1;endendendmodule保存文件為testuart.v,單擊Files→Create/Update→CreateSymbolFilesforCurrentFile命令,為testuart.v生成原理圖模塊。新建一個原理圖文件,在原理圖空白處雙擊,在彈出的Symbol對話框中選擇Project→testuart模塊和uarttx模塊,單擊OK按鈕退出Symbol對話框。在原理圖的適當(dāng)位置放置testuart模塊和uarttx模塊,并添加輸入輸出模塊。為了仿真方便,把原來分頻模塊的分頻系數(shù)更改為4,各個模塊的連接如圖3-2-1所示。圖3-2-1UART發(fā)送模塊保存原理圖為uartrxtx.bdf。編譯工程文件,編譯無誤后單擊Processing→GenerateFunctionalSimulationNetlist,產(chǎn)生功能仿真網(wǎng)表。新建波形仿真文件,加入輸入輸出信號,設(shè)置系統(tǒng)時鐘信號clk的周期為20ns,保存波形文件為uartrxtx.vwf,單擊按鈕進(jìn)行UART數(shù)據(jù)發(fā)送的波形仿真,波形仿真圖如下圖3-2-2:圖3-2-2UART發(fā)送模塊的波形仿真圖波形仿真說明:當(dāng)發(fā)送命令wrsig的上升沿有效時,啟動發(fā)送數(shù)據(jù)。串行數(shù)據(jù)的波形與發(fā)送數(shù)據(jù)dataout相一致,UART的發(fā)送模塊得到正確驗證。3.3UART的接收模塊UART接收模塊的功能:時時檢測線路,當(dāng)線路產(chǎn)生下降沿時,即認(rèn)為線路有數(shù)據(jù)傳輸,啟動接收數(shù)據(jù)進(jìn)程進(jìn)行接收,按從低位到高位接收數(shù)據(jù)。UART接收模塊的VerilogHDL語言代碼如下:moduleuartrx(clk,rx,dataout,rdsig,dataerror,frameerror);inputclk;

//采樣時鐘inputrx;

//UART數(shù)據(jù)輸入outputdataout;

//接收數(shù)據(jù)輸出outputrdsig;outputdataerror;

//資料出錯指示outputframeerror;

//幀出錯指示reg[7:0]dataout;regrdsig,dataerror;regframeerror;reg[7:0]cnt;regrxbuf,rxfall,receive;parameterparitymode=1'b0;regpresult,idle;always@(posedgeclk)

//檢測線路的下降沿beginrxbuf<=rx;rxfall<=rxbuf&(~rx);endalways@(posedgeclk)beginif(rxfall&&(~idle))

//檢測到線路的下降沿并且原先線路為空閑,啟動接收數(shù)據(jù)進(jìn)程beginreceive<=1'b1;endelseif(cnt==8'd175)

//接收數(shù)據(jù)完成beginreceive<=1'b0;endendalways@(posedgeclk)beginif(receive==1'b1)begincase(cnt)8'd0:beginidle<=1'b1;cnt<=cnt+8'd1;rdsig<=1'b0;end8'd24:

//接收第0位數(shù)據(jù)beginidle<=1'b1;dataout[0]<=rx;presult<=paritymode^rx;cnt<=cnt+8'd1;rdsig<=1'b0;end8'd40://接收第1位數(shù)據(jù)beginidle<=1'b1;dataout[1]<=rx;presult<=presult^rx;cnt<=cnt+8'd1;rdsig<=1'b0;end8'd56://接收第2位數(shù)據(jù)beginidle<=1'b1;dataout[2]<=rx;presult<=presult^rx;cnt<=cnt+8'd1;rdsig<=1'b0;end8'd72://接收第3位數(shù)據(jù)beginidle<=1'b1;dataout[3]<=rx;presult<=presult^rx;cnt<=cnt+8'd1;rdsig<=1'b0;end8'd88://接收第4位數(shù)據(jù)beginidle<=1'b1;dataout[4]<=rx;presult<=presult^rx;cnt<=cnt+8'd1;rdsig<=1'b0;end8'd104://接收第5位數(shù)據(jù)beginidle<=1'b1;dataout[5]<=rx;presult<=presult^rx;cnt<=cnt+8'd1;rdsig<=1'b0;end8'd120:

//接收第6位數(shù)據(jù)beginidle<=1'b1;dataout[6]<=rx;presult<=presult^rx;cnt<=cnt+8'd1;rdsig<=1'b0;end8'd136:

//接收第7位數(shù)據(jù)beginidle<=1'b1;dataout[7]<=rx;presult<=presult^rx;cnt<=cnt+8'd1;rdsig<=1'b1;end8'd152:

//接收奇偶校驗位beginidle<=1'b1;if(presult==rx)dataerror<=1'b0;elsedataerror<=1'b1;

//如果奇偶校驗位不對,表示數(shù)據(jù)出錯

cnt<=cnt+8'd1;rdsig<=1'b1;end8'd168:beginidle<=1'b1;if(1'b1==rx)frameerror<=1'b0;elseframeerror<=1'b1;

//如果沒有接收到停止位,表示幀出錯cnt<=cnt+8'd1;rdsig<=1'b1;enddefault:begincnt<=cnt+8'd1;endendcaseendelsebegincnt<=8'd0;idle<=1'b0;rdsig<=1'b0;endendendmodule保存文件為uartrx.v,單擊Files→Create/Update→CreateSymbolFilesforCurrentFile命令,為uartrx.v生成原理圖模塊。新建一個原理圖文件,在原理圖空白處雙擊,在彈出的Symbol對話框中選擇Project→uartrx模塊,單擊OK按鈕退出Symbol對話框。在原理圖的適當(dāng)位置放置uartrx模塊,并添加輸入輸出模塊,各個模塊的連接如圖3-3-1:圖3-3-1UA

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論