FPGA串口發(fā)送與接收實(shí)驗(yàn)_第1頁(yè)
FPGA串口發(fā)送與接收實(shí)驗(yàn)_第2頁(yè)
FPGA串口發(fā)送與接收實(shí)驗(yàn)_第3頁(yè)
FPGA串口發(fā)送與接收實(shí)驗(yàn)_第4頁(yè)
FPGA串口發(fā)送與接收實(shí)驗(yàn)_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

一、 實(shí)驗(yàn)名稱(chēng)FPGA串口發(fā)送與接收實(shí)驗(yàn)二、 實(shí)驗(yàn)?zāi)康暮鸵竽康囊螅?) 掌握VHDL硬件語(yǔ)言的基本應(yīng)用。2) 理解掌握串口通信協(xié)議。3) 掌握和理解串口發(fā)送模塊的原理和設(shè)計(jì)方法。4) 掌握和理解串口接收模塊的原理和設(shè)計(jì)方法。5) 掌握用VHDL硬件語(yǔ)言進(jìn)行頂層文件設(shè)計(jì)。6) 掌握用Modelsim進(jìn)行仿真操作。三、 實(shí)驗(yàn)內(nèi)容和原理1?串口發(fā)送與接收模塊設(shè)計(jì)思路串行通信時(shí)與并行通信相對(duì)應(yīng)的,串行通信指計(jì)算機(jī)總線或者其他數(shù)據(jù)通道上,每次傳輸一個(gè)位元數(shù)據(jù),并連續(xù)進(jìn)行以上單次過(guò)程的通信方式。串行通信被用于長(zhǎng)距離通信及大多數(shù)計(jì)算機(jī)網(wǎng)絡(luò),串行通信總線越來(lái)越普遍,優(yōu)越性也越來(lái)越突出。UART是異步串口通信,沒(méi)有同步的時(shí)鐘,為了能保證數(shù)據(jù)傳輸?shù)恼_性,采用16倍數(shù)據(jù)波特率的時(shí)鐘進(jìn)行采樣,每位數(shù)據(jù)有16個(gè)時(shí)鐘采樣,接收采用大數(shù)判決或者中間時(shí)鐘采樣。一般UART一幀的數(shù)據(jù)位數(shù)為8,這樣即使每個(gè)數(shù)據(jù)有一個(gè)時(shí)鐘的誤差,接收端也能正確地采樣到數(shù)據(jù)。串口UART通信協(xié)議數(shù)據(jù)幀格式如下圖所示,首先是一個(gè)起始位ST,然后是7-8位可選數(shù)據(jù)位,0-1位可選奇偶校驗(yàn)位PA、1-2位可選的高電平停止位SP。圖3-1UART串口通信協(xié)議本次試驗(yàn)分三個(gè)模塊進(jìn)行設(shè)計(jì):分頻器、串口發(fā)送部分、串口接收部分。分頻器輸出時(shí)鐘為16倍采樣值,發(fā)送部分根據(jù)發(fā)送信號(hào)進(jìn)行數(shù)據(jù)發(fā)送,接收部分先接收起始位再對(duì)每個(gè)數(shù)據(jù)位的第八個(gè)elk進(jìn)行采樣接收數(shù)據(jù)。設(shè)計(jì)中分別對(duì)三個(gè)模塊效果進(jìn)行仿真,最后把串口發(fā)送和接收部分組合,實(shí)現(xiàn)把串行接收到的數(shù)據(jù)再串行發(fā)出。分頻器分頻器是對(duì)輸入的50MHz系統(tǒng)時(shí)鐘進(jìn)行分頻,本次試驗(yàn)采用的波特率為9600bps,進(jìn)行16倍采樣后的時(shí)鐘為16*9600,因此分頻系數(shù)為325。計(jì)算公式如下:50000000325.52二16^9600 (公式3-1)分頻器的符號(hào)文件如下圖所示:clk_div◎elkclk_ou1u<inst圖3-2分頻器符號(hào)文件串口發(fā)送模塊串口發(fā)送模塊最根本的功能是把放在串口中的并行數(shù)據(jù)一位一位地串

行發(fā)送出去,實(shí)現(xiàn)數(shù)據(jù)的并串轉(zhuǎn)換。串口發(fā)送部分與分頻器連接圖如下圖所示,elkINPUTVCcPIN27:data」仃[廠-口]INF'LITVCcIHF'LIT

