FPGA課程設(shè)計(jì)方案基于FPGA器件設(shè)計(jì)方案與實(shí)現(xiàn)UART_第1頁
FPGA課程設(shè)計(jì)方案基于FPGA器件設(shè)計(jì)方案與實(shí)現(xiàn)UART_第2頁
FPGA課程設(shè)計(jì)方案基于FPGA器件設(shè)計(jì)方案與實(shí)現(xiàn)UART_第3頁
FPGA課程設(shè)計(jì)方案基于FPGA器件設(shè)計(jì)方案與實(shí)現(xiàn)UART_第4頁
FPGA課程設(shè)計(jì)方案基于FPGA器件設(shè)計(jì)方案與實(shí)現(xiàn)UART_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

1項(xiàng)目構(gòu)成的基本原理1。1、UART簡(jiǎn)介UART(UniversalAsynchronousReceiverTransmitter通用異步收發(fā)器)是一種應(yīng)用廣泛的短距離串行傳輸接口。常常用于短距離、低速、低成本的通訊中。8250、8251、NS16450等芯片都是常見的UART器件.基本的UART通信只需要兩條信號(hào)線(RXD、TXD)就可以完成數(shù)據(jù)的相互通信,接收與發(fā)送是全雙工形式。TXD是UART發(fā)送端,為輸出;RXD是UART接收端,為輸入。1.2、UART的基本特點(diǎn)(1)在信號(hào)線上共有兩種狀態(tài),可分別用規(guī)律1(高電平)和規(guī)律0(低電平)來區(qū)分。在發(fā)送器空閑時(shí),數(shù)據(jù)線應(yīng)該保持在規(guī)律高電平狀態(tài).(2)起始位(StartBit):發(fā)送器是通過發(fā)送起始位而開頭一個(gè)字符傳送,起始位使數(shù)據(jù)線處于規(guī)律0狀態(tài),提示接受器數(shù)據(jù)傳輸即將開頭.(3)數(shù)據(jù)位(DataBits):起始位之后就是傳送數(shù)據(jù)位.數(shù)據(jù)位一般為8位一個(gè)字節(jié)的數(shù)據(jù)(也有6位、7位的情況),低位(LSB)在前,高位(MSB)在后.(4)校驗(yàn)位(parityBit):可以認(rèn)為是一個(gè)特殊的數(shù)據(jù)位.校驗(yàn)位一般用來推斷接收的數(shù)據(jù)位有無錯(cuò)誤,一般是奇偶校驗(yàn)。在使用中,該位常常取消。(5)停止位:停止位在最后,用以標(biāo)志一個(gè)字符傳送的結(jié)束,它對(duì)應(yīng)于規(guī)律1狀態(tài)。(6)位時(shí)間:即每個(gè)位的時(shí)間寬度。起始位、數(shù)據(jù)位、校驗(yàn)位的位寬度是全都的,停止位有0。5位、1位、1。5位格式,一般為1位.(7)幀:從起始位開頭到停止位結(jié)束的時(shí)間間隔稱之為一幀。8)波特率:UART的傳送速率,用于說明數(shù)據(jù)傳送的快慢。在串行通信中,數(shù)據(jù)是按位進(jìn)行傳送的,因此傳送速率用每秒鐘傳送數(shù)據(jù)位的數(shù)目來表示,稱之為波特率.如波特率9600=9600bps(位/秒)。UART的數(shù)據(jù)幀格式為如圖1所示圖1:UART的數(shù)據(jù)幀格式?2項(xiàng)目實(shí)現(xiàn)的基本原則2.1、FPGAUART系統(tǒng)組成如圖2所示:圖2:FPGAUART系統(tǒng)組成FPGAUART由三個(gè)子模塊組成:(1)波特率發(fā)生器;(2)接收模塊;(3)發(fā)送模塊;2。2、波特率發(fā)生器波特率發(fā)生器實(shí)際上就是一個(gè)分頻器.可以依據(jù)給定的系統(tǒng)時(shí)鐘頻率(晶振時(shí)鐘)和要求的波特率算出波特率分頻因子,算出的波特率分頻因子作為分頻器的分頻數(shù)。波特率分頻因子可以依據(jù)不同的應(yīng)用需要更改。2。3、UART接收器由于串行數(shù)據(jù)幀和接收時(shí)鐘是異步的,由規(guī)律1轉(zhuǎn)為規(guī)律0可以被視為一個(gè)數(shù)據(jù)幀的起始位。然而,為了避開毛刺影響,能夠得到正確的起始位信號(hào),必必要求接收到的起始位在波特率時(shí)鐘采樣的過程中至少有一半都是屬于規(guī)律0才可認(rèn)定接收到的是起始位.由于內(nèi)部采樣時(shí)鐘bclk周期(由波特率發(fā)生器產(chǎn)生)是發(fā)送或接收波特率時(shí)鐘頻率的16倍,所以起始位需要至少8?jìng)€(gè)連續(xù)bclk周期的規(guī)律0被接收到,才認(rèn)為起始位接收到,接著數(shù)據(jù)位和奇偶校驗(yàn)位將每隔16個(gè)bclk周期被采樣一次(即每一個(gè)波特率時(shí)鐘被采樣一次).如果起始位的確是16個(gè)bclk周期長(zhǎng),那么接下來的數(shù)據(jù)將在每個(gè)位的中點(diǎn)處被采樣。圖3:UART接收器的接收狀態(tài)機(jī)R_START狀態(tài):當(dāng)UART接收器復(fù)位后,接收狀態(tài)機(jī)將處于這一個(gè)狀態(tài)。在此狀態(tài),狀態(tài)機(jī)始終在等待RXD的電平跳轉(zhuǎn),從規(guī)律1變?yōu)橐?guī)律0,即起始位,這意味著新的一幀UART數(shù)據(jù)幀的開頭,一旦起始位被確定,狀態(tài)機(jī)將轉(zhuǎn)入R_CENTER狀態(tài).狀態(tài)圖中的RXD_SYNC信號(hào)是RXD的同步信號(hào),由于在進(jìn)行規(guī)律1或規(guī)律0推斷時(shí),不盼望檢測(cè)的信號(hào)是不穩(wěn)定的,所以不直接檢測(cè)RXD信號(hào),而是檢測(cè)經(jīng)過同步后的RXD_SYNC信號(hào)。R_CENTER狀態(tài):對(duì)于異步串行信號(hào),為了使每一次都檢測(cè)到正確的位信號(hào),而且在較后的數(shù)據(jù)位檢測(cè)時(shí)累計(jì)誤差較小,顯然在每位的中點(diǎn)檢測(cè)是最為抱負(fù)的。在本狀態(tài),就是由起始位求出每位的中點(diǎn),通過對(duì)bclk的個(gè)數(shù)進(jìn)行計(jì)數(shù)(RCNT16),但計(jì)數(shù)值不是想當(dāng)然的“1000”,要考慮經(jīng)過一個(gè)狀態(tài),也即經(jīng)過了一個(gè)bclk周期,所盼望得到的是在采樣時(shí)1/2位。另外,可能在R_START狀態(tài)檢測(cè)到的起始位不是真正的起始位,可能是一個(gè)偶然消滅的干擾尖脈沖(負(fù)脈沖)。這種干擾脈沖的周期是很短的,所以可以認(rèn)為保持規(guī)律0超過1/4個(gè)位時(shí)間的信號(hào)肯定是起始位。R_WAIT狀態(tài):當(dāng)狀態(tài)機(jī)處于這一狀態(tài),等待計(jì)滿15個(gè)bclk,在第16個(gè)bclk是進(jìn)入R_SAMPLE狀態(tài)進(jìn)行數(shù)據(jù)位的采樣檢測(cè),同時(shí)也推斷是否采集的數(shù)據(jù)位長(zhǎng)度已達(dá)到數(shù)據(jù)幀的長(zhǎng)度(FRAMELEN),如果到來,就說明停止位來臨了。FRAMELEN在設(shè)計(jì)時(shí)是可更改的(使用了Generic),在本設(shè)計(jì)中默認(rèn)為8,即對(duì)應(yīng)的UART工作在8位數(shù)據(jù)位、無校驗(yàn)位格式。R_SAMPLE狀態(tài):即數(shù)據(jù)位采樣檢測(cè),完成后無條件狀態(tài)機(jī)轉(zhuǎn)入R_WAIT狀態(tài),等待下次數(shù)據(jù)位的到來。R_STOP狀態(tài):無論停止位是1還是1.5位,或是2位,狀態(tài)機(jī)在R_STOP不簡(jiǎn)略檢測(cè)RXD,只是輸出幀接收完畢信號(hào)(REC_DONE〈=‘1’),停止位后狀態(tài)機(jī)轉(zhuǎn)回到R_START狀態(tài),等待下一個(gè)幀的起始位2.4、UART發(fā)送器發(fā)送器只要每隔16個(gè)bclk周期輸出1個(gè)數(shù)據(jù)即可,次序遵循第1位是起始位,第8位是停止位。在本設(shè)計(jì)中沒有校驗(yàn)位,但只要轉(zhuǎn)變Generic參數(shù)FrameLen,也可以加入校驗(yàn)位,停止位是固定的1位格式。圖4:發(fā)送狀態(tài)機(jī)的狀態(tài)圖X_IDLE狀態(tài):當(dāng)UART被復(fù)位信號(hào)復(fù)位后,狀態(tài)機(jī)將立刻進(jìn)入這一狀態(tài)。在這個(gè)狀態(tài)下,UART的發(fā)送器始終在等待一個(gè)數(shù)據(jù)幀發(fā)送命令XMIT_CMD。XMIT_CMD_P信號(hào)是對(duì)XMIT_CMD的處理,XMIT_CMD_P是一個(gè)短脈沖信號(hào)。這時(shí)由于XMIT_CMD是一個(gè)外加信號(hào),在FPGA之外,不行能對(duì)XMIT_CMD的脈沖寬度進(jìn)行限制,如果XMIT_CMD有效在UART發(fā)完一個(gè)數(shù)據(jù)幀后仍然有效,那么就會(huì)錯(cuò)誤地被認(rèn)為,一個(gè)新的數(shù)據(jù)發(fā)送命令又到來了,UART發(fā)送器就會(huì)再次啟動(dòng)UART幀的發(fā)送,顯然該幀的發(fā)送是錯(cuò)誤的.在此對(duì)XMIT_CMD進(jìn)行了脈沖寬度的限定,XMIT_CMD_P就是一個(gè)處理后的信號(hào)。當(dāng)XMIT_CMD_P=‘1',狀態(tài)機(jī)轉(zhuǎn)入X_START,籌備發(fā)送起始位。X_START狀態(tài):在這個(gè)狀態(tài)下,UART的發(fā)送器一個(gè)位時(shí)間寬度的規(guī)律0信號(hào)至TXD,即起始位。緊接著狀態(tài)機(jī)轉(zhuǎn)入X_WAIT狀態(tài)。XCNT16是bclk的計(jì)數(shù)器X_WAIT狀態(tài):同UART接收狀態(tài)機(jī)中的R_WAIT狀態(tài)類似。X_SHIFT狀態(tài):當(dāng)狀態(tài)機(jī)處于這一狀態(tài)時(shí),實(shí)現(xiàn)待發(fā)數(shù)據(jù)的并串轉(zhuǎn)換。轉(zhuǎn)換完成立即回到X_WAIT狀態(tài)。X_STOP:停止位發(fā)送狀態(tài),當(dāng)數(shù)據(jù)幀發(fā)送完畢,狀態(tài)機(jī)轉(zhuǎn)入該狀態(tài),并發(fā)送16個(gè)bclk周期的規(guī)律1信號(hào),即1位停止位。狀態(tài)機(jī)送完停止位后回到X_IDLE狀態(tài),并等待另一個(gè)數(shù)據(jù)幀的發(fā)送命令。2.5芯片的選擇1.QuartusII軟件2.AlteraCycloneⅡEP2C8Q208C8N3。EM1715A(chǔ)穩(wěn)壓電源

