楊珍,蔣鑫
(四川九洲空管科技有限責(zé)任公司,四川綿陽(yáng),621000)
二次雷達(dá)機(jī)系統(tǒng)是對(duì)空中目標(biāo)鑒別與監(jiān)視的系統(tǒng),在空中的目標(biāo)識(shí)別與跟蹤和空中交通管制等很多方面有極大的作用。點(diǎn)跡板在進(jìn)行點(diǎn)跡和航跡關(guān)聯(lián)之前,首先應(yīng)仔細(xì)研究點(diǎn)跡報(bào)告中的信息,而這些信息則由FPGA 上傳的,F(xiàn)PGA的數(shù)據(jù)源則是由上流譯碼模塊產(chǎn)生的。FPGA 作為數(shù)據(jù)傳輸?shù)囊画h(huán),在以往的設(shè)備中是沒(méi)有經(jīng)過(guò)容錯(cuò)處理就將數(shù)據(jù)下發(fā)至點(diǎn)跡處理模塊,一旦數(shù)據(jù)出問(wèn)題首先會(huì)影響下級(jí)模塊數(shù)據(jù)處理,再者排查錯(cuò)誤時(shí)無(wú)法定位是因上層模塊錯(cuò)誤還是因FPGA 數(shù)據(jù)透?jìng)鞫鸬腻e(cuò)誤,給后續(xù)應(yīng)用帶來(lái)巨大的不變。
本文中的方法可以很好的避免傳輸錯(cuò)誤的數(shù)據(jù),可正確完成數(shù)據(jù)的存儲(chǔ)、判斷、分發(fā),可保障從FPGA 分發(fā)至點(diǎn)跡板模塊的數(shù)據(jù)是符合數(shù)據(jù)要求的,避免了錯(cuò)誤數(shù)據(jù)下發(fā)而導(dǎo)致的點(diǎn)跡模塊處理不正常的情況。本方法是基于數(shù)據(jù)包結(jié)構(gòu)并通過(guò)FIFO 和RAM 結(jié)合的方式對(duì)數(shù)據(jù)包進(jìn)行判斷處理的,從而保障數(shù)據(jù)流輸出的正確性,保障點(diǎn)跡數(shù)據(jù)的連續(xù)性,并當(dāng)點(diǎn)跡數(shù)據(jù)出現(xiàn)異常時(shí)能夠明確排查思路,確定排查方向。
FPGA 對(duì)數(shù)據(jù)流的處理是有多種方法的,其中之一是通過(guò)異步FIFO 來(lái)作為不同時(shí)鐘域數(shù)據(jù)傳輸?shù)木彌_區(qū),該方法下進(jìn)行寫數(shù)據(jù)和讀數(shù)據(jù),有寫指針與讀指針,另外有FIFO控制器來(lái)通過(guò)外部的讀寫信號(hào)控制指針操作,有不同的寫時(shí)鐘和讀時(shí)鐘,這樣的操作只能完成異步數(shù)據(jù)的處理,并不能判斷所接受的數(shù)據(jù)是否正確,是完全透?jìng)髯g碼板下發(fā)的數(shù)據(jù),不對(duì)數(shù)據(jù)包進(jìn)行任何判斷,帶來(lái)的影響有兩點(diǎn):(1)譯碼板與信號(hào)處理板數(shù)據(jù)傳輸時(shí),可能會(huì)因硬件或者機(jī)箱周邊環(huán)境原因而收到干擾,導(dǎo)致信號(hào)處理接收數(shù)據(jù)錯(cuò)誤。(2)譯碼板自身傳輸?shù)臄?shù)據(jù)源是錯(cuò)誤的,而信號(hào)處理板透?jìng)髦?,一旦點(diǎn)跡板檢測(cè)到數(shù)據(jù)錯(cuò)誤,系統(tǒng)不能直接定位,需要信號(hào)處理板和譯碼板同時(shí)配合,會(huì)消耗較多的人力資源和時(shí)間成本。本文中重點(diǎn)介紹第二種方法:當(dāng)FPGA 和其他設(shè)備進(jìn)行通信時(shí),如果傳輸?shù)氖谴罅繑?shù)據(jù),則需要打包(組幀)進(jìn)行傳輸,而且需要有幀頭和校驗(yàn)位來(lái)確保幀數(shù)據(jù)傳輸正確。當(dāng)FPGA 作為接收端去接收幀數(shù)據(jù)時(shí),即使保證一幀數(shù)據(jù)的幀頭和校驗(yàn)位均是正確的也不能保證該幀數(shù)據(jù)是正確的,在本文中運(yùn)用的包結(jié)構(gòu)是包頭+包長(zhǎng)+包數(shù)據(jù)+包校驗(yàn)+包尾的組合,經(jīng)過(guò)該種嚴(yán)謹(jǐn)?shù)陌Y(jié)構(gòu),可以避免特殊包數(shù)據(jù)和包頭或者包尾一致時(shí)引發(fā)的判斷錯(cuò)誤,降低了因上下級(jí)模塊之間采樣引起的幀數(shù)據(jù)錯(cuò)誤的概率,后端點(diǎn)跡模塊采樣也必須經(jīng)過(guò)包結(jié)構(gòu)判斷后才能使用幀數(shù)據(jù)。
本文涉及的上級(jí)模塊的數(shù)據(jù)是通過(guò)請(qǐng)求、應(yīng)答等握手信號(hào)的配合來(lái)進(jìn)行數(shù)據(jù)傳輸?shù)?,?dāng)FPGA 檢測(cè)到上級(jí)模塊的請(qǐng)求之后,根據(jù)自己的處理、存儲(chǔ)情況來(lái)判斷是否要發(fā)送應(yīng)答信號(hào)。當(dāng)應(yīng)答信號(hào)發(fā)送后,則需要做好數(shù)據(jù)接收的準(zhǔn)備。因上級(jí)模塊傳輸?shù)臄?shù)據(jù)于高頻率、特長(zhǎng)數(shù)據(jù)包結(jié)構(gòu)的數(shù)據(jù)類型,考慮到后續(xù)的流水線工作,需要將數(shù)據(jù)寫入FIFO 中。
當(dāng)判斷FIFO1 中非空時(shí),則應(yīng)產(chǎn)生讀信號(hào),讀取數(shù)據(jù),此時(shí)讀出來(lái)的數(shù)據(jù)已經(jīng)轉(zhuǎn)換到了該FPGA 的時(shí)鐘域下,以下操作均在同一時(shí)鐘域下操作。從FIFO1 中讀取的數(shù)據(jù)直接寫入RAM 中,同時(shí)判斷從該FIFO1 中讀出的數(shù)據(jù)是否是協(xié)議數(shù)據(jù),若數(shù)據(jù)包符合要求,則同步讀取RAM 數(shù)據(jù),寫入FIFO2 中,點(diǎn)跡模塊可以根據(jù)FIFO2 的非空信號(hào)來(lái)讀取FIFO2 中的數(shù)據(jù)。
本文中涉及的FPGA資源比較少,大部分器件均可滿足需求。
圖1 可以清楚的看到,整個(gè)接收、存儲(chǔ)、讀數(shù)據(jù)、寫數(shù)據(jù)等處理流程。
在對(duì)外部輸入的請(qǐng)求信號(hào)處理之前需進(jìn)行打拍處理,應(yīng)該選取穩(wěn)定狀態(tài)下的值,避免亞穩(wěn)態(tài)情況下毛刺信號(hào)影響整體的時(shí)序功能。
文中上級(jí)模塊數(shù)據(jù)是根據(jù)FPGA 產(chǎn)生的應(yīng)答有效而產(chǎn)生數(shù)據(jù),即對(duì)于FPGA 來(lái)講,接收到的數(shù)據(jù)和FPGA 產(chǎn)生的應(yīng)答信號(hào)是同步的,所以我們采用的是同步FIFO1,需要設(shè)置FIFO1 的非空標(biāo)志、寫數(shù)據(jù)計(jì)數(shù)器等方便后續(xù)操作。
圖1 處理流程圖
本文中使用的是雙口RAM,雙口RAM 有兩組數(shù)據(jù)線和地址線,讀寫可以同時(shí)進(jìn)行。
需要注意的地方有:寫數(shù)據(jù)時(shí),雙口RAM 存儲(chǔ)是在寫時(shí)鐘的上升沿到來(lái)時(shí)完成的,所以要提前將數(shù)據(jù)和地址準(zhǔn)備好;讀數(shù)據(jù)時(shí),同樣要在讀時(shí)鐘上升沿時(shí)將地址處于穩(wěn)定狀態(tài);讀數(shù)據(jù)輸出時(shí),對(duì)于一個(gè)地址上的數(shù)據(jù)是在讀下一個(gè)地址的數(shù)據(jù)時(shí)才輸出到數(shù)據(jù)線上的,相當(dāng)于數(shù)據(jù)的真正輸出延遲讀時(shí)鐘一個(gè)周期;對(duì)于讀地址模塊的使能應(yīng)延遲輸出使能一個(gè)時(shí)鐘周期,使得地址0 可以保持被時(shí)鐘上升沿采集到,否則輸出的第一位輸出不穩(wěn)定的數(shù)據(jù)。
寫FIFO1 時(shí)只需判斷FIFO1 非滿即可回應(yīng)外部的請(qǐng)求信號(hào),將數(shù)據(jù)寫入FIFO1 中。
讀取FIFO1 中數(shù)據(jù)時(shí),需同步將讀出的數(shù)據(jù)寫入RAM中。對(duì)于讀出的FIFO1 數(shù)據(jù)首先判斷包頭,并且內(nèi)部計(jì)數(shù)器需要開始計(jì)算接收到的數(shù)據(jù)長(zhǎng)度,根據(jù)包頭位置可找相應(yīng)的包長(zhǎng),并根據(jù)得到的包長(zhǎng)信息,判斷最后的包尾是否是協(xié)議規(guī)定的數(shù)據(jù),此時(shí)才能判斷出這一包數(shù)據(jù)是否符合協(xié)議要求。若符合協(xié)議要求,則向RAM 發(fā)送讀RAM 的請(qǐng)求信號(hào)。若RAM 已經(jīng)響應(yīng),但是上一幀數(shù)據(jù)沒(méi)有被讀走的時(shí)候,是不能去讀FIFO1 中的數(shù)據(jù)的,不然會(huì)導(dǎo)致RAM 中的數(shù)據(jù)發(fā)生兩幀數(shù)據(jù)沖突。
在寫RAM 的時(shí)候,同步計(jì)算寫數(shù)據(jù)的個(gè)數(shù),直到該數(shù)據(jù)與之前得到的包長(zhǎng)度一致時(shí),即寫完一包數(shù)據(jù),停止寫數(shù)據(jù)和寫地址的操作。
當(dāng)RAM 收到讀請(qǐng)求的時(shí)候,意味著FIFO1 中的一包數(shù)據(jù)是正確的了,此時(shí)需要判斷FIFO2 是否有足夠的空間來(lái)存儲(chǔ),若FIFO2 空間滿足條件,可響應(yīng)請(qǐng)求,產(chǎn)生有效的讀信號(hào)和讀地址。
RAM 讀信號(hào)有效時(shí),即可開始對(duì)地址指針進(jìn)行操作,當(dāng)讀FIFO1 數(shù)據(jù)計(jì)數(shù)器結(jié)果和包長(zhǎng)度一致時(shí),將RAM 讀地址復(fù)位清零,以便下一次數(shù)據(jù)讀取。
RAM 讀出數(shù)據(jù)時(shí),計(jì)算好數(shù)據(jù)、地址、讀信號(hào)之間的延遲時(shí)間,產(chǎn)生寫FIFO2 的寫指針和寫地址,將對(duì)齊之后的數(shù)據(jù)寫入FIFO2 中。
FIFO2 的數(shù)據(jù)讀取則要根據(jù)下一級(jí)模塊的時(shí)序結(jié)合起來(lái)操作,本文中可將FIFO2 的非空標(biāo)志輸出至下級(jí)模塊,下級(jí)模塊根據(jù)非空標(biāo)志可產(chǎn)生相應(yīng)FIFO2 讀信號(hào)。
圖2 讀FIFO1 時(shí)序圖
圖2 中:標(biāo)記1:外部輸入的數(shù)據(jù);標(biāo)記2:FIFO1 寫信號(hào)與讀信號(hào);標(biāo)記3:從FIFO1 讀出的數(shù)據(jù);標(biāo)記4:從FIFO1 讀出數(shù)據(jù)正確,產(chǎn)生讀RAM 請(qǐng)求信號(hào)及應(yīng)答信號(hào),此時(shí)完成了正確數(shù)據(jù)流的存儲(chǔ)。
圖3 讀RAM 圖
圖3 中:標(biāo)記1 即讀RAM 的請(qǐng)求與應(yīng)答信號(hào);標(biāo)記2:從RAM 讀出數(shù)據(jù)包,寫入FIFO2 中。當(dāng)判斷FIFO2 的存儲(chǔ)空間滿足需要時(shí),將RAM 的數(shù)據(jù)包轉(zhuǎn)入到FIFO2 中,以待下級(jí)模塊的讀取。
此流程可完成數(shù)據(jù)的存儲(chǔ)、判斷、分發(fā),可保障從FPGA 分發(fā)至下級(jí)模塊的數(shù)據(jù)是符合協(xié)議的,避免了錯(cuò)誤數(shù)據(jù)下發(fā)而導(dǎo)致的下級(jí)模塊處理不正常的情況。