VCCinstelkINPUTVCcPIN27:data」仃[廠-口]INF'LITVCcIHF'LIT

VCCinst_divelkClh:_OL4telkuartJ::<Clh:idledata」n[7..O]txtx_siginst2圖3-3串口發(fā)送與分頻器連接圖串口接收模塊串口接收模塊最根本的功能是把串口接收到的串行數(shù)據(jù)轉(zhuǎn)換成并行數(shù)據(jù),根據(jù)串口通信協(xié)議實(shí)現(xiàn)數(shù)據(jù)的串并轉(zhuǎn)換。串口接收模塊與分頻器連接圖如下圖所示,圖3-4串口接收與分頻器連接圖5?串口收發(fā)頂層文件設(shè)計(jì)串口接收與發(fā)送模塊與分頻器連接圖如下圖所示,該模塊實(shí)現(xiàn)的功能是把串口接收模塊接收到的數(shù)據(jù)立即經(jīng)串口發(fā)送模塊發(fā)送出去,在模塊中沒(méi)有加入FIFO,所以每接收一個(gè)字節(jié)的數(shù)據(jù)并不在模塊內(nèi)部停留而是立即在串口發(fā)送端串行輸出。頂層文件設(shè)計(jì)先把分頻器、串口發(fā)送和接收模塊元件例化,然后進(jìn)行端口映射連接。具體如下圖所示。.:clkjjivPIN27PINJ17Ielkelkout■elkrxd3ta_out[7..0]■.:clkjjivPIN27PINJ17Ielkelkout■elkrxd3ta_out[7..0]■sclrU3rt_ni:instT:initj:datajnp.li] 譏廳卩片五圖3-5串口收發(fā)的模塊連接四、 實(shí)驗(yàn)環(huán)境(軟、硬件環(huán)境,主要儀器設(shè)備)軟件環(huán)境:ISEDesignSuite11.0,ModelsimSE6.5硬件環(huán)境:PC機(jī)操作系統(tǒng):WindowsXP五、 操作方法與實(shí)驗(yàn)步驟設(shè)計(jì)過(guò)程分模塊進(jìn)行設(shè)計(jì),當(dāng)所有模塊經(jīng)過(guò)仿真驗(yàn)證正確后再進(jìn)行頂層文件設(shè)計(jì)。1、 分頻器設(shè)計(jì)打開(kāi)ISEDesignSuite11.0,新建工程命名為"usart_txrx"。在PreferredLanguage中擇為VHDL,在新建的工程中右鍵NewSource選擇VHDLMouldue并命名為div,新建div.vhd文件,然后加入分頻器代碼,代碼參考第六部分內(nèi)容。2、 串口發(fā)送模塊設(shè)計(jì)在新建工程"uart_txrx"中右鍵NewSource選擇VHDLMouldue并命名為usart_tx,新建usart_tx.vhd文件,然后加入串口發(fā)送模塊代碼,代碼參考第六部分內(nèi)容。保存后編譯,然后新建TestBench對(duì)串口發(fā)送模塊進(jìn)行仿真,在工程中右鍵新建VHDLTestBench命名為usart_tx_tb,把初始化的輸入data_in和tx_sig信號(hào)賦值為零,然后在激勵(lì)中加入以下代碼。waitfar100ns;waitforclk_p已:tx_sig<=T1丁;waitforclk_pei_iod1Ar16;data_in<='OIOIOIOI1';waitforclk_p已:riuici*lE;—ins已工七呂七imuIllsh已工已wait;圖5-1串口發(fā)送仿真激勵(lì)代碼3、串口接收模塊設(shè)計(jì)在新建工程Uart_txrx"中右鍵NewSource選擇VHDLMouldue并命名為usart_rx,

新建usart_rx.vhd文件,然后加入串口發(fā)送模塊代碼,代碼參考第六部分內(nèi)容。保存后

