張建軍,安海佳,譚可仕,王 鋒,韓懷宇
(中國空間技術(shù)研究院,北京 100094)
FPGA狀態(tài)機(jī)在多路異步串口通信處理的實(shí)時優(yōu)勢
張建軍,安海佳,譚可仕,王 鋒,韓懷宇
(中國空間技術(shù)研究院,北京 100094)
首先簡要介紹了異步串口板的通常設(shè)計方法,并且提出了這些方法的不足之處,重點(diǎn)闡述了基于FPGA狀態(tài)機(jī)和片上總線的新設(shè)計方案,以及該方案的技術(shù)優(yōu)勢,隨后公布了基于該方案的異步串口板達(dá)到的性能指標(biāo);通過比較有關(guān)應(yīng)答延遲的試驗(yàn)數(shù)據(jù),提出了基于FPGA狀態(tài)機(jī)和基于DSP處理器的異步串口板卡存在明顯的處理速度差異問題,并基于兩種設(shè)計方案,解釋了形成差異的原因;最后提出了FPGA狀態(tài)機(jī)對外部總線存儲器或端口的訪問管理性能大幅超越了任何一款DSP處理器的觀點(diǎn),并對同行提出了類似研發(fā)項(xiàng)目的設(shè)計建議。
FPGA;狀態(tài)機(jī);異步串口;實(shí)時
某設(shè)備的測試平臺必須達(dá)到36路通道、11種通訊協(xié)議、波特率4/19.2/38.4/57.6/115.2(Kbps)、小于協(xié)議分析和數(shù)據(jù)處理時間小于1 μs、通訊模式可配置等技術(shù)要求,因此測試平臺內(nèi)異步串口板的設(shè)計方案要面向上述技術(shù)要求而制定。目前異步串口板通常采用嵌入式處理器或者基于FPGA的,非總線式的,異步串口收發(fā)和處理邏輯。前者易于管理總線,分析協(xié)議和處理數(shù)據(jù),但處理速度過慢,后者處理速度快,但無法在線配置通訊模式,不能利用總線進(jìn)行全局管理,故需要一種新的多路異步串口板設(shè)計方案,即能夠?qū)崿F(xiàn)管理總線,分析協(xié)議和處理數(shù)據(jù),又具有強(qiáng)實(shí)時性能,以達(dá)到測試平臺的技術(shù)要求。
目前異步串口板一般采用以下兩類方法實(shí)現(xiàn)。
采用獨(dú)立的嵌入式處理器作為數(shù)據(jù)處理單元。異步串口單元要么使用嵌入式處理器自身的2到3個異步串口,要么使用連接到FPGA片內(nèi)總線的通用異步收發(fā)器或異步收發(fā)邏輯,從而建立起一主多從式總線結(jié)構(gòu)。
采用FPGA芯片集成了若干獨(dú)立的異步串口通路,每個通路均有一對處理邏輯和收發(fā)邏輯,其中收發(fā)邏輯實(shí)現(xiàn)了一路串行數(shù)據(jù)的接受、發(fā)送和并串轉(zhuǎn)換,處理邏輯實(shí)現(xiàn)了一路串行數(shù)據(jù)的讀取、處理和存儲。
上述兩類方法存在不足之處。傳統(tǒng)的異步串口板,都是采用單片機(jī)或嵌入式處理器作為處理單元,通過訪問通用異步收發(fā)器來讀取或者發(fā)送數(shù)據(jù),數(shù)據(jù)存儲器為一片雙口SDRAM,通過信號燈控制協(xié)議,總線上位機(jī)和板卡處理單元輪換來訪問數(shù)據(jù),板卡處理單元直接接受和應(yīng)答數(shù)據(jù)。通常情況下,串口應(yīng)答有響應(yīng)時間的要求,這使處理單元底層軟件的開發(fā)難度加大,任何操作都需要處理單元的軟件來控制。用嵌入式處理器讀取、處理和存儲數(shù)據(jù),速度慢,特別是無法滿足高速、多路、實(shí)時接收和應(yīng)答的要求。高速嵌入式處理器從串口數(shù)據(jù)幀接收完畢開始,到串行數(shù)據(jù)幀開始發(fā)送為止,即處理延遲至少10 μs級。如果高波特率、多串口通道、獨(dú)立通訊時,就可能出現(xiàn)串口應(yīng)答滯后或數(shù)據(jù)幀不完整的問題。
使用FPGA芯片集成串口收發(fā)和處理邏輯的技術(shù)手段,解決了多通路、高通訊速率和高頻率下通訊可靠性問題,可以保證各串行通路發(fā)送數(shù)據(jù)幀的完整。但依然存在不足,一是收發(fā)邏輯對處理邏輯是一一對應(yīng)的,而不是基于片內(nèi)總線實(shí)現(xiàn)一主對多從的模式,造成FPGA資源的浪費(fèi),異步串口板可擴(kuò)展性差。二是在目前應(yīng)用中,串口收發(fā)邏輯僅實(shí)現(xiàn)了串并轉(zhuǎn)換,與通用異步串行收發(fā)器相比,功能不足,不具有通用性,如不支持總線的通訊模式設(shè)置、工作狀態(tài)查詢、通訊錯誤類型查詢、處理器中斷報警和波特率設(shè)置等,使得兼容通用異步串行收發(fā)器的異步串口板驅(qū)動程序不兼容FPGA芯片集成串并轉(zhuǎn)換電路的板卡。
為便于性能比較,分別用TMS320C6416 DSP處理器和FPGA狀態(tài)機(jī)作處理單元,進(jìn)行多路通用異步串口管理,協(xié)議分析和數(shù)據(jù)處理,最終實(shí)現(xiàn)兩塊功能相同的異步串口板(兩者系統(tǒng)結(jié)構(gòu)、程序流程、通訊協(xié)議和軟硬件接口均相同),以便性能比較。每塊均有1個FPGA芯片XC3S2000-4 FG456,1個PCI總線控制器PCI9052,1個雙口SDRAM IDT7132。只是前者采用通常的方法,在板卡上多了TMS320C6416 DSP處理器,而后者沒有DSP處理器,在FPGA芯片上多了WB總線處理邏輯。兩者在FPGA上均集成了WB片上總線,36個通用異步串行收發(fā)器軟核、1個雙口SDRAM接口邏輯、地址譯碼器、配置狀態(tài)寄存器區(qū),以及串口接收濾波邏輯等。下文重點(diǎn)介紹FPGA狀態(tài)機(jī)作處理單元的實(shí)現(xiàn)方法,性能指標(biāo),并對兩者的處理速度進(jìn)行了比較和分析。
基于FPGA狀態(tài)機(jī)和WISHBONE片上總線(下文簡稱為WB總線)的36通路異步串口板系統(tǒng)架構(gòu)如圖1所示。
圖1 基于FPGA狀態(tài)機(jī)和WB片上總線的異步串口板系統(tǒng)架構(gòu)
2.2.1 PCI9052總線控制器
實(shí)現(xiàn)了總線到9052 LOCAL總線協(xié)議適配,LOCAL總線配置為8位數(shù)據(jù)線,1個2K字節(jié)的RAM空間,1個IO空間,1個高電平有效的中斷源。
2.2.2 雙口SDRAM
采用IDT7132芯片作為數(shù)據(jù)緩沖區(qū),容量2 k*8 bit,讀寫周期均為20 ns。為了避免上位機(jī)正在更新某數(shù)據(jù)區(qū),而與該數(shù)據(jù)區(qū)對應(yīng)的異步串口要求發(fā)送該數(shù)據(jù)區(qū)的情況,在設(shè)計中將雙口SDRAM的存儲空間分為兩部分,即上位機(jī)可寫訪問的一級緩沖區(qū)和WB總線處理邏輯可寫訪問的二級緩沖區(qū)。對應(yīng)36通路,一級和二級緩沖區(qū)均分成了72個子區(qū),每路異步串口對應(yīng)著一級緩沖區(qū)內(nèi)的一對發(fā)送子區(qū)和接收子區(qū),以及二級緩沖區(qū)內(nèi)的一對發(fā)送子區(qū)和接收子區(qū)。上位機(jī)可讀寫一級發(fā)送子區(qū),但只能讀一級接收子區(qū);WB總線處理邏輯只能讀一級發(fā)送子區(qū),可讀寫一級接收子區(qū)和二級所有子區(qū)。
2.2.3 FPGA芯片
FPGA芯片為串口板核心器件,選用XC3S2000-4 FG456芯片,支持200 MHz時鐘,IO口上升和下降速度均達(dá)到5 ns。
1)WB片內(nèi)總線:即WB片內(nèi)總線,是一種應(yīng)用普遍的、具有靈活性的IP核互聯(lián)接口。
2)異步收發(fā)器:異步收發(fā)器為IP軟核,來源于opencores開源組織,支持WB接口,與通用異步收發(fā)器兼容,每個可實(shí)現(xiàn)一路全雙工異步串口通訊。
3)雙口SDRAM總線接口邏輯:片內(nèi)有兩個獨(dú)立的雙口SDRAM總線接口邏輯,分別實(shí)現(xiàn)了雙口SDRAM與WB總線和LOCAL總線的邏輯連接。
4)LOCAL總線寄存器區(qū):為了方便上位機(jī)對各異步串口獨(dú)立靈活配置、全面監(jiān)控工作狀態(tài),必須設(shè)置可供上位機(jī)訪問的若干配置寄存器和狀態(tài)寄存器, 而且LOCAL總線寄存器區(qū)邏輯是上位機(jī)與片內(nèi)WB總線處理邏輯之間的通訊橋梁。
5)地址譯碼邏輯:片內(nèi)有兩個獨(dú)立的地址譯碼邏輯,分別根據(jù)LOCAL總線地址和WB總線地址,片選總線從邏輯。
6)串口接收濾波邏輯:片內(nèi)36個獨(dú)立的串口接收濾波邏輯,每個對應(yīng)一路異步收發(fā)器的接收端,可濾除正負(fù)跳變寬度小于1 μs的毛刺,但會造成1 μs的信號延遲。
7)WB總線處理邏輯:實(shí)質(zhì)是WB總線狀態(tài)機(jī),實(shí)現(xiàn)了訪問WB總線、數(shù)據(jù)處理、數(shù)據(jù)存儲和各串口通訊協(xié)議的功能。主要任務(wù)是根據(jù)上位機(jī)設(shè)置的LOCAL總線配置寄存器區(qū),設(shè)置各異步收發(fā)器的工作模式,接收串口數(shù)據(jù),遵循通訊協(xié)議,發(fā)送串口數(shù)據(jù),完成一級、二級緩沖區(qū)數(shù)據(jù)更新或復(fù)制,并將各串口通道的工作狀態(tài)標(biāo)識到LOCAL總線狀態(tài)寄存器區(qū),供上位機(jī)查詢。
2.2.4 FPGA資源占用情況
布局布線后,F(xiàn)PGA資源占用情況如下。
Target Device : xc3s2000
Target Speed : -4
Target Package : fg456
-------------Design Summary----
Slice Flip Flops: 13117 out of 40,960 32%
4 input LUTs : 26679 out of 40,960 65%
Occupied Slices : 17264 out of 20,480 84%
Bonded IOBs : 211 out of 333 63%
Total equivalent gate count for design: 373677
FPGA程序主要模塊包括,WB總線處理邏輯、PCI9052總線控制器與雙口SDRAM的接口邏輯、WB片內(nèi)總線與雙口SDRAM的接口邏輯、串口接收濾波邏輯、地址譯碼器和配置狀態(tài)寄存器區(qū)等,其中WB總線處理邏輯實(shí)現(xiàn)了多路通用異步串口管理、協(xié)議分析和數(shù)據(jù)處理,重點(diǎn)介紹WB總線處理邏輯(狀態(tài)機(jī))的實(shí)現(xiàn)方法。因?yàn)榇诎逋ǖ罃?shù)量多,通信協(xié)議繁雜,版面所限,僅介紹其中1路通道的編程方法,其它35路通道的編程方法相同,也由此邏輯統(tǒng)一管理。
該路通信協(xié)議,波特率115.2 k,每個字包括1個起始位,8個數(shù)據(jù)位,1個效驗(yàn)位和1個停止位。通信幀包括命令段、數(shù)據(jù)段和效驗(yàn)段,結(jié)構(gòu)如下表:
通信幀命令段數(shù)據(jù)段效驗(yàn)段接收幀(從串口到上位機(jī))1個字8個字1個字發(fā)送幀(從上位機(jī)到串口)1個字10個字1個字
WB總線處理邏輯狀態(tài)機(jī)的處理流程簡述如下。如果上位機(jī)請求更新一級緩沖區(qū)的某子區(qū),上位機(jī)查詢“FPGA訪問雙口SDRAM一級緩沖區(qū)標(biāo)志”,若為真,則等待;否則置位“上位機(jī)訪問雙口SDRAM一級緩沖區(qū)標(biāo)志”,設(shè)置“更新發(fā)送區(qū)ID寄存器”和“發(fā)送幀長度寄存器”,更新一級緩沖區(qū)的發(fā)送子區(qū),完畢后復(fù)位“上位機(jī)訪問雙口SDRAM一級緩沖區(qū)標(biāo)志”,產(chǎn)生“更新二級緩沖區(qū)的中斷請求”。WB總線處理邏輯響應(yīng)該中斷,查詢“上位機(jī)訪問雙口SDRAM一級緩沖區(qū)標(biāo)志”,若為真,則等待;否則置位“FPGA訪問雙口SDRAM一級緩沖區(qū)標(biāo)志”,依據(jù)“更新發(fā)送區(qū)ID寄存器”內(nèi)容,讀訪問一級緩沖區(qū)的相應(yīng)發(fā)送子區(qū),并存入二級緩沖區(qū)的相應(yīng)發(fā)送子區(qū),完畢后復(fù)位“FPGA訪問雙口SDRAM一級緩沖區(qū)標(biāo)志”。在WB總線處理邏輯更新二級緩沖區(qū)期間,暫不響應(yīng)異步串口交易中斷。每次FPGA讀寫訪問IDT7132,需20 ns。在處理任務(wù)最重條件下,即WB總線處理邏輯在更新二級緩存時,串口恰好要求傳送12個字節(jié)上限的數(shù)據(jù),發(fā)送只延遲20*12*2=480 ns,仍滿足小于1 μs的試驗(yàn)要求。
如果某異步收發(fā)器存在接收或發(fā)送任務(wù),即串口通信中斷請求存在,WB總線處理邏輯讀訪問該異步收發(fā)器的中斷狀態(tài)寄存器,如果是發(fā)送中斷請求,WB總線處理邏輯從二級緩沖區(qū)某發(fā)送子區(qū)讀取發(fā)送數(shù)據(jù),寫入該異步收發(fā)器的“發(fā)送數(shù)據(jù)寄存器”中,每發(fā)送一個字節(jié),異步收發(fā)器均會再請求中斷,WB總線處理邏輯循環(huán)響應(yīng),直至發(fā)送的字節(jié)數(shù)等于對應(yīng)的“發(fā)送幀長度寄存器”預(yù)設(shè)值,發(fā)送完畢,清相應(yīng)中斷;如果是接收中斷請求,讀訪問接收數(shù)據(jù)寄存器,并將數(shù)據(jù)存入二級緩沖區(qū)對應(yīng)接收子區(qū)。每接收一個字節(jié)后,在“接收幀超時結(jié)束門限寄存器”設(shè)置的時間內(nèi)未出現(xiàn)新的接收數(shù)據(jù)中斷,則認(rèn)為已收到完整數(shù)據(jù)幀。隨后根據(jù)接收數(shù)據(jù)幀的內(nèi)容,判斷是否存在錯誤,以及何種錯誤,并標(biāo)識在對應(yīng)的“接收幀診斷結(jié)果寄存器”和“接收幀長度寄存器”,并設(shè)置“二級緩沖區(qū)接收子區(qū)覆蓋一級緩沖區(qū)接收子區(qū)”的中斷請求。如果上位機(jī)未訪問一級緩沖區(qū),則WB總線處理邏輯響應(yīng)上述中斷,執(zhí)行二級至一級的某接收子區(qū)“數(shù)據(jù)復(fù)制”后,清相應(yīng)中斷,置位LOCAL總線接收中斷請求,請求上位機(jī)從一級緩沖區(qū)讀取數(shù)據(jù);如果上位機(jī)正在訪問一級緩沖區(qū),則等待時機(jī)再復(fù)制數(shù)據(jù)。
WB總線處理邏輯狀態(tài)機(jī)的實(shí)現(xiàn)方法如下。
module wb_master
(
輸入輸出端口聲明
);
always@(posedge WB總線復(fù)位 or posedge WB總線時鐘)
begin
if (WB總線復(fù)位)
復(fù)位"二級緩沖區(qū)接收子區(qū)覆蓋一級緩沖區(qū)接收子區(qū)"中斷請求;
else if(接收幀超時結(jié)束門限寄存器設(shè)置的時間內(nèi)未出現(xiàn)新的接收數(shù)據(jù)中斷請求)
認(rèn)為已收到一個數(shù)據(jù)幀,設(shè)置"二級緩沖區(qū)接收子區(qū)覆蓋一級緩沖區(qū)接收子區(qū)"中斷請求;
else if(二級緩沖區(qū)覆蓋一級相應(yīng)子區(qū)完畢)
復(fù)位"二級緩沖區(qū)接收子區(qū)覆蓋一級緩沖區(qū)接收子區(qū)"中斷請求;
end
always@(posedge WB總線復(fù)位 or posedge WB總線時鐘)
begin
if (WB總線復(fù)位)
接收幀診斷結(jié)果寄存器和接收幀長度寄存器復(fù)位;
else if(接收幀超時結(jié)束門限寄存器設(shè)置的時間內(nèi)未出現(xiàn)新的接收數(shù)據(jù)中斷請求)
begin
隨后根據(jù)接收數(shù)據(jù)幀的內(nèi)容,判斷是否存在錯誤,以及何種錯誤,并標(biāo)識在對應(yīng)的
"接收幀診斷結(jié)果寄存器"和"接收幀長度寄存器";
end
end
always@(posedge WB總線復(fù)位 or posedge WB總線時鐘) //WB總線處理邏輯狀態(tài)機(jī)
begin
if (WB總線復(fù)位)
寄存器初始化;
else
begin
case(WB總線處理邏輯工作狀態(tài))
清UART中斷寄存器 :
啟動WB讀時序,讀UART中斷寄存器;
等待狀態(tài) :
begin
if(UART通信中斷請求)
WB總線處理邏輯工作狀態(tài) = 讀中斷狀態(tài)寄存器;
else if(延遲發(fā)送定時器溢出)
begin
復(fù)位延遲發(fā)送定時器、延遲發(fā)送定時器溢出信號;
if(發(fā)送幀長度為0)
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
else
begin
if(如果接收幀完整正確)
WB總線處理邏輯工作狀態(tài) = 讀二級緩沖區(qū)發(fā)送子區(qū);
else
WB總線處理邏輯工作狀態(tài) = 發(fā)送錯誤提示碼;
end
end
else if(更新二級緩沖區(qū)中斷請求 & ~上位機(jī)訪問雙口SDRAM一級緩沖區(qū)標(biāo)志 & 相應(yīng)串口不正在發(fā)送數(shù)據(jù))
begin
WB總線處理邏輯工作狀態(tài) = 讀一級緩沖區(qū)的延遲發(fā)送時間寄存器;
置位FPGA訪問雙口SDRAM一級緩沖區(qū)標(biāo)志;
end
else if(二級緩沖區(qū)接收子區(qū)覆蓋一級緩沖區(qū)接收子區(qū)中斷請求 & ~上位機(jī)訪問雙口SDRAM一級緩沖區(qū)標(biāo)志 & 相應(yīng)串口不正在接收數(shù)據(jù))
begin
WB總線處理邏輯工作狀態(tài) = 讀二級緩沖區(qū)接收子區(qū)數(shù)據(jù);
置位FPGA訪問雙口SDRAM一級緩沖區(qū)標(biāo)志;
end
else
begin
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
復(fù)位FPGA訪問雙口SDRAM一級緩沖區(qū)標(biāo)志;
end
end
讀一級緩沖區(qū)的延遲發(fā)送時間寄存器 :
begin
啟動WB總線讀時序,讀一級緩沖區(qū)的延遲發(fā)送時間寄存器;
WB總線處理邏輯工作狀態(tài) = 寫二級緩沖區(qū)的延遲發(fā)送時間寄存器;
end
寫二級緩沖區(qū)的延遲發(fā)送時間寄存器 :
begin
啟動WB總線寫時序,寫二級緩沖區(qū)的延遲發(fā)送時間寄存器;
WB總線處理邏輯工作狀態(tài) = 讀一級緩沖區(qū)的更新發(fā)送區(qū)ID寄存器;
end
讀一級緩沖區(qū)的更新發(fā)送區(qū)ID寄存器 :
begin
啟動WB總線讀時序,讀一級緩沖區(qū)的更新發(fā)送區(qū)ID寄存器;
根據(jù)一級緩沖區(qū)的更新發(fā)送區(qū)ID寄存器,確定更新長度寄存器;
WB總線處理邏輯工作狀態(tài) = 寫二級緩沖區(qū)的更新發(fā)送區(qū)ID寄存器;
End
module wb_master
(
輸入輸出端口聲明
);
always@(posedge WB總線復(fù)位 or posedge WB總線時鐘)
begin
if (WB總線復(fù)位)
復(fù)位"二級緩沖區(qū)接收子區(qū)覆蓋一級緩沖區(qū)接收子區(qū)"中斷請求;
else if(接收幀超時結(jié)束門限寄存器設(shè)置的時間內(nèi)未出現(xiàn)新的接收數(shù)據(jù)中斷請求)
認(rèn)為已收到一個數(shù)據(jù)幀,設(shè)置"二級緩沖區(qū)接收子區(qū)覆蓋一級緩沖區(qū)接收子區(qū)"中斷請求;
else if(二級緩沖區(qū)覆蓋一級相應(yīng)子區(qū)完畢)
復(fù)位"二級緩沖區(qū)接收子區(qū)覆蓋一級緩沖區(qū)接收子區(qū)"中斷請求;
end
always@(posedge WB總線復(fù)位 or posedge WB總線時鐘)
begin
if (WB總線復(fù)位)
接收幀診斷結(jié)果寄存器和接收幀長度寄存器復(fù)位;
else if(接收幀超時結(jié)束門限寄存器設(shè)置的時間內(nèi)未出現(xiàn)新的接收數(shù)據(jù)中斷請求)
begin
隨后根據(jù)接收數(shù)據(jù)幀的內(nèi)容,判斷是否存在錯誤,以及何種錯誤,并標(biāo)識在對應(yīng)的
"接收幀診斷結(jié)果寄存器"和"接收幀長度寄存器";
end
end
always@(posedge WB總線復(fù)位 or posedge WB總線時鐘) //WB總線處理邏輯狀態(tài)機(jī)
begin
if (WB總線復(fù)位)
寄存器初始化;
else
begin
case(WB總線處理邏輯工作狀態(tài))
清UART中斷寄存器 :
啟動WB讀時序,讀UART中斷寄存器;
等待狀態(tài) :
begin
if(UART通信中斷請求)
WB總線處理邏輯工作狀態(tài) = 讀中斷狀態(tài)寄存器;
else if(延遲發(fā)送定時器溢出)
begin
復(fù)位延遲發(fā)送定時器、延遲發(fā)送定時器溢出信號;
if(發(fā)送幀長度為0)
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
else
begin
if(如果接收幀完整正確)
WB總線處理邏輯工作狀態(tài) = 讀二級緩沖區(qū)發(fā)送子區(qū);
else
WB總線處理邏輯工作狀態(tài) = 發(fā)送錯誤提示碼;
end
end
else if(更新二級緩沖區(qū)中斷請求 & ~上位機(jī)訪問雙口SDRAM一級緩沖區(qū)標(biāo)志 & 相應(yīng)串口不正在發(fā)送數(shù)據(jù))
begin
WB總線處理邏輯工作狀態(tài) = 讀一級緩沖區(qū)的延遲發(fā)送時間寄存器;
置位FPGA訪問雙口SDRAM一級緩沖區(qū)標(biāo)志;
end
else if(二級緩沖區(qū)接收子區(qū)覆蓋一級緩沖區(qū)接收子區(qū)中斷請求 & ~上位機(jī)訪問雙口SDRAM一級緩沖區(qū)標(biāo)志 & 相應(yīng)串口不正在接收數(shù)據(jù))
begin
WB總線處理邏輯工作狀態(tài) = 讀二級緩沖區(qū)接收子區(qū)數(shù)據(jù);
置位FPGA訪問雙口SDRAM一級緩沖區(qū)標(biāo)志;
end
else
begin
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
復(fù)位FPGA訪問雙口SDRAM一級緩沖區(qū)標(biāo)志;
end
end
讀一級緩沖區(qū)的延遲發(fā)送時間寄存器 :
begin
啟動WB總線讀時序,讀一級緩沖區(qū)的延遲發(fā)送時間寄存器;
WB總線處理邏輯工作狀態(tài) = 寫二級緩沖區(qū)的延遲發(fā)送時間寄存器;
end
寫二級緩沖區(qū)的延遲發(fā)送時間寄存器 :
begin
啟動WB總線寫時序,寫二級緩沖區(qū)的延遲發(fā)送時間寄存器;
WB總線處理邏輯工作狀態(tài) = 讀一級緩沖區(qū)的更新發(fā)送區(qū)ID寄存器;
end
讀一級緩沖區(qū)的更新發(fā)送區(qū)ID寄存器 :
begin
啟動WB總線讀時序,讀一級緩沖區(qū)的更新發(fā)送區(qū)ID寄存器;
根據(jù)一級緩沖區(qū)的更新發(fā)送區(qū)ID寄存器,確定更新長度寄存器;
WB總線處理邏輯工作狀態(tài) = 寫二級緩沖區(qū)的更新發(fā)送區(qū)ID寄存器;
end
else if(接收字節(jié)計數(shù)器 < 接收幀長度寄存器)
WB總線處理邏輯工作狀態(tài) = 寫二級緩沖區(qū)接收子區(qū);
else
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
if(接收字節(jié)計數(shù)器 < 接收幀長度寄存器 - 1)
效驗(yàn)碼累加寄存器 = 效驗(yàn)碼累加寄存器 + 接收數(shù)據(jù)寄存器;
else if(接收字節(jié)計數(shù)器 == 接收幀長度寄存器 - 1)
begin
效驗(yàn)碼累加寄存器 = 效驗(yàn)碼累加寄存器 ^ 接收數(shù)據(jù)寄存器;
if(效驗(yàn)碼累加寄存器 == 0)
復(fù)位效驗(yàn)碼錯誤標(biāo)識;
else
置位效驗(yàn)碼錯誤標(biāo)識;
end
end
寫二級緩沖區(qū)接收子區(qū) :
begin
啟動WB總線寫時序,將接收數(shù)據(jù)寫入二級緩沖區(qū)接收子區(qū);
if(接收字節(jié)計數(shù)器 < 接收幀長度寄存器)
接收字節(jié)計數(shù)器 = 接收字節(jié)計數(shù)器 + 1;
if(接收字節(jié)計數(shù)器 < 接收幀長度寄存器)
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
else if(接收字節(jié)計數(shù)器 == 接收幀長度寄存器)
WB總線處理邏輯工作狀態(tài) = 讀二級緩沖區(qū)的發(fā)送延遲時間寄存器;
end
讀二級緩沖區(qū)的發(fā)送延遲時間寄存器 : //讀二級緩沖區(qū)的延遲發(fā)送時間寄存器,打開延遲發(fā)送計時器
begin
啟動WB總線讀時序,讀二級緩沖區(qū)的延遲發(fā)送時間寄存器;
設(shè)置延遲發(fā)送時間寄存器;
啟動延遲發(fā)送定時器;
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
end
讀二級緩沖區(qū)發(fā)送子區(qū) :
begin
根據(jù)命令碼寄存器和發(fā)送字節(jié)計數(shù)器,確定發(fā)送數(shù)據(jù)在二級緩沖區(qū)發(fā)送子區(qū)的地址;
啟動WB總線讀時序,讀二級緩沖區(qū)發(fā)送子區(qū)數(shù)據(jù);
WB總線處理邏輯工作狀態(tài) = 發(fā)送二級緩沖區(qū)發(fā)送子區(qū)數(shù)據(jù);
end
發(fā)送二級緩沖區(qū)發(fā)送子區(qū)數(shù)據(jù) :
begin
啟動WB總線寫時序,將二級緩沖區(qū)發(fā)送子區(qū)數(shù)據(jù)寫入發(fā)送數(shù)據(jù)寄存器;
發(fā)送字節(jié)計數(shù)器 = 發(fā)送字節(jié)計數(shù)器 + 1;
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
end
發(fā)送錯誤提示碼 : //當(dāng)接收幀錯誤時,發(fā)送錯誤提示碼
begin
啟動WB總線寫時序,將錯誤提示碼寫入發(fā)送數(shù)據(jù)寄存器;
發(fā)送字節(jié)計數(shù)器 = 發(fā)送字節(jié)計數(shù)器 + 1;
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
end
讀二級緩沖區(qū)接收子區(qū)數(shù)據(jù) :
begin
根據(jù)UART地址和更新字節(jié)計數(shù)器,確定新數(shù)據(jù)在二級緩沖區(qū)接收子區(qū)的地址;
啟動WB總線讀時序,讀二級緩沖區(qū)接收子區(qū)新數(shù)據(jù);
WB總線處理邏輯工作狀態(tài) = 寫一級緩沖區(qū)接收子區(qū)數(shù)據(jù);
end
寫一級緩沖區(qū)接收子區(qū)數(shù)據(jù) :
begin
根據(jù)UART地址和更新字節(jié)計數(shù)器,確定一級緩沖區(qū)接收子區(qū)的地址;
啟動WB總線寫時序,將新數(shù)據(jù)寫入一級緩沖區(qū)接收子區(qū);
更新字節(jié)計數(shù)器 = 更新字節(jié)計數(shù)器 + 1;
if(更新字節(jié)計數(shù)器 == 接收幀長度寄存器)
begin
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
更新字節(jié)計數(shù)器 = 8'h0;
end
else if(更新字節(jié)計數(shù)器 < 接收幀長度寄存器)
WB總線處理邏輯工作狀態(tài) = 讀二級緩沖區(qū)接收子區(qū)數(shù)據(jù);
end
default :
表2 應(yīng)答延遲時間統(tǒng)計
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
endcase
end
end
endmodule
3U的異步串口板實(shí)現(xiàn)了36通道的全雙工通用異步收發(fā)器,11種通訊協(xié)議,每種通訊協(xié)議對應(yīng)1種波特率、1種數(shù)據(jù)格式和若干通道。通訊周期200 ms,每通道通訊間隔5 ms;每路串口通訊最高速率不低于2 Mbps;每路串口通道12個字節(jié)的發(fā)送緩沖區(qū)和12個字節(jié)的接收緩沖區(qū);處理時間小于1 μs。上位機(jī)可分別配置各通道波特率、數(shù)據(jù)格式、通訊協(xié)議,并查詢工作狀態(tài),完全滿足某重要設(shè)備測試平臺的試驗(yàn)要求。
在聯(lián)機(jī)試驗(yàn)中,測試平臺先后使用了由TMS320C6416 DSP處理器和XC3S2000 FPGA狀態(tài)機(jī)作處理單元的異步串口板,分組測試了相同波特率的所有通道,及全部通道。試驗(yàn)重點(diǎn)考察數(shù)據(jù)之一是應(yīng)答延遲時間,即接收幀停止位和發(fā)送幀起始位之間的延遲,其由兩部分組成,分別是固有延遲和處理延遲。其中固有延遲由為濾波而設(shè)置的1 μs濾波延遲和為判斷接收幀結(jié)束而設(shè)置的半位延遲組成,半位延遲與波特率成反比。處理延遲由處理單元訪問總線端口、數(shù)據(jù)處理和實(shí)現(xiàn)通訊協(xié)議所耗時間組成,DSP處理器和FPGA狀態(tài)機(jī)作處理單元時,處理延遲有明顯差別,實(shí)測應(yīng)答延遲時間統(tǒng)計如表2所示。
從統(tǒng)計表得出如下結(jié)論:
1)無論采用何種處理單元,處理延遲與波特率和通訊數(shù)據(jù)量無關(guān)。因?yàn)樯衔粰C(jī)已將數(shù)據(jù)寫入各通道的數(shù)據(jù)發(fā)送子區(qū),依據(jù)接收幀命令參數(shù),DSP處理器和FPGA狀態(tài)機(jī)只需進(jìn)行簡單邏輯和算法運(yùn)算即可獲得發(fā)送數(shù)據(jù)幀,對于4―115.2 kbps之間的波特率和12字節(jié)的數(shù)據(jù)量,有充分時間裕量,不會出現(xiàn)處理瓶頸。
2)TMS320C6416 DSP處理器作處理單元時,處理延遲及其變化范圍較大,而且通道數(shù)越多,處理延遲及其變化范圍越大,反之則越小。因?yàn)镈SP處理器IO端口數(shù)量有限,當(dāng)串口通道數(shù)量較多時,部分重要信號只能通過輸入輸出端口成組傳送,所以DSP處理器不僅要通過片上總線訪問異步收發(fā)器和SDRAM,還要通過片上總線訪問相當(dāng)數(shù)量的輸入輸出端口,以便和上位機(jī)、FPGA交換信號。為了及時傳輸這些信號,DSP處理器還需要以一定的頻率巡檢這些信號。另外DSP處理器所有處理過程都是順序執(zhí)行的,處理時間與程序語句數(shù)量成正比關(guān)系。
3)XC3S2000 FPGA狀態(tài)機(jī)作處理單元時,處理延遲及其變化范圍很小,而且與通道數(shù)量無關(guān)。因?yàn)镕PGA集成片上系統(tǒng)后,其狀態(tài)機(jī)與其它片上邏輯之間的信號傳輸通過片內(nèi)布線完成,而布線資源幾乎不受限,不僅簡化了處理單元的處理任務(wù),而且保證了信號的實(shí)時傳輸,不必巡檢端口。另外FPGA狀態(tài)機(jī)不僅能夠通過狀態(tài)轉(zhuǎn)移完成時序功能,而且能夠通過并行處理完成算法功能,所以全部處理時間基本由訪問總線端口的程序語句數(shù)量決定,與算法和通道數(shù)量幾乎無關(guān)。
4)FPGA狀態(tài)機(jī)對外部總線或端口的訪問管理性能大幅超越了TMS320C6416 DSP處理器,片上邏輯之間的信號實(shí)時傳輸能力也大幅超越了后者。
基于FPGA狀態(tài)機(jī)和片上總線的多通道異步串口板,性能大幅超越了基于DSP處理器的串口板。這表明在算法相對簡單、功能單一的條件下,F(xiàn)PGA狀態(tài)機(jī)對外部總線存儲器或端口的訪問管理性能大幅超越了任何一款DSP處理器,另外FPGA狀態(tài)機(jī)的信號實(shí)時傳輸能力也大幅超越了DSP處理器。雖然開發(fā)周期相對較長,但一旦定型,性能突出,可靠性高。而高性能DSP處理器僅在內(nèi)存中運(yùn)行程序時速度快,但在管理外部總線存儲器或端口時,其優(yōu)勢無法發(fā)揮。
建議同行在研制“具有高時序性能的、多外設(shè)接口的、功能單一的設(shè)備”時,參考上述基于FPGA狀態(tài)機(jī)和片上總線的設(shè)計方案。
[1] Xilinx, Inc. Spartan-3 FPGA Family: Complete Datasheet[M].2004.
[2] Opencores.WISHBONE System-on-Chip (SoC) Interconnection Architecture for Portable IP Cores[M]. Revision: B.3, September 7, 2002.
[3] Jacob Gorban. UART IP Core[M]. Revision: 0.6 August 11, 2002.
[4] 孫進(jìn)平,王 俊,李 偉,等. DSP/FPGA嵌入式實(shí)時處理技術(shù)及應(yīng)用[M]. 北京:航空航天大學(xué)出版社,2011.
FPGA State-machine’s Realtime Advantage at Multiple UART Communication Processing
Zhang Jianjun, An Haijia,Tan Keshi,Wang Feng,Han Huaiyu
(China Academy of Space Technology, Beijing 100094,China)
Firstly, usual design methods of asynchronous serial interface board are introduced briefly, and defects of the methods are put forwarded, then the original design method and it’s technical superiorities based on FPGA state-machine and bus-on-chip are expounded emphatically, then the performances of asynchronous serial interface board based on above design method are clarified. By comparing test data about time of response delay, obvious difference on processing rate between asynchronous serial interface boards based on FPGA state-machine and DSP processor are presented, and by comparing above two design methods, cause for the difference on processing rate are paraphrased. In the end, the opinion that FPGA state-machine is superior over any DSP processor evidently in performance to manage memorizer and port on exterior bus, and a suggestion of design method for similar equipment or system are put forward.
FPGA;state-machine;asynchronous serial interface;realtime
2017-03-01;
2017-04-24。
張建軍(1973-),男,河南省人,碩士,高級工程師,主要從事企業(yè)管理方面的工作。
1671-4598(2017)08-0255-06
10.16526/j.cnki.11-4762/tp.2017.08.066
TN91
A