3程序設(shè)計(jì)3。1頂層程序libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH。ALL;useIEEE。STD_LOGIC_UNSIGNED.ALL;entitytopisPort(clk32mhz,reset,rxd,xmit_cmd_p_in:instd_logic;-—總的輸入輸出信號(hào)的定義?rec_ready,txd_out,txd_done_out:outstd_logic;txdbuf_in:instd_logic_vector(7downto0);—-待發(fā)送數(shù)據(jù)輸入??rec_buf:outstd_logic_vector(7downto0));-—接收數(shù)據(jù)緩沖endtop;architectureBehavioraloftopiscomponentrecieverPort(bclkr,resetr,rxdr:instd_logic;?r_ready:outstd_logic;??rbuf:outstd_logic_vector(7downto0));endcomponent;componenttransferPort(bclkt,resett,xmit_cmd_p:instd_logic;?txdbuf:instd_logic_vector(7downto0);? txd:outstd_logic;??txd_done:outstd_logic);endcomponent;componentbaudPort(clk,resetb:instd_logic;?bclk:outstd_logic);endcomponent;signalb:std_logic;beginu00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001:baudportmap(clk=〉clk32mhz,resetb=>reset,bclk=>b);—-頂層映射u2:recieverportmap(bclkr=>b,resetr=〉reset,rxdr=>rxd,r_ready=>rec_ready,rbuf=>rec_buf);u3:transferportmap(bclkt=>b,resett=>reset,xmit_cmd_p=〉xmit_cmd_p_in,txdbuf=>txdbuf_in,txd=>txd_out,txd_done=>txd_done_out);endBehavioral;3.2波特率發(fā)生器程序libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;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;3。2UART發(fā)送器程序libraryIEEE;useIEEE.STD_LOGIC_1164。ALL;useIEEE。STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitytransferisgeneric(framlent:integer:=8);Port(bclkt,resett,xmit_cmd_p:instd_logic;-—定義輸入輸出信號(hào)?txdbuf:instd_logic_vector(7downto0):="11001010";??txd:outstd_logic;??txd_done:outstd_logic);endtransfer;architectureBehavioraloftransferistypestat(yī)esis(x_idle,x_start,x_wait,x_shift,x_stop);--定義個(gè)子狀態(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)thencasestateis?whenx_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ā)送信號(hào)至起始位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"then? ifxbitcnt=framlentthenstate〈=x_stop;xbitcnt:=0; ??elsestate〈=x_shift;???endif;???xcnt16:=”00000";??elsexcnt16:=xcnt16+1;stat(yī)e<=x_wait;?? endif;whenx_shift=>txds:=txdbuf(xbitcnt);xbitcnt:=xbitcnt+1;stat(yī)e<=x_wait;????-—狀態(tài)4,將待發(fā)數(shù)據(jù)進(jìn)行并串轉(zhuǎn)換whenx_stop=>—-狀態(tài)5,停止位發(fā)送狀態(tài)ifxcnt16〉="01111"then? ?ifxmit_cmd_p='0'thenstate<=x_idle;xcnt16:=”00000"; ? elsexcnt16:=xcnt16;stat(yī)e〈=x_stop; ?endif;txd_done<=’1';???elsexcnt16:=xcnt16+1;txds:='1’;state<=x_stop; ?endif;?whenothers=〉stat(yī)e<=x_idle;endcase;? endif;txd〈=txds;endprocess;endBehavioral;3.3UART接收器程序libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH。ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityrecieverisgeneric(framlenr:integer:=8); Port(bclkr,resetr,rxdr:instd_logic;-—定義輸入輸出信號(hào) r_ready:outstd_logic;??rbuf:outstd_logic_vector(7downto0));endreciever;architectureBehavioralofrecieveristypestatesis(r_start,r_center,r_wait,r_sample,r_stop);—-定義各子狀態(tài)signalstate:stat(yī)es:=r_start;signalrxd_sync:std_logic;beginpro1:process(rxdr)beginifrxdr='0'thenrxd_sync〈='0’;elserxd_sync<='1';endif;endprocess;pro2:process(bclkr,resetr,rxd_sync)-—主控時(shí)序、組合進(jìn)程variablecount:std_logic_vector(3downto0);——定義中間變量variablercnt:integer:=0;variablerbufs:std_logic_vector(7downto0);beginifresetr='1'thenstate〈=r_start;count:="0000";-—復(fù)位elsifrising_edge(bclkr)thencasestat(yī)eis whenr_start=>--狀態(tài)1,等待起始位ifrxd_sync=’0’thenstat(yī)e<=r_center;r_ready<=’0’;rcnt:=0;???elsestate<=r_start;r_ready〈='0';???endif;whenr_center=>—-狀態(tài)2,求出每位的中點(diǎn)ifrxd_sync='0'then? ?ifcount="0100"thenstate<=r_wait;count:="0000";elsecount:=count+1;state〈=r_center;endif;???elsestate<=r_start;???endif;whenr_wait=>—-狀態(tài)3,等待狀態(tài)ifcount〉=”1110”thenifrcnt=framlenrthenstate<=r_stop; ??elsestat(yī)e〈=r_sample; ??endif;?? count:=”0000";??elsecount:=count+1;state<=r_wait;???endif;whenr_sample=>rbufs(rcnt):=rxd_sync;rcnt:=rcnt+1;state<=r_wait;-—狀態(tài)4,數(shù)據(jù)位采樣檢測(cè)whenr_stop=>r_ready<='1';rbuf〈=rbufs;state〈=r_start;--狀態(tài)4,輸出幀接收完畢信號(hào)whenothers=>state<=r_start;endcase;endif;endprocess;endBehavioral;?3。4整體電路圖整個(gè)系統(tǒng)的:整體電路圖如圖5所示:圖5:系統(tǒng)的整體電路圖

4仿真4.1頂層仿真仿真波形圖如圖4所示.圖6仿真波形4.2波特率發(fā)生器仿真仿真波形如圖7所示。圖7波特率發(fā)生器的仿真波形?4.3UART發(fā)送器仿真仿真波形如圖8所示圖8UART發(fā)送器的仿真波形4.4UART接收器仿真UART接收器的仿真波形如圖9所示。圖9UART接收器的仿真波形?5總結(jié)利用Verilog設(shè)計(jì)的靈敏性實(shí)現(xiàn)了UART通信功能,可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的接收和發(fā)送,并可以在接收數(shù)據(jù)時(shí)對(duì)其校驗(yàn)位、停止位進(jìn)行推斷,在發(fā)送數(shù)據(jù)時(shí)可以形成完整的一幀數(shù)據(jù)格式.其接收和發(fā)送數(shù)據(jù)的時(shí)鐘有內(nèi)部波特率發(fā)生器產(chǎn)生,依據(jù)預(yù)置的分頻計(jì)系數(shù),對(duì)外部時(shí)鐘進(jìn)行分頻,產(chǎn)生需要的接收或

溫馨提示

  • 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)論