編譯,然后新建TestBench對(duì)串口發(fā)送模塊進(jìn)行仿真,在工程中右鍵新建VHDLTestBench命名為usart_rx_tb,把初始化的輸入rx信號(hào)賦值為1表示為處在空閑狀態(tài),aclr信號(hào)賦值為1進(jìn)行復(fù)位,然后在激勵(lì)中加入以下代碼。wait,fcr100ns;aclr<=,01;wait,fcrelkperiod^lO;rx<='0';waitfcrelkperiod^lG;rx<=,0';waitfcrelkperiod^lfi;rx<=,1';waitfcrelk:period^ie;rx<=,0';waitfcrelk:period^ie;rx<=,1';waitfcrelk:period^ie;rx<=,0';waitfcrelk:period^ie;rx<=,1';waitfcrelk:period^ie;rx<=,0';waitfcrelk:period^ie;rx<='1';waitfcrelkperiodfr16;一一insertstirauljshere圖5-2串口接收仿真激勵(lì)代碼4、系統(tǒng)設(shè)計(jì)系統(tǒng)總體原理即為上述講到的頂層設(shè)計(jì),根據(jù)上述介紹中收發(fā)模塊組合的原理圖,把分頻器、串口接收模塊和串口發(fā)送模塊例化后就可以通過(guò)端口映射把模塊相連,實(shí)現(xiàn)只要串口接收到八位數(shù)據(jù)就立刻發(fā)送的情況。元件例化和端口映射的代碼參考第六部分。5、系統(tǒng)Modelsim仿真驗(yàn)證操作在新建的工程中右鍵NewSource選擇VHDLTestBench,新建usart_txrx_tb.vhd文件。在關(guān)聯(lián)文件中選擇usart_txrx,生成TestBench后雙擊打開(kāi)該文件。把初始化的輸入信號(hào)賦值為零,TestBench激勵(lì)代碼和發(fā)送模塊相同。添加完成后在Project選項(xiàng)中打開(kāi)DesignProperties,修改Simulator為Modelsim-SEMixed保存。設(shè)置完成后,雙擊SimulatorBehavioralModel開(kāi)始仿真。把要查看的信號(hào)加入到波形顯示窗口,這時(shí)會(huì)看到輸出數(shù)據(jù)。具體TestBench代碼和輸出波形圖參考第六部分與第七部分內(nèi)容。六、實(shí)驗(yàn)部分代碼與截圖1、 分頻器分頻器div.vhd文件如下:首先是庫(kù)聲明和實(shí)體定義,然后在結(jié)構(gòu)體進(jìn)程中進(jìn)行計(jì)數(shù)。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitydivisport(clk:instd_logic;clk_out:outstd_logic);enddiv;architectureclk_divofdivissignalcnt:std_logic_vector(8downto0);beginprocess(clk)beginif(clk'eventandclk='1')thenif(cnt="010100010")then--if324/2=162clkclk_outv=T;cnt<=cnt+1;elsif(cnt="101000100")then—如果cnt=324clk_out<='0';cntv="OOOOOOOOO";elsecnt<=cnt+1;endif;endif;endprocess;endclk_div;2、 串口發(fā)送模塊串口發(fā)送代碼如下,libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityusart_txisport(clk:instd_logic;data_in:instd_logic_vector(7downto0);tx_sig:instd_logic;idle:outstd_logic;tx:outstd_logic);endusart_tx;architecturetxofusart_txissignalsendsignaltx_sig_bufsignalidleregsignaltx_start:: std_logic;: std_logic;:std_logic;std_logic;signalcntbeginidle<=idlereg;: std_logic_vector(7downto0);--發(fā)送信號(hào)由0->1時(shí)開(kāi)始發(fā)送數(shù)據(jù)process(clk)beginifrising_edge(clk)thentx_sig_buf<=tx_sig;tx_start<=(nottx_sig_buf)andtx_sig;endif;endprocess;--時(shí)鐘上升沿到來(lái),發(fā)送信號(hào)有效且處于空閑時(shí)可以發(fā)送數(shù)據(jù)send=1process(clk)beginifrising_edge(clk)thenif(tx_start='1'and(notidlereg='1'))thensendv=T;elsif(cnt="10100000")thensendv='O';endif;endif;endprocess;--send=1時(shí)開(kāi)始由低位到高位發(fā)送數(shù)據(jù),格式為start+data[0-7]+endprocess(clk)beginifrising_edge(clk)thenif(send='1')thencasecntiswhen"00000000"=〉txv='O';idleregv=T;cnt<=cnt+1;when"00010000"=〉tx<=data_in(0);idleregv=T;cnt<=cnt+1;when"00100000"=〉tx<=data_in(1);idleregv=T;cnt<=cnt+1;when"00110000"=〉txv=data_in(2);idleregv=T;cnt<=cnt+1;when"01000000"=>txv=data_in(3);idleregv=T;cnt<=cnt+1;when"01010000"=>txv=data_in(4);idleregv=T;cnt<=cnt+1;when"01100000"=>txv=data_in(5);idleregv=T;cntv=cnt+l;when"01110000"=>txv=data_in(6);idleregv=T;cnt<=cnt+1;when"10000000"=>txv=data_in(7);idleregv=T;cnt<=cnt+1;when"10010000"=>--txendtxv=T;idleregv=T;cnt<=cnt+1;when"10100000"=>--tx空閑txv=T;idlereg<='0';cnt<=cnt+1;whenothers=>cnt<=cnt+1;endcase;elsetxv=T;cntv="OOOOOOOO";idlereg<='0';endif;endif;endprocess;endtx;3、串口接收模塊串口接收模塊代碼如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityusart_rxisport(clk:instd_logic;rx:instd_logic;aclr:instd」ogic;data_out:outstd」ogic_vector(7downto0);rx_sig:outstd_logic);endusart_rx;architecturerxofusart_rxissignalcnt:std_logic_vector(7downto0);signalrxbuf:std」ogic;signalrxfall:std_logic;signalreceive:std_logic;signalidle:std_logic;begin--當(dāng)接收數(shù)據(jù)由T變?yōu)?O'時(shí),表示檢測(cè)到起始位,process(clk)beginifrising_edge(clk)thenrxbuf<=rx;if(rxbuf=Tandrx='0')thenrxfallv=T;elserxfall<='0';endif;endif;endprocess;--檢測(cè)到起始位后,如果接收處于空閑狀態(tài)且aclr=0時(shí)開(kāi)始接收數(shù)據(jù)--當(dāng)接收數(shù)據(jù)完成后(cnt=”10011000”)接收停止process(clk)beginifrising_edge(clk)thenif(rxfall=Tandidle='0')thenreceivev=T;elsif(cnt="10011000")thenreceive<='0';endif;endif;endprocess;-從檢測(cè)到起始位開(kāi)始對(duì)時(shí)鐘計(jì)數(shù),在16+8個(gè)elk時(shí)接收第一位即--D0位數(shù)據(jù),每過(guò)16個(gè)elk接收一個(gè)數(shù)據(jù),直到八位全部接收完成process(clk)beginifrising_edge(clk)thenif(aclr='1')thenrx_sigv='O';data_outv="00000000";elsif(receive='1')thencasecntiswhen"00000000"=>idlev=T;cnt<=cnt+1;

