賈 亮,冀 源
(1.沈陽航空航天大學 遼寧省通用航空重點實驗室, 遼寧 沈陽 110136;2.沈陽航空航天大學 電子信息工程學院, 遼寧 沈陽 110136)
基于FPGA的串口通信控制器設計
賈 亮1,2,冀 源2
(1.沈陽航空航天大學 遼寧省通用航空重點實驗室, 遼寧 沈陽 110136;2.沈陽航空航天大學 電子信息工程學院, 遼寧 沈陽 110136)
UART串行接口是各類芯片中最常用的異步通信接口,UART作為RS232協(xié)議的控制接口得到廣泛應用。介紹了一種基于FPGA的固定波特率串口通信控制器的多模塊設計方法,采用Altera公司的EP4CE10F17C8NFPGA芯片,用VHDL程序語言編程,經(jīng)過ModelSim軟件仿真,最后將程序燒寫到芯片,經(jīng)過串口助手測試驗證。實驗結果表明,數(shù)據(jù)傳輸快速、準確,可用于低速率異步通信。
UART串口通信;FPGA;VHDL;RS232
在計算機系統(tǒng)和網(wǎng)絡高速發(fā)展的時代,通信技術發(fā)揮著越來越重要的作用,UART[1-2]串口通信由于其傳輸線少、成本低、配置靈活、適合廣泛傳輸而備受大眾青睞,得到廣泛應用。本控制器采用FPGA作為核心模塊,通過自帶RS232接口及USB轉串口與計算機進行通信,經(jīng)試驗調試,可以實現(xiàn)串口通信。
現(xiàn)場可編程門陣列(FieldProgrammableGateArray,F(xiàn)PGA)具有集成度高、速度快、可靠性高、開發(fā)周期短、修改方便、可移植性強[3]等優(yōu)點,利用FPGA進行系統(tǒng)功能設計是當今電子設計的一種趨勢。
UART時序如 圖1所示。
圖1 UART時序圖
在UART接收時,采集一幀數(shù)據(jù)的中間8位有效位,忽略開始位與停止位;在UART發(fā)送時,將發(fā)送的8位數(shù)據(jù)轉為串行數(shù)據(jù)添加開始位、停止位。
UART協(xié)議中一幀數(shù)據(jù)共10bit,空閑時均處于高電平,當檢測到低電平時開始采集8bit有效數(shù)據(jù)位并將停止位置為高電平。
波特率:波特率表示每秒傳輸?shù)亩M制位數(shù),在本實驗中波特率設為9 600b/s。
電平轉換芯片MAX232:要實現(xiàn)串口通信,需要使用電平轉換芯片MAX232,配置電路如圖2所示。
MAX232芯片主要有以下特點[4]:
(1)符合所有RS_232技術標準;
(2)只需要單一+5V電源供電;
(3)片載電荷泵具有升壓、電源極性翻轉能力,能夠產(chǎn)生+10V和-10V電壓;
(4)功耗低,典型供電電流5mA;
(5)內部集成2個RS_232驅動器;
圖2 配置電路
(6)高集成度,片外最低只需4個電容即可工作。
UART控制器設計按照功能劃分可分為3個模塊:波特率發(fā)生模塊,數(shù)據(jù)接收模塊和數(shù)據(jù)發(fā)送模塊。
3.1 波特率發(fā)生模塊
FPGA系統(tǒng)提供50MHz的時鐘頻率,當波特率為9 600b/s時,發(fā)送一位數(shù)據(jù)需5 208個時鐘周期。在第2 604個時鐘周期時發(fā)出數(shù)據(jù)采樣脈沖信號sel,同時采樣數(shù)據(jù)位數(shù)信號num加1,采集完10個數(shù)據(jù)之后,num清零。
代碼如下:
entitybps_rxis
port(
clk:instd_logic; ——系統(tǒng)時鐘50MHz
en:instd_logic; ——使能端
rst_n:instd_logic;——系統(tǒng)復位端
sel_data:outstd_logic;——數(shù)據(jù)采集脈沖信號
num:outstd_logic_vector(3downto0) ——采集數(shù)據(jù)位數(shù)計數(shù)
);
endbps_rx;
architecturebehaveofbps_rxis
signalflag:std_logic; ——開始標志信號
signalnumber:std_logic_vector(3downto0);
signalsel:std_logic;
signalcnt:std_logic_vector(12downto0); ——時鐘計數(shù)信號
begin
process(clk,rst_n)
begin
else
if(number="1010")then
endif;
endif;
endif;
endprocess;
process(clk,rst_n)
begin
cnt<= "0000000000000";
ifcnt< "1010001011000"then
cnt<=cnt+ 1 ;
elsecnt<= "0000000000000";
endif;
elsecnt<= "0000000000000";
endif;
endif;
endprocess;
process(clk,rst_n)
begin
if(cnt= "101000101100")then
else
endif;
endif;
endprocess;
process(clk,rst_n)
Begin
number<= "0000";
number<=number+1;——采集一位數(shù)計數(shù)信號加1
elseif(number= "1010")then
number<= "0000";
endif;
endif;
endif;
endprocess;
num<=number;
sel_data<=sel;
3.2 數(shù)據(jù)接收模塊
根據(jù)UART協(xié)議接收時序,采集一幀數(shù)據(jù)的中間8位[5]。數(shù)據(jù)接收端初始電平為高,當檢測到低電平開始位時,使能波特率發(fā)生器,開始數(shù)據(jù)采集,進行串并轉換,轉換完成之后,按照時序進行輸出。
代碼如下:
entityuart_rxis
port(
clk,rst_n:instd_logic;
rx_data:instd_logic;——數(shù)據(jù)接收端
sel_data:instd_logic;——采樣脈沖
num:instd_logic_vector(3downto0);——數(shù)據(jù)位數(shù)計數(shù)
en:outstd_logic;——對波特率發(fā)生器使能端
tx_en:outstd_logic;——數(shù)據(jù)發(fā)送使能
rx_d:outstd_logic_vector(7downto0)——數(shù)據(jù)發(fā)送端
);
enduart_rx;
architecturebehaveofuart_rxis
signalin_1,in_2:std_logic; ——數(shù)據(jù)傳輸開始檢測信號
Signald_in:std_logic_vector(7downto0); ——并行數(shù)據(jù)寄存器
begin
process(clk,rst_n)
begin
in_1 <=rx_data;——初始狀態(tài)接收端為高電平
in_2 <=in_1;
endif;
endprocess;
en<=in_2and(notin_1);——當檢測到信號由高變低時啟動使能信號
process(rst_n,clk)
begin
rx_d<="00000000";
d_in<= "00000000";
casenumis
when"0000"=>null;——開始接收數(shù)據(jù)
when"0001"=>d_in(0)<=rx_data;
when"0010"=>d_in(1)<=rx_data;
when"0011"=>d_in(2)<=rx_data;
when"0100"=>d_in(3)<=rx_data;
when"0101"=>d_in(4)<=rx_data;
when"0110"=>d_in(5)<=rx_data;
when"0111"=>d_in(6)<=rx_data;
when"1000"=>d_in(7)<=rx_data;
when"1001"=>rx_d<=d_in;
whenothers=>null;
endcase;
endif;
endif;
endprocess;
process(clk,rst_n)
begin
else
endif;
endif;
endprocess;
3.3 數(shù)據(jù)發(fā)送模塊
發(fā)送模塊的作用是將8bit并行數(shù)據(jù)轉換為串行數(shù)據(jù)[4],并按照每幀10bit數(shù)據(jù)進行輸出,其工作過程與接收方式相反,此外有起始結束位的添加。
3.4 系統(tǒng)功能圖
系統(tǒng)功能圖如圖3所示。
圖3 系統(tǒng)功能圖
系統(tǒng)仿真圖如圖4所示。
圖4 系統(tǒng)仿真圖
串口測試結果:將經(jīng)過編譯仿真無誤后的VHDl程序下載到FPGA中[6],用串口進行收發(fā)數(shù)據(jù),選用COM7口,9 600b/s波特率,當發(fā)送數(shù)據(jù)145789658742 時,接收端收到與發(fā)送端一致的數(shù)據(jù),如圖5所示。
圖5 串口測試結果
用FPGA實現(xiàn)串口通信功能,可以將串口功能與其他系統(tǒng)功能整合進一個FPGA,從而減小系統(tǒng)面積,降低功耗,具有更高的穩(wěn)定性,提高數(shù)據(jù)采集系統(tǒng)的速度,增強系統(tǒng)的抗干擾能力及數(shù)據(jù)傳輸?shù)目煽啃訹7]。這種設計方法已經(jīng)成為當今電子設計領域的一種趨勢,在實際應用中,將文中設計的UART電路作為一個模塊嵌入到一個FPGA實現(xiàn)的數(shù)據(jù)采集與處理系統(tǒng)中,實現(xiàn)串口通信功能,證明該電路設計可靠,工作穩(wěn)定。
[1] 楊英強.一種基于FPGA的UART電路實現(xiàn)[J].現(xiàn)代電子技術,2005,28(12):82-84.
[2] 于斌,謝龍漢.ModelSim電子系統(tǒng)分析及仿真這[M].北京:電子工業(yè)出版社,2014.
[3] 陳忠平,高金定,高見芳.基于QuartusⅡ的FPGA/CPLD設計與實現(xiàn)[M].北京:電子工業(yè)出社,2010.
[4] 韓德紅,張顯才,李向東.基于FPGA的串口控制器設計與實現(xiàn)[J].空軍雷達學院學報,2008,22(2):113-116.
[5] 雷伏容.VHDL電路設計[M].北京:清華大學出版社,2006.
[6] 任愛峰,初秀琴.基于FPGA的嵌入式系統(tǒng)設計[M].西安:西安電子科技大學出版社,2005.
[7] 吳繼華,王誠.AlteraFPGA/CPLD設計[M].北京:人民郵電出版社,2005.
Design of serial communication controller based on FPGA
JiaLiang1,2,JiYuan2
(1.LiaoningKeyLaboratoryofGeneralAviation,ShenyangAerospaceUniversity(SAU),Shenyang110136,China;2.ElectronicandInformationEngineering,ShenyangAerospaceUniversity,Shenyang110136,China)
UARTserialinterfaceisthemostcommonlyusedinterfaceinvarioustypesofasynchronouscommunicationinterface,RS232asthecontrolinterfaceUARTprotocolhasbeenwidelyused.Inthispaper,weintroduceamulti-moduledesignmethodbasedonFPGAwithafixedbaudrateserialcommunicationcontrollerusingAltera’sEP4CE10F17C8NFPGAchip,andusingtheVHDLasprogramminglanguage.ItwassimulatedbyModelsimsoftware.Finally,theprogramwasburntandwrittenonchip.Aftertestingandverifingbyserialportassistant,theexperimentalresultsshowthatdatatransmissionisquicklyandaccurately.
UARTserialcommunication;FPGA;VHDL;RS232
TN
ADOI: 10.19358/j.issn.1674- 7720.2016.22.009
賈亮,冀源. 基于FPGA的串口通信控制器設計[J].微型機與應用,2016,35(22):33-35,39.
2016-05-19)
賈亮(1971—),男,在讀博士研究生,副教授,碩士生導師,主要研究方向:信息獲取與處理。
冀源(1990—),男,在讀碩士研究生,主要研究方向:信息獲取與處理。