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

下載本文檔

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

文檔簡(jiǎn)介

項(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),可分別用邏輯1(高電平)和邏輯0(低電平)來(lái)區(qū)分。在發(fā)送器空閑時(shí),數(shù)據(jù)線應(yīng)該保持在邏輯高電平狀態(tài)。(2)起始位(StartBit):發(fā)送器是通過(guò)發(fā)送起始位而開始一個(gè)字符傳送,起始位使數(shù)據(jù)線處于邏輯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)位一般用來(lái)判斷接收的數(shù)據(jù)位有無(wú)錯(cuò)誤,一般是奇偶校驗(yàn)。在使用中,該位常常取消。(5)停止位:停止位在最后,用以標(biāo)志一個(gè)字符傳送的結(jié)束,它對(duì)應(yīng)于邏輯1狀態(tài)。(6)位時(shí)間:即每個(gè)位的時(shí)間寬度。起始位、數(shù)據(jù)位、校驗(yàn)位的位寬度是一致的,停止位有0.5位、1位、1.5位格式,一般為1位。(7)幀:從起始位開始到停止位結(jié)束的時(shí)間間隔稱之為一幀。8)波特率:UART的傳送速率,用于說(shuō)明數(shù)據(jù)傳送的快慢。在串行通信中,數(shù)據(jù)是按位進(jìn)行傳送的,因此傳送速率用每秒鐘傳送數(shù)據(jù)位的數(shù)目來(lái)表示,稱之為波特率。如波特率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í)鐘是異步的,由邏輯1轉(zhuǎn)為邏輯0可以被視為一個(gè)數(shù)據(jù)幀的起始位。然而,為了避免毛刺影響,能夠得到正確的起始位信號(hào),必須要求接收到的起始位在波特率時(shí)鐘采樣的過(guò)程中至少有一半都是屬于邏輯0才可認(rèn)定接收到的是起始位。由于內(nèi)部采樣時(shí)鐘bclk周期(由波特率發(fā)生器產(chǎn)生)是發(fā)送或接收波特率時(shí)鐘頻率的16倍,所以起始位需要至少8個(gè)連續(xù)bclk周期的邏輯0被接收到,才認(rèn)為起始位接收到,接著數(shù)據(jù)位和奇偶校驗(yàn)位將每隔16個(gè)bclk周期被采樣一次(即每一個(gè)波特率時(shí)鐘被采樣一次)。如果起始位的確是16個(gè)bclk周期長(zhǎng),那么接下來(lái)的數(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),從邏輯1變?yōu)檫壿?,即起始位,這意味著新的一幀UART數(shù)據(jù)幀的開始,一旦起始位被確定,狀態(tài)機(jī)將轉(zhuǎn)入R_CENTER狀態(tài)。狀態(tài)圖中的RXD_SYNC信號(hào)是RXD的同步信號(hào),因?yàn)樵谶M(jìn)行邏輯1或邏輯0判斷時(shí),不希望檢測(cè)的信號(hào)是不穩(wěn)定的,所以不直接檢測(cè)RXD信號(hào),而是檢測(cè)經(jīng)過(guò)同步后的RXD_SYNC信號(hào)。R_CENTER狀態(tài):對(duì)于異步串行信號(hào),為了使每一次都檢測(cè)到正確的位信號(hào),而且在較后的數(shù)據(jù)位檢測(cè)時(shí)累計(jì)誤差較小,顯然在每位的中點(diǎn)檢測(cè)是最為理想的。在本狀態(tài),就是由起始位求出每位的中點(diǎn),通過(guò)對(duì)bclk的個(gè)數(shù)進(jìn)行計(jì)數(shù)(RCNT16),但計(jì)數(shù)值不是想當(dāng)然的“1000”,要考慮經(jīng)過(guò)一個(gè)狀態(tài),也即經(jīng)過(guò)了一個(gè)bclk周期,所希望得到的是在采樣時(shí)1/2位。另外,可能在R_START狀態(tài)檢測(cè)到的起始位不是真正的起始位,可能是一個(gè)偶然出現(xiàn)的干擾尖脈沖(負(fù)脈沖)。這種干擾脈沖的周期是很短的,所以可以認(rèn)為保持邏輯0超過(guò)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),如果到來(lái),就說(shuō)明停止位來(lái)臨了。FRAMELEN在設(shè)計(jì)時(shí)是可更改的(使用了Generic),在本設(shè)計(jì)中默認(rèn)為8,即對(duì)應(yīng)的UART工作在8位數(shù)據(jù)位、無(wú)校驗(yàn)位格式。R_SAMPLE狀態(tài):即數(shù)據(jù)位采樣檢測(cè),完成后無(wú)條件狀態(tài)機(jī)轉(zhuǎn)入R_WAIT狀態(tài),等待下次數(shù)據(jù)位的到來(lái)。R_STOP狀態(tài):無(wú)論停止位是1還是1.5位,或是2位,狀態(tài)機(jī)在R_STOP不具體檢測(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)位,但只要改變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ā)送命令又到來(lái)了,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,準(zhǔn)備發(fā)送起始位。X_START狀態(tài):在這個(gè)狀態(tài)下,UART的發(fā)送器一個(gè)位時(shí)間寬度的邏輯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周期的邏輯1信號(hào),即1位停止位。狀態(tài)機(jī)送完停止位后回到X_IDLE狀態(tài),并等待另一個(gè)數(shù)據(jù)幀的發(fā)送命令。2.5芯片的選擇1.QuartusII軟件2.AlteraCycloneⅡEP2C8Q208C8N3.EM1715A穩(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;architectureBehavioraloftransferistypestatesis(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;state<=x_wait; endif;whenx_shift=>txds:=txdbuf(xbitcnt);xbitcnt:=xbitcnt+1;state<=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;state<=x_stop; endif;txd_done<='1'; elsexcnt16:=xcnt16+1;txds:='1';state<=x_stop; endif; whenothers=>state<=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:states:=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)thencasestateis whenr_start=>--狀態(tài)1,等待起始位ifrxd_sync='0'thenstate<=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; elsestate<=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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論