rx_sig<='0';when"00011000"=>idlev=T;data_out(0)v=rx;cnt<=cnt+1;rx_sig<='0';when"00101000"=>idlev=T;data_out(1)v=rx;cnt<=cnt+1;rx_sig<='0';when"00111000"=>idlev=T;data_out(2)v=rx;cnt<=cnt+1;rx_sig<='0';when"01001000"=>idlev=T;data_out(3)v=rx;cnt<=cnt+1;rx_sig<='0';when"01011000"=>idlev=T;data_out(4)v=rx;cnt<=cnt+1;rx_sig<='0';when"01101000"=>idlev=T;data_out(5)v=rx;cntv=cnt+1;rx_sig<='0';when"01111000"=>idlev=T;data_out(6)v=rx;cnt<=cnt+1;rx_sig<='0';when"10001000"=>idlev=T;data_out(7)v=rx;cnt<=cnt+1;rx_sigv=T;whenothers=>cnt<=cnt+1;endcase;elsecnt<="00000000";idle<='0';rx_sig<='0';endif;endif;endprocess;endrx;4、串口接收與發(fā)送頂層文件設(shè)計(jì)根據(jù)串口接收和發(fā)送的程序進(jìn)行頂層文件設(shè)計(jì),把串口發(fā)送模塊、接收模塊例化后進(jìn)行端口映射,最后組合的模塊如下圖所示。圖6-1串口收發(fā)的模塊連接頂層設(shè)計(jì)代碼如下所示:LIBRARYieee;USEieee.std_logic_1164.all;LIBRARYwork;ENTITYusart_txrxISPORT(clk:INSTD_LOGIC;rx:INSTD_LOGIC;aclr:INSTD_LOGIC;idle:OUTSTD_LOGIC;tx:OUTSTD_LOGIC);ENDusart_txrx;ARCHITECTUREbdf_typeOFusart_txrxISCOMPONENTusart_rxPORT(clk:INSTD_LOGIC;rx:INSTD_LOGIC;aclr:INSTD_LOGIC;rx_sig:OUTSTD_LOGIC;data_out:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDCOMPONENT;COMPONENTusart_txPORT(clk:INSTD_LOGIC;tx_sig:INSTD_LOGIC;data_in:INSTD_L0GIC_VECT0R(7DOWNTO0);idle:OUTSTD_LOGIC;tx:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALSYNTHESIZED_WIRE_0:STD_LOGIC;SIGNALSYNTHESIZED_WIRE_1:STD_LOGIC_VECTOR(7DOWNTO0);BEGINb2v_instl:usart_rxPORTMAP(clk=>elk,rx=>rx,aclr=>aclr,rx_sig=>SYNTHESIZED_WIRE_0,data_out=>SYNTHESIZED_WIRE_1);b2v_inst2:usart_txPORTMAP(clk=>elk,tx_sig=>SYNTHESIZED_WIRE_0,data_in=>SYNTHESIZED_WIRE_1,idle=>idle,tx=>tx);ENDbdf_type;5、仿真結(jié)果打開(kāi)modelsim軟件,新建工程usart_tx,把usart_tx_tb.vhdl和uart_rx.vhdl兩個(gè)文件加入到工程項(xiàng)目中,保存、編譯后運(yùn)行仿真,把輸入和信號(hào)加入到仿真結(jié)果中,點(diǎn)擊運(yùn)行然后停止,放大波形進(jìn)行查看。仿真結(jié)果如下。Messages1/tx_tb/uut/clk■1D- /tx_tb/uut/data_in000000000000Lpoo-K310101/tx_tb/uut/tx_sig■——/tx_tb/uut/idle1 n■/tx_tb/uut/tx11 j_r—Li1J Lr~i/tx_tb/uut/send卩i/tx_tb/uut/tx_sig_bufp'/tx_tb/uut/idlereg0.~L_/tx_tb/uut/tx_start0nD-/tx_tb/uut/cnt00000000toooojooommBdooooooo圖6-2串口發(fā)送模塊仿真結(jié)果圖同樣的方法,對(duì)接收模塊進(jìn)行仿真,其仿真結(jié)果如下圖所示。

Messages/rx_tb/uut/dka/rx_tb/uut/rxJ/rx_tb/uut/adrB-J/rx_tb/uut/data_out/rx_tb/uut/rx_sigO-/rx_tb/uut/cnt'/rx_tb/uut/rxbufMessages/rx_tb/uut/dka/rx_tb/uut/rxJ/rx_tb/uut/adrB-J/rx_tb/uut/data_out/rx_tb/uut/rx_sigO-/rx_tb/uut/cnt'/rx_tb/uut/rxbuf/Htb/uut/rxFall'/rx_tb/uut/receive"/rx_tb/uut/idle111IJIJUIJIJIJIJU00000000010IJ口UUUUlJUlOuuuuuoibUUUlJlOlO:UUU010IJIJLIlJllIJIJIJILniuuuuuoi01010uoioibioJi0101010=二—rL——圖6-3串口接收仿真結(jié)果頂層文件中元件例化和端口映射完成后對(duì)文件進(jìn)行編譯,沒(méi)有錯(cuò)誤后加入激勵(lì)文件進(jìn)行仿真,仿真結(jié)果如下圖所示,從圖中可以看出發(fā)送端口波形和輸出一致。J/txrx_tb/uut/dk0'/txrx_tb/uut/rx1111?????[_ r1_J/txrx_tb/uut/adr1~1 y/txrx_tb/uut/idle0J 1'/txrxjtb/uut/tx1L1||—l_JiHll1‘/txrx_tb/uut/synth...01—rD- /txrx_tb/uut/synth...00000000迂100

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論