張建軍,安海佳,譚可仕,王 鋒,韓懷宇
(中國空間技術(shù)研究院,北京 100094)
FPGA狀態(tài)機(jī)在多路異步串口通信處理的實(shí)時(shí)優(yōu)勢(shì)
張建軍,安海佳,譚可仕,王 鋒,韓懷宇
(中國空間技術(shù)研究院,北京 100094)
首先簡要介紹了異步串口板的通常設(shè)計(jì)方法,并且提出了這些方法的不足之處,重點(diǎn)闡述了基于FPGA狀態(tài)機(jī)和片上總線的新設(shè)計(jì)方案,以及該方案的技術(shù)優(yōu)勢(shì),隨后公布了基于該方案的異步串口板達(dá)到的性能指標(biāo);通過比較有關(guān)應(yīng)答延遲的試驗(yàn)數(shù)據(jù),提出了基于FPGA狀態(tài)機(jī)和基于DSP處理器的異步串口板卡存在明顯的處理速度差異問題,并基于兩種設(shè)計(jì)方案,解釋了形成差異的原因;最后提出了FPGA狀態(tài)機(jī)對(duì)外部總線存儲(chǔ)器或端口的訪問管理性能大幅超越了任何一款DSP處理器的觀點(diǎn),并對(duì)同行提出了類似研發(fā)項(xiàng)目的設(shè)計(jì)建議。
FPGA;狀態(tài)機(jī);異步串口;實(shí)時(shí)
某設(shè)備的測(cè)試平臺(tái)必須達(dá)到36路通道、11種通訊協(xié)議、波特率4/19.2/38.4/57.6/115.2(Kbps)、小于協(xié)議分析和數(shù)據(jù)處理時(shí)間小于1 μs、通訊模式可配置等技術(shù)要求,因此測(cè)試平臺(tái)內(nèi)異步串口板的設(shè)計(jì)方案要面向上述技術(shù)要求而制定。目前異步串口板通常采用嵌入式處理器或者基于FPGA的,非總線式的,異步串口收發(fā)和處理邏輯。前者易于管理總線,分析協(xié)議和處理數(shù)據(jù),但處理速度過慢,后者處理速度快,但無法在線配置通訊模式,不能利用總線進(jìn)行全局管理,故需要一種新的多路異步串口板設(shè)計(jì)方案,即能夠?qū)崿F(xiàn)管理總線,分析協(xié)議和處理數(shù)據(jù),又具有強(qiáng)實(shí)時(shí)性能,以達(dá)到測(cè)試平臺(tái)的技術(shù)要求。
目前異步串口板一般采用以下兩類方法實(shí)現(xiàn)。
采用獨(dú)立的嵌入式處理器作為數(shù)據(jù)處理單元。異步串口單元要么使用嵌入式處理器自身的2到3個(gè)異步串口,要么使用連接到FPGA片內(nèi)總線的通用異步收發(fā)器或異步收發(fā)邏輯,從而建立起一主多從式總線結(jié)構(gòu)。
采用FPGA芯片集成了若干獨(dú)立的異步串口通路,每個(gè)通路均有一對(duì)處理邏輯和收發(fā)邏輯,其中收發(fā)邏輯實(shí)現(xiàn)了一路串行數(shù)據(jù)的接受、發(fā)送和并串轉(zhuǎn)換,處理邏輯實(shí)現(xiàn)了一路串行數(shù)據(jù)的讀取、處理和存儲(chǔ)。
上述兩類方法存在不足之處。傳統(tǒng)的異步串口板,都是采用單片機(jī)或嵌入式處理器作為處理單元,通過訪問通用異步收發(fā)器來讀取或者發(fā)送數(shù)據(jù),數(shù)據(jù)存儲(chǔ)器為一片雙口SDRAM,通過信號(hào)燈控制協(xié)議,總線上位機(jī)和板卡處理單元輪換來訪問數(shù)據(jù),板卡處理單元直接接受和應(yīng)答數(shù)據(jù)。通常情況下,串口應(yīng)答有響應(yīng)時(shí)間的要求,這使處理單元底層軟件的開發(fā)難度加大,任何操作都需要處理單元的軟件來控制。用嵌入式處理器讀取、處理和存儲(chǔ)數(shù)據(jù),速度慢,特別是無法滿足高速、多路、實(shí)時(shí)接收和應(yīng)答的要求。高速嵌入式處理器從串口數(shù)據(jù)幀接收完畢開始,到串行數(shù)據(jù)幀開始發(fā)送為止,即處理延遲至少10 μs級(jí)。如果高波特率、多串口通道、獨(dú)立通訊時(shí),就可能出現(xiàn)串口應(yīng)答滯后或數(shù)據(jù)幀不完整的問題。
使用FPGA芯片集成串口收發(fā)和處理邏輯的技術(shù)手段,解決了多通路、高通訊速率和高頻率下通訊可靠性問題,可以保證各串行通路發(fā)送數(shù)據(jù)幀的完整。但依然存在不足,一是收發(fā)邏輯對(duì)處理邏輯是一一對(duì)應(yīng)的,而不是基于片內(nèi)總線實(shí)現(xiàn)一主對(duì)多從的模式,造成FPGA資源的浪費(fèi),異步串口板可擴(kuò)展性差。二是在目前應(yīng)用中,串口收發(fā)邏輯僅實(shí)現(xiàn)了串并轉(zhuǎn)換,與通用異步串行收發(fā)器相比,功能不足,不具有通用性,如不支持總線的通訊模式設(shè)置、工作狀態(tài)查詢、通訊錯(cuò)誤類型查詢、處理器中斷報(bào)警和波特率設(shè)置等,使得兼容通用異步串行收發(fā)器的異步串口板驅(qū)動(dòng)程序不兼容FPGA芯片集成串并轉(zhuǎn)換電路的板卡。
為便于性能比較,分別用TMS320C6416 DSP處理器和FPGA狀態(tài)機(jī)作處理單元,進(jìn)行多路通用異步串口管理,協(xié)議分析和數(shù)據(jù)處理,最終實(shí)現(xiàn)兩塊功能相同的異步串口板(兩者系統(tǒng)結(jié)構(gòu)、程序流程、通訊協(xié)議和軟硬件接口均相同),以便性能比較。每塊均有1個(gè)FPGA芯片XC3S2000-4 FG456,1個(gè)PCI總線控制器PCI9052,1個(gè)雙口SDRAM IDT7132。只是前者采用通常的方法,在板卡上多了TMS320C6416 DSP處理器,而后者沒有DSP處理器,在FPGA芯片上多了WB總線處理邏輯。兩者在FPGA上均集成了WB片上總線,36個(gè)通用異步串行收發(fā)器軟核、1個(gè)雙口SDRAM接口邏輯、地址譯碼器、配置狀態(tài)寄存器區(qū),以及串口接收濾波邏輯等。下文重點(diǎn)介紹FPGA狀態(tài)機(jī)作處理單元的實(shí)現(xiàn)方法,性能指標(biāo),并對(duì)兩者的處理速度進(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個(gè)2K字節(jié)的RAM空間,1個(gè)IO空間,1個(gè)高電平有效的中斷源。
2.2.2 雙口SDRAM
采用IDT7132芯片作為數(shù)據(jù)緩沖區(qū),容量2 k*8 bit,讀寫周期均為20 ns。為了避免上位機(jī)正在更新某數(shù)據(jù)區(qū),而與該數(shù)據(jù)區(qū)對(duì)應(yīng)的異步串口要求發(fā)送該數(shù)據(jù)區(qū)的情況,在設(shè)計(jì)中將雙口SDRAM的存儲(chǔ)空間分為兩部分,即上位機(jī)可寫訪問的一級(jí)緩沖區(qū)和WB總線處理邏輯可寫訪問的二級(jí)緩沖區(qū)。對(duì)應(yīng)36通路,一級(jí)和二級(jí)緩沖區(qū)均分成了72個(gè)子區(qū),每路異步串口對(duì)應(yīng)著一級(jí)緩沖區(qū)內(nèi)的一對(duì)發(fā)送子區(qū)和接收子區(qū),以及二級(jí)緩沖區(qū)內(nèi)的一對(duì)發(fā)送子區(qū)和接收子區(qū)。上位機(jī)可讀寫一級(jí)發(fā)送子區(qū),但只能讀一級(jí)接收子區(qū);WB總線處理邏輯只能讀一級(jí)發(fā)送子區(qū),可讀寫一級(jí)接收子區(qū)和二級(jí)所有子區(qū)。
2.2.3 FPGA芯片
FPGA芯片為串口板核心器件,選用XC3S2000-4 FG456芯片,支持200 MHz時(shí)鐘,IO口上升和下降速度均達(dá)到5 ns。
1)WB片內(nèi)總線:即WB片內(nèi)總線,是一種應(yīng)用普遍的、具有靈活性的IP核互聯(lián)接口。
2)異步收發(fā)器:異步收發(fā)器為IP軟核,來源于opencores開源組織,支持WB接口,與通用異步收發(fā)器兼容,每個(gè)可實(shí)現(xiàn)一路全雙工異步串口通訊。
3)雙口SDRAM總線接口邏輯:片內(nèi)有兩個(gè)獨(dú)立的雙口SDRAM總線接口邏輯,分別實(shí)現(xiàn)了雙口SDRAM與WB總線和LOCAL總線的邏輯連接。
4)LOCAL總線寄存器區(qū):為了方便上位機(jī)對(duì)各異步串口獨(dú)立靈活配置、全面監(jiān)控工作狀態(tài),必須設(shè)置可供上位機(jī)訪問的若干配置寄存器和狀態(tài)寄存器, 而且LOCAL總線寄存器區(qū)邏輯是上位機(jī)與片內(nèi)WB總線處理邏輯之間的通訊橋梁。
5)地址譯碼邏輯:片內(nèi)有兩個(gè)獨(dú)立的地址譯碼邏輯,分別根據(jù)LOCAL總線地址和WB總線地址,片選總線從邏輯。
6)串口接收濾波邏輯:片內(nèi)36個(gè)獨(dú)立的串口接收濾波邏輯,每個(gè)對(duì)應(yīng)一路異步收發(fā)器的接收端,可濾除正負(fù)跳變寬度小于1 μs的毛刺,但會(huì)造成1 μs的信號(hào)延遲。
7)WB總線處理邏輯:實(shí)質(zhì)是WB總線狀態(tài)機(jī),實(shí)現(xiàn)了訪問WB總線、數(shù)據(jù)處理、數(shù)據(jù)存儲(chǔ)和各串口通訊協(xié)議的功能。主要任務(wù)是根據(jù)上位機(jī)設(shè)置的LOCAL總線配置寄存器區(qū),設(shè)置各異步收發(fā)器的工作模式,接收串口數(shù)據(jù),遵循通訊協(xié)議,發(fā)送串口數(shù)據(jù),完成一級(jí)、二級(jí)緩沖區(qū)數(shù)據(jù)更新或復(fù)制,并將各串口通道的工作狀態(tài)標(biāo)識(shí)到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,每個(gè)字包括1個(gè)起始位,8個(gè)數(shù)據(jù)位,1個(gè)效驗(yàn)位和1個(gè)停止位。通信幀包括命令段、數(shù)據(jù)段和效驗(yàn)段,結(jié)構(gòu)如下表:
通信幀命令段數(shù)據(jù)段效驗(yàn)段接收幀(從串口到上位機(jī))1個(gè)字8個(gè)字1個(gè)字發(fā)送幀(從上位機(jī)到串口)1個(gè)字10個(gè)字1個(gè)字
WB總線處理邏輯狀態(tài)機(jī)的處理流程簡述如下。如果上位機(jī)請(qǐng)求更新一級(jí)緩沖區(qū)的某子區(qū),上位機(jī)查詢“FPGA訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志”,若為真,則等待;否則置位“上位機(jī)訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志”,設(shè)置“更新發(fā)送區(qū)ID寄存器”和“發(fā)送幀長度寄存器”,更新一級(jí)緩沖區(qū)的發(fā)送子區(qū),完畢后復(fù)位“上位機(jī)訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志”,產(chǎn)生“更新二級(jí)緩沖區(qū)的中斷請(qǐng)求”。WB總線處理邏輯響應(yīng)該中斷,查詢“上位機(jī)訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志”,若為真,則等待;否則置位“FPGA訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志”,依據(jù)“更新發(fā)送區(qū)ID寄存器”內(nèi)容,讀訪問一級(jí)緩沖區(qū)的相應(yīng)發(fā)送子區(qū),并存入二級(jí)緩沖區(qū)的相應(yīng)發(fā)送子區(qū),完畢后復(fù)位“FPGA訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志”。在WB總線處理邏輯更新二級(jí)緩沖區(qū)期間,暫不響應(yīng)異步串口交易中斷。每次FPGA讀寫訪問IDT7132,需20 ns。在處理任務(wù)最重條件下,即WB總線處理邏輯在更新二級(jí)緩存時(shí),串口恰好要求傳送12個(gè)字節(jié)上限的數(shù)據(jù),發(fā)送只延遲20*12*2=480 ns,仍滿足小于1 μs的試驗(yàn)要求。
如果某異步收發(fā)器存在接收或發(fā)送任務(wù),即串口通信中斷請(qǐng)求存在,WB總線處理邏輯讀訪問該異步收發(fā)器的中斷狀態(tài)寄存器,如果是發(fā)送中斷請(qǐng)求,WB總線處理邏輯從二級(jí)緩沖區(qū)某發(fā)送子區(qū)讀取發(fā)送數(shù)據(jù),寫入該異步收發(fā)器的“發(fā)送數(shù)據(jù)寄存器”中,每發(fā)送一個(gè)字節(jié),異步收發(fā)器均會(huì)再請(qǐng)求中斷,WB總線處理邏輯循環(huán)響應(yīng),直至發(fā)送的字節(jié)數(shù)等于對(duì)應(yīng)的“發(fā)送幀長度寄存器”預(yù)設(shè)值,發(fā)送完畢,清相應(yīng)中斷;如果是接收中斷請(qǐng)求,讀訪問接收數(shù)據(jù)寄存器,并將數(shù)據(jù)存入二級(jí)緩沖區(qū)對(duì)應(yīng)接收子區(qū)。每接收一個(gè)字節(jié)后,在“接收幀超時(shí)結(jié)束門限寄存器”設(shè)置的時(shí)間內(nèi)未出現(xiàn)新的接收數(shù)據(jù)中斷,則認(rèn)為已收到完整數(shù)據(jù)幀。隨后根據(jù)接收數(shù)據(jù)幀的內(nèi)容,判斷是否存在錯(cuò)誤,以及何種錯(cuò)誤,并標(biāo)識(shí)在對(duì)應(yīng)的“接收幀診斷結(jié)果寄存器”和“接收幀長度寄存器”,并設(shè)置“二級(jí)緩沖區(qū)接收子區(qū)覆蓋一級(jí)緩沖區(qū)接收子區(qū)”的中斷請(qǐng)求。如果上位機(jī)未訪問一級(jí)緩沖區(qū),則WB總線處理邏輯響應(yīng)上述中斷,執(zhí)行二級(jí)至一級(jí)的某接收子區(qū)“數(shù)據(jù)復(fù)制”后,清相應(yīng)中斷,置位LOCAL總線接收中斷請(qǐng)求,請(qǐng)求上位機(jī)從一級(jí)緩沖區(qū)讀取數(shù)據(jù);如果上位機(jī)正在訪問一級(jí)緩沖區(qū),則等待時(shí)機(jī)再復(fù)制數(shù)據(jù)。
WB總線處理邏輯狀態(tài)機(jī)的實(shí)現(xiàn)方法如下。
module wb_master
(
輸入輸出端口聲明
);
always@(posedge WB總線復(fù)位 or posedge WB總線時(shí)鐘)
begin
if (WB總線復(fù)位)
復(fù)位"二級(jí)緩沖區(qū)接收子區(qū)覆蓋一級(jí)緩沖區(qū)接收子區(qū)"中斷請(qǐng)求;
else if(接收幀超時(shí)結(jié)束門限寄存器設(shè)置的時(shí)間內(nèi)未出現(xiàn)新的接收數(shù)據(jù)中斷請(qǐng)求)
認(rèn)為已收到一個(gè)數(shù)據(jù)幀,設(shè)置"二級(jí)緩沖區(qū)接收子區(qū)覆蓋一級(jí)緩沖區(qū)接收子區(qū)"中斷請(qǐng)求;
else if(二級(jí)緩沖區(qū)覆蓋一級(jí)相應(yīng)子區(qū)完畢)
復(fù)位"二級(jí)緩沖區(qū)接收子區(qū)覆蓋一級(jí)緩沖區(qū)接收子區(qū)"中斷請(qǐng)求;
end
always@(posedge WB總線復(fù)位 or posedge WB總線時(shí)鐘)
begin
if (WB總線復(fù)位)
接收幀診斷結(jié)果寄存器和接收幀長度寄存器復(fù)位;
else if(接收幀超時(shí)結(jié)束門限寄存器設(shè)置的時(shí)間內(nèi)未出現(xiàn)新的接收數(shù)據(jù)中斷請(qǐng)求)
begin
隨后根據(jù)接收數(shù)據(jù)幀的內(nèi)容,判斷是否存在錯(cuò)誤,以及何種錯(cuò)誤,并標(biāo)識(shí)在對(duì)應(yīng)的
"接收幀診斷結(jié)果寄存器"和"接收幀長度寄存器";
end
end
always@(posedge WB總線復(fù)位 or posedge WB總線時(shí)鐘) //WB總線處理邏輯狀態(tài)機(jī)
begin
if (WB總線復(fù)位)
寄存器初始化;
else
begin
case(WB總線處理邏輯工作狀態(tài))
清UART中斷寄存器 :
啟動(dòng)WB讀時(shí)序,讀UART中斷寄存器;
等待狀態(tài) :
begin
if(UART通信中斷請(qǐng)求)
WB總線處理邏輯工作狀態(tài) = 讀中斷狀態(tài)寄存器;
else if(延遲發(fā)送定時(shí)器溢出)
begin
復(fù)位延遲發(fā)送定時(shí)器、延遲發(fā)送定時(shí)器溢出信號(hào);
if(發(fā)送幀長度為0)
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
else
begin
if(如果接收幀完整正確)
WB總線處理邏輯工作狀態(tài) = 讀二級(jí)緩沖區(qū)發(fā)送子區(qū);
else
WB總線處理邏輯工作狀態(tài) = 發(fā)送錯(cuò)誤提示碼;
end
end
else if(更新二級(jí)緩沖區(qū)中斷請(qǐng)求 & ~上位機(jī)訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志 & 相應(yīng)串口不正在發(fā)送數(shù)據(jù))
begin
WB總線處理邏輯工作狀態(tài) = 讀一級(jí)緩沖區(qū)的延遲發(fā)送時(shí)間寄存器;
置位FPGA訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志;
end
else if(二級(jí)緩沖區(qū)接收子區(qū)覆蓋一級(jí)緩沖區(qū)接收子區(qū)中斷請(qǐng)求 & ~上位機(jī)訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志 & 相應(yīng)串口不正在接收數(shù)據(jù))
begin
WB總線處理邏輯工作狀態(tài) = 讀二級(jí)緩沖區(qū)接收子區(qū)數(shù)據(jù);
置位FPGA訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志;
end
else
begin
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
復(fù)位FPGA訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志;
end
end
讀一級(jí)緩沖區(qū)的延遲發(fā)送時(shí)間寄存器 :
begin
啟動(dòng)WB總線讀時(shí)序,讀一級(jí)緩沖區(qū)的延遲發(fā)送時(shí)間寄存器;
WB總線處理邏輯工作狀態(tài) = 寫二級(jí)緩沖區(qū)的延遲發(fā)送時(shí)間寄存器;
end
寫二級(jí)緩沖區(qū)的延遲發(fā)送時(shí)間寄存器 :
begin
啟動(dòng)WB總線寫時(shí)序,寫二級(jí)緩沖區(qū)的延遲發(fā)送時(shí)間寄存器;
WB總線處理邏輯工作狀態(tài) = 讀一級(jí)緩沖區(qū)的更新發(fā)送區(qū)ID寄存器;
end
讀一級(jí)緩沖區(qū)的更新發(fā)送區(qū)ID寄存器 :
begin
啟動(dòng)WB總線讀時(shí)序,讀一級(jí)緩沖區(qū)的更新發(fā)送區(qū)ID寄存器;
根據(jù)一級(jí)緩沖區(qū)的更新發(fā)送區(qū)ID寄存器,確定更新長度寄存器;
WB總線處理邏輯工作狀態(tài) = 寫二級(jí)緩沖區(qū)的更新發(fā)送區(qū)ID寄存器;
End
module wb_master
(
輸入輸出端口聲明
);
always@(posedge WB總線復(fù)位 or posedge WB總線時(shí)鐘)
begin
if (WB總線復(fù)位)
復(fù)位"二級(jí)緩沖區(qū)接收子區(qū)覆蓋一級(jí)緩沖區(qū)接收子區(qū)"中斷請(qǐng)求;
else if(接收幀超時(shí)結(jié)束門限寄存器設(shè)置的時(shí)間內(nèi)未出現(xiàn)新的接收數(shù)據(jù)中斷請(qǐng)求)
認(rèn)為已收到一個(gè)數(shù)據(jù)幀,設(shè)置"二級(jí)緩沖區(qū)接收子區(qū)覆蓋一級(jí)緩沖區(qū)接收子區(qū)"中斷請(qǐng)求;
else if(二級(jí)緩沖區(qū)覆蓋一級(jí)相應(yīng)子區(qū)完畢)
復(fù)位"二級(jí)緩沖區(qū)接收子區(qū)覆蓋一級(jí)緩沖區(qū)接收子區(qū)"中斷請(qǐng)求;
end
always@(posedge WB總線復(fù)位 or posedge WB總線時(shí)鐘)
begin
if (WB總線復(fù)位)
接收幀診斷結(jié)果寄存器和接收幀長度寄存器復(fù)位;
else if(接收幀超時(shí)結(jié)束門限寄存器設(shè)置的時(shí)間內(nèi)未出現(xiàn)新的接收數(shù)據(jù)中斷請(qǐng)求)
begin
隨后根據(jù)接收數(shù)據(jù)幀的內(nèi)容,判斷是否存在錯(cuò)誤,以及何種錯(cuò)誤,并標(biāo)識(shí)在對(duì)應(yīng)的
"接收幀診斷結(jié)果寄存器"和"接收幀長度寄存器";
end
end
always@(posedge WB總線復(fù)位 or posedge WB總線時(shí)鐘) //WB總線處理邏輯狀態(tài)機(jī)
begin
if (WB總線復(fù)位)
寄存器初始化;
else
begin
case(WB總線處理邏輯工作狀態(tài))
清UART中斷寄存器 :
啟動(dòng)WB讀時(shí)序,讀UART中斷寄存器;
等待狀態(tài) :
begin
if(UART通信中斷請(qǐng)求)
WB總線處理邏輯工作狀態(tài) = 讀中斷狀態(tài)寄存器;
else if(延遲發(fā)送定時(shí)器溢出)
begin
復(fù)位延遲發(fā)送定時(shí)器、延遲發(fā)送定時(shí)器溢出信號(hào);
if(發(fā)送幀長度為0)
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
else
begin
if(如果接收幀完整正確)
WB總線處理邏輯工作狀態(tài) = 讀二級(jí)緩沖區(qū)發(fā)送子區(qū);
else
WB總線處理邏輯工作狀態(tài) = 發(fā)送錯(cuò)誤提示碼;
end
end
else if(更新二級(jí)緩沖區(qū)中斷請(qǐng)求 & ~上位機(jī)訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志 & 相應(yīng)串口不正在發(fā)送數(shù)據(jù))
begin
WB總線處理邏輯工作狀態(tài) = 讀一級(jí)緩沖區(qū)的延遲發(fā)送時(shí)間寄存器;
置位FPGA訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志;
end
else if(二級(jí)緩沖區(qū)接收子區(qū)覆蓋一級(jí)緩沖區(qū)接收子區(qū)中斷請(qǐng)求 & ~上位機(jī)訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志 & 相應(yīng)串口不正在接收數(shù)據(jù))
begin
WB總線處理邏輯工作狀態(tài) = 讀二級(jí)緩沖區(qū)接收子區(qū)數(shù)據(jù);
置位FPGA訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志;
end
else
begin
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
復(fù)位FPGA訪問雙口SDRAM一級(jí)緩沖區(qū)標(biāo)志;
end
end
讀一級(jí)緩沖區(qū)的延遲發(fā)送時(shí)間寄存器 :
begin
啟動(dòng)WB總線讀時(shí)序,讀一級(jí)緩沖區(qū)的延遲發(fā)送時(shí)間寄存器;
WB總線處理邏輯工作狀態(tài) = 寫二級(jí)緩沖區(qū)的延遲發(fā)送時(shí)間寄存器;
end
寫二級(jí)緩沖區(qū)的延遲發(fā)送時(shí)間寄存器 :
begin
啟動(dòng)WB總線寫時(shí)序,寫二級(jí)緩沖區(qū)的延遲發(fā)送時(shí)間寄存器;
WB總線處理邏輯工作狀態(tài) = 讀一級(jí)緩沖區(qū)的更新發(fā)送區(qū)ID寄存器;
end
讀一級(jí)緩沖區(qū)的更新發(fā)送區(qū)ID寄存器 :
begin
啟動(dòng)WB總線讀時(shí)序,讀一級(jí)緩沖區(qū)的更新發(fā)送區(qū)ID寄存器;
根據(jù)一級(jí)緩沖區(qū)的更新發(fā)送區(qū)ID寄存器,確定更新長度寄存器;
WB總線處理邏輯工作狀態(tài) = 寫二級(jí)緩沖區(qū)的更新發(fā)送區(qū)ID寄存器;
end
else if(接收字節(jié)計(jì)數(shù)器 < 接收幀長度寄存器)
WB總線處理邏輯工作狀態(tài) = 寫二級(jí)緩沖區(qū)接收子區(qū);
else
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
if(接收字節(jié)計(jì)數(shù)器 < 接收幀長度寄存器 - 1)
效驗(yàn)碼累加寄存器 = 效驗(yàn)碼累加寄存器 + 接收數(shù)據(jù)寄存器;
else if(接收字節(jié)計(jì)數(shù)器 == 接收幀長度寄存器 - 1)
begin
效驗(yàn)碼累加寄存器 = 效驗(yàn)碼累加寄存器 ^ 接收數(shù)據(jù)寄存器;
if(效驗(yàn)碼累加寄存器 == 0)
復(fù)位效驗(yàn)碼錯(cuò)誤標(biāo)識(shí);
else
置位效驗(yàn)碼錯(cuò)誤標(biāo)識(shí);
end
end
寫二級(jí)緩沖區(qū)接收子區(qū) :
begin
啟動(dòng)WB總線寫時(shí)序,將接收數(shù)據(jù)寫入二級(jí)緩沖區(qū)接收子區(qū);
if(接收字節(jié)計(jì)數(shù)器 < 接收幀長度寄存器)
接收字節(jié)計(jì)數(shù)器 = 接收字節(jié)計(jì)數(shù)器 + 1;
if(接收字節(jié)計(jì)數(shù)器 < 接收幀長度寄存器)
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
else if(接收字節(jié)計(jì)數(shù)器 == 接收幀長度寄存器)
WB總線處理邏輯工作狀態(tài) = 讀二級(jí)緩沖區(qū)的發(fā)送延遲時(shí)間寄存器;
end
讀二級(jí)緩沖區(qū)的發(fā)送延遲時(shí)間寄存器 : //讀二級(jí)緩沖區(qū)的延遲發(fā)送時(shí)間寄存器,打開延遲發(fā)送計(jì)時(shí)器
begin
啟動(dòng)WB總線讀時(shí)序,讀二級(jí)緩沖區(qū)的延遲發(fā)送時(shí)間寄存器;
設(shè)置延遲發(fā)送時(shí)間寄存器;
啟動(dòng)延遲發(fā)送定時(shí)器;
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
end
讀二級(jí)緩沖區(qū)發(fā)送子區(qū) :
begin
根據(jù)命令碼寄存器和發(fā)送字節(jié)計(jì)數(shù)器,確定發(fā)送數(shù)據(jù)在二級(jí)緩沖區(qū)發(fā)送子區(qū)的地址;
啟動(dòng)WB總線讀時(shí)序,讀二級(jí)緩沖區(qū)發(fā)送子區(qū)數(shù)據(jù);
WB總線處理邏輯工作狀態(tài) = 發(fā)送二級(jí)緩沖區(qū)發(fā)送子區(qū)數(shù)據(jù);
end
發(fā)送二級(jí)緩沖區(qū)發(fā)送子區(qū)數(shù)據(jù) :
begin
啟動(dòng)WB總線寫時(shí)序,將二級(jí)緩沖區(qū)發(fā)送子區(qū)數(shù)據(jù)寫入發(fā)送數(shù)據(jù)寄存器;
發(fā)送字節(jié)計(jì)數(shù)器 = 發(fā)送字節(jié)計(jì)數(shù)器 + 1;
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
end
發(fā)送錯(cuò)誤提示碼 : //當(dāng)接收幀錯(cuò)誤時(shí),發(fā)送錯(cuò)誤提示碼
begin
啟動(dòng)WB總線寫時(shí)序,將錯(cuò)誤提示碼寫入發(fā)送數(shù)據(jù)寄存器;
發(fā)送字節(jié)計(jì)數(shù)器 = 發(fā)送字節(jié)計(jì)數(shù)器 + 1;
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
end
讀二級(jí)緩沖區(qū)接收子區(qū)數(shù)據(jù) :
begin
根據(jù)UART地址和更新字節(jié)計(jì)數(shù)器,確定新數(shù)據(jù)在二級(jí)緩沖區(qū)接收子區(qū)的地址;
啟動(dòng)WB總線讀時(shí)序,讀二級(jí)緩沖區(qū)接收子區(qū)新數(shù)據(jù);
WB總線處理邏輯工作狀態(tài) = 寫一級(jí)緩沖區(qū)接收子區(qū)數(shù)據(jù);
end
寫一級(jí)緩沖區(qū)接收子區(qū)數(shù)據(jù) :
begin
根據(jù)UART地址和更新字節(jié)計(jì)數(shù)器,確定一級(jí)緩沖區(qū)接收子區(qū)的地址;
啟動(dòng)WB總線寫時(shí)序,將新數(shù)據(jù)寫入一級(jí)緩沖區(qū)接收子區(qū);
更新字節(jié)計(jì)數(shù)器 = 更新字節(jié)計(jì)數(shù)器 + 1;
if(更新字節(jié)計(jì)數(shù)器 == 接收幀長度寄存器)
begin
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
更新字節(jié)計(jì)數(shù)器 = 8'h0;
end
else if(更新字節(jié)計(jì)數(shù)器 < 接收幀長度寄存器)
WB總線處理邏輯工作狀態(tài) = 讀二級(jí)緩沖區(qū)接收子區(qū)數(shù)據(jù);
end
default :
表2 應(yīng)答延遲時(shí)間統(tǒng)計(jì)
WB總線處理邏輯工作狀態(tài) = 等待狀態(tài);
endcase
end
end
endmodule
3U的異步串口板實(shí)現(xiàn)了36通道的全雙工通用異步收發(fā)器,11種通訊協(xié)議,每種通訊協(xié)議對(duì)應(yīng)1種波特率、1種數(shù)據(jù)格式和若干通道。通訊周期200 ms,每通道通訊間隔5 ms;每路串口通訊最高速率不低于2 Mbps;每路串口通道12個(gè)字節(jié)的發(fā)送緩沖區(qū)和12個(gè)字節(jié)的接收緩沖區(qū);處理時(shí)間小于1 μs。上位機(jī)可分別配置各通道波特率、數(shù)據(jù)格式、通訊協(xié)議,并查詢工作狀態(tài),完全滿足某重要設(shè)備測(cè)試平臺(tái)的試驗(yàn)要求。
在聯(lián)機(jī)試驗(yàn)中,測(cè)試平臺(tái)先后使用了由TMS320C6416 DSP處理器和XC3S2000 FPGA狀態(tài)機(jī)作處理單元的異步串口板,分組測(cè)試了相同波特率的所有通道,及全部通道。試驗(yàn)重點(diǎn)考察數(shù)據(jù)之一是應(yīng)答延遲時(shí)間,即接收幀停止位和發(fā)送幀起始位之間的延遲,其由兩部分組成,分別是固有延遲和處理延遲。其中固有延遲由為濾波而設(shè)置的1 μs濾波延遲和為判斷接收幀結(jié)束而設(shè)置的半位延遲組成,半位延遲與波特率成反比。處理延遲由處理單元訪問總線端口、數(shù)據(jù)處理和實(shí)現(xiàn)通訊協(xié)議所耗時(shí)間組成,DSP處理器和FPGA狀態(tài)機(jī)作處理單元時(shí),處理延遲有明顯差別,實(shí)測(cè)應(yīng)答延遲時(shí)間統(tǒng)計(jì)如表2所示。
從統(tǒng)計(jì)表得出如下結(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ù)幀,對(duì)于4―115.2 kbps之間的波特率和12字節(jié)的數(shù)據(jù)量,有充分時(shí)間裕量,不會(huì)出現(xiàn)處理瓶頸。
2)TMS320C6416 DSP處理器作處理單元時(shí),處理延遲及其變化范圍較大,而且通道數(shù)越多,處理延遲及其變化范圍越大,反之則越小。因?yàn)镈SP處理器IO端口數(shù)量有限,當(dāng)串口通道數(shù)量較多時(shí),部分重要信號(hào)只能通過輸入輸出端口成組傳送,所以DSP處理器不僅要通過片上總線訪問異步收發(fā)器和SDRAM,還要通過片上總線訪問相當(dāng)數(shù)量的輸入輸出端口,以便和上位機(jī)、FPGA交換信號(hào)。為了及時(shí)傳輸這些信號(hào),DSP處理器還需要以一定的頻率巡檢這些信號(hào)。另外DSP處理器所有處理過程都是順序執(zhí)行的,處理時(shí)間與程序語句數(shù)量成正比關(guān)系。
3)XC3S2000 FPGA狀態(tài)機(jī)作處理單元時(shí),處理延遲及其變化范圍很小,而且與通道數(shù)量無關(guān)。因?yàn)镕PGA集成片上系統(tǒng)后,其狀態(tài)機(jī)與其它片上邏輯之間的信號(hào)傳輸通過片內(nèi)布線完成,而布線資源幾乎不受限,不僅簡化了處理單元的處理任務(wù),而且保證了信號(hào)的實(shí)時(shí)傳輸,不必巡檢端口。另外FPGA狀態(tài)機(jī)不僅能夠通過狀態(tài)轉(zhuǎn)移完成時(shí)序功能,而且能夠通過并行處理完成算法功能,所以全部處理時(shí)間基本由訪問總線端口的程序語句數(shù)量決定,與算法和通道數(shù)量幾乎無關(guān)。
4)FPGA狀態(tài)機(jī)對(duì)外部總線或端口的訪問管理性能大幅超越了TMS320C6416 DSP處理器,片上邏輯之間的信號(hào)實(shí)時(shí)傳輸能力也大幅超越了后者。
基于FPGA狀態(tài)機(jī)和片上總線的多通道異步串口板,性能大幅超越了基于DSP處理器的串口板。這表明在算法相對(duì)簡單、功能單一的條件下,F(xiàn)PGA狀態(tài)機(jī)對(duì)外部總線存儲(chǔ)器或端口的訪問管理性能大幅超越了任何一款DSP處理器,另外FPGA狀態(tài)機(jī)的信號(hào)實(shí)時(shí)傳輸能力也大幅超越了DSP處理器。雖然開發(fā)周期相對(duì)較長,但一旦定型,性能突出,可靠性高。而高性能DSP處理器僅在內(nèi)存中運(yùn)行程序時(shí)速度快,但在管理外部總線存儲(chǔ)器或端口時(shí),其優(yōu)勢(shì)無法發(fā)揮。
建議同行在研制“具有高時(shí)序性能的、多外設(shè)接口的、功能單一的設(shè)備”時(shí),參考上述基于FPGA狀態(tài)機(jī)和片上總線的設(shè)計(jì)方案。
[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í)處理技術(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-),男,河南省人,碩士,高級(jí)工程師,主要從事企業(yè)管理方面的工作。
1671-4598(2017)08-0255-06
10.16526/j.cnki.11-4762/tp.2017.08.066
TN91
A