汪超宇
摘要:通用異步收發(fā)器是一種能同時(shí)支持短距離和長(zhǎng)距離數(shù)據(jù)傳輸?shù)拇型ㄐ沤涌?,被廣泛應(yīng)用于微機(jī)和外設(shè)之間的數(shù)據(jù)交換,本文對(duì)FPGA的通用異步收發(fā)器設(shè)計(jì)進(jìn)行分析。
關(guān)鍵詞:通用異步收發(fā)器數(shù)據(jù)傳輸數(shù)據(jù)交換
串行通信方式傳遞數(shù)據(jù)所傳輸?shù)木嚯x比較遠(yuǎn),所用的數(shù)據(jù)線(xiàn)也很少,并且其穩(wěn)定性也高。因此在數(shù)據(jù)通信方面能夠被廣泛的使用。異步收發(fā)器(UART)是經(jīng)常被使用來(lái)進(jìn)行串口通信的設(shè)備。本文就是用VHDL語(yǔ)言編寫(xiě)的應(yīng)用在FPGA上的一個(gè)UART。在傳遞數(shù)據(jù)時(shí),我們僅僅需要使用UART的幾個(gè)作用,所以如果專(zhuān)門(mén)購(gòu)置專(zhuān)用的UART,則會(huì)造成資金和功能上的浪費(fèi)。恰好VHDL可以用硬件語(yǔ)言搭建出UART的模型,可以根據(jù)所需要的功能來(lái)進(jìn)行程序的編寫(xiě),這樣既省費(fèi)用又省步驟。
1UART的工作原理
UART(UniversalAsynchronousReceiverTransmitter,通用異步收發(fā)器)是通常使用的異步串行傳遞數(shù)據(jù)的傳輸協(xié)議。在串行通信中,數(shù)據(jù)是一個(gè)字節(jié)幀一個(gè)字節(jié)幀來(lái)發(fā)送信息的。發(fā)送端和接收端在接收數(shù)據(jù)幀的時(shí)候必須有約定的格式和約定的波特率。一個(gè)數(shù)據(jù)幀由1位起始位(低電平)、5~8位數(shù)據(jù)位、1位校驗(yàn)位(可選可不選)和停止位來(lái)組成。一個(gè)數(shù)據(jù)幀的開(kāi)始便是起始位,起始位處于邏輯0狀態(tài),處于邏輯0狀態(tài)就表明發(fā)送端已經(jīng)準(zhǔn)備開(kāi)始發(fā)送數(shù)據(jù)了。一個(gè)數(shù)據(jù)幀的結(jié)束是停止位,停止位處于邏輯1狀態(tài),處于邏輯1就表明接收端已經(jīng)停止接收數(shù)據(jù)了。而波特率采用標(biāo)準(zhǔn)速率9600字節(jié)每秒。數(shù)據(jù)在傳輸時(shí),低位在前,高位在后。接收端檢測(cè)并確認(rèn)起始位后,開(kāi)始接收數(shù)據(jù)位。當(dāng)接到停止位后,F(xiàn)PGA向CPU發(fā)出中斷信號(hào)。發(fā)送數(shù)據(jù)時(shí),CPU設(shè)置波特率為9600字節(jié)每秒,然后FPGA將數(shù)據(jù)一幀一幀的通過(guò)總線(xiàn)傳遞給CPU,當(dāng)CPU接收到低電平時(shí),表示此時(shí)數(shù)據(jù)傳送結(jié)束。
2程序設(shè)計(jì)與仿真
頂層程序與仿真:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitytopis
port(clk32mhz,reset,rxd,xmit_cmd_p_in:instd_logic;
rec_ready,txd_out,txd_done_out:outstd_logic;
txdbuf_in:instd_logic_vector(7downto0);
rec_buf:outstd_logic_vector(7downto0);
bclkout:outstd_logic
);
endtop;
architectureBehavioraloftopis
componentreciever
port(bclkr,resetr,rxdr:instd_logic;
r_ready:outstd_logic;
rbuf:outstd_logic_vector(7downto0));
endcomponent;
componenttransfer
port(bclkt,resett,xmit_cmd_p:instd_logic;
txdbuf:instd_logic_vector(7downto0);
txd:outstd_logic;
txd_done:outstd_logic);
endcomponent;
componentbaud
port(clk,resetb:instd_logic;
bclk:outstd_logic);
endcomponent;
signalb:std_logic;
begin
u1: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);
bclkout<=b;
endBehavioral;
3總結(jié)
UlART經(jīng)常用于數(shù)據(jù)之間的串行通信,它所需要使用的線(xiàn)路較少,并且穩(wěn)定性高,數(shù)據(jù)可以傳輸很長(zhǎng)的距離,因此芯片或計(jì)算機(jī)系統(tǒng)之間進(jìn)行數(shù)據(jù)傳送時(shí)經(jīng)常用UART。使用VHDL語(yǔ)言,可以把UART有限狀態(tài)機(jī)做的更加精密,更加適合于數(shù)據(jù)的通信,數(shù)據(jù)之間的傳遞的穩(wěn)定性更高。
參考文獻(xiàn):
[1]朱勤.基于VHDL/FPGA的嵌入式UART的設(shè)計(jì)及FPGA驗(yàn)證[D].蘇州大學(xué),2011.
[2]劉李明.基于FPGA的通用實(shí)時(shí)信號(hào)處理系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn)[D].北京工業(yè)大學(xué),2009.
[3]劉志平.基于FPGA的高速數(shù)據(jù)采集存儲(chǔ)系統(tǒng)設(shè)計(jì)[D].西安電子科技大學(xué),2009.