楊珍,蔣鑫
(四川九洲空管科技有限責任公司,四川綿陽,621000)
二次雷達機系統是對空中目標鑒別與監視的系統,在空中的目標識別與跟蹤和空中交通管制等很多方面有極大的作用。點跡板在進行點跡和航跡關聯之前,首先應仔細研究點跡報告中的信息,而這些信息則由FPGA 上傳的,FPGA的數據源則是由上流譯碼模塊產生的。FPGA 作為數據傳輸的一環,在以往的設備中是沒有經過容錯處理就將數據下發至點跡處理模塊,一旦數據出問題首先會影響下級模塊數據處理,再者排查錯誤時無法定位是因上層模塊錯誤還是因FPGA 數據透傳而引起的錯誤,給后續應用帶來巨大的不變。
本文中的方法可以很好的避免傳輸錯誤的數據,可正確完成數據的存儲、判斷、分發,可保障從FPGA 分發至點跡板模塊的數據是符合數據要求的,避免了錯誤數據下發而導致的點跡模塊處理不正常的情況。本方法是基于數據包結構并通過FIFO 和RAM 結合的方式對數據包進行判斷處理的,從而保障數據流輸出的正確性,保障點跡數據的連續性,并當點跡數據出現異常時能夠明確排查思路,確定排查方向。
FPGA 對數據流的處理是有多種方法的,其中之一是通過異步FIFO 來作為不同時鐘域數據傳輸的緩沖區,該方法下進行寫數據和讀數據,有寫指針與讀指針,另外有FIFO控制器來通過外部的讀寫信號控制指針操作,有不同的寫時鐘和讀時鐘,這樣的操作只能完成異步數據的處理,并不能判斷所接受的數據是否正確,是完全透傳譯碼板下發的數據,不對數據包進行任何判斷,帶來的影響有兩點:(1)譯碼板與信號處理板數據傳輸時,可能會因硬件或者機箱周邊環境原因而收到干擾,導致信號處理接收數據錯誤。(2)譯碼板自身傳輸的數據源是錯誤的,而信號處理板透傳之后,一旦點跡板檢測到數據錯誤,系統不能直接定位,需要信號處理板和譯碼板同時配合,會消耗較多的人力資源和時間成本。本文中重點介紹第二種方法:當FPGA 和其他設備進行通信時,如果傳輸的是大量數據,則需要打包(組幀)進行傳輸,而且需要有幀頭和校驗位來確保幀數據傳輸正確。當FPGA 作為接收端去接收幀數據時,即使保證一幀數據的幀頭和校驗位均是正確的也不能保證該幀數據是正確的,在本文中運用的包結構是包頭+包長+包數據+包校驗+包尾的組合,經過該種嚴謹的包結構,可以避免特殊包數據和包頭或者包尾一致時引發的判斷錯誤,降低了因上下級模塊之間采樣引起的幀數據錯誤的概率,后端點跡模塊采樣也必須經過包結構判斷后才能使用幀數據。
本文涉及的上級模塊的數據是通過請求、應答等握手信號的配合來進行數據傳輸的,當FPGA 檢測到上級模塊的請求之后,根據自己的處理、存儲情況來判斷是否要發送應答信號。當應答信號發送后,則需要做好數據接收的準備。因上級模塊傳輸的數據于高頻率、特長數據包結構的數據類型,考慮到后續的流水線工作,需要將數據寫入FIFO 中。
當判斷FIFO1 中非空時,則應產生讀信號,讀取數據,此時讀出來的數據已經轉換到了該FPGA 的時鐘域下,以下操作均在同一時鐘域下操作。從FIFO1 中讀取的數據直接寫入RAM 中,同時判斷從該FIFO1 中讀出的數據是否是協議數據,若數據包符合要求,則同步讀取RAM 數據,寫入FIFO2 中,點跡模塊可以根據FIFO2 的非空信號來讀取FIFO2 中的數據。
本文中涉及的FPGA資源比較少,大部分器件均可滿足需求。
圖1 可以清楚的看到,整個接收、存儲、讀數據、寫數據等處理流程。
在對外部輸入的請求信號處理之前需進行打拍處理,應該選取穩定狀態下的值,避免亞穩態情況下毛刺信號影響整體的時序功能。
文中上級模塊數據是根據FPGA 產生的應答有效而產生數據,即對于FPGA 來講,接收到的數據和FPGA 產生的應答信號是同步的,所以我們采用的是同步FIFO1,需要設置FIFO1 的非空標志、寫數據計數器等方便后續操作。

圖1 處理流程圖
本文中使用的是雙口RAM,雙口RAM 有兩組數據線和地址線,讀寫可以同時進行。
需要注意的地方有:寫數據時,雙口RAM 存儲是在寫時鐘的上升沿到來時完成的,所以要提前將數據和地址準備好;讀數據時,同樣要在讀時鐘上升沿時將地址處于穩定狀態;讀數據輸出時,對于一個地址上的數據是在讀下一個地址的數據時才輸出到數據線上的,相當于數據的真正輸出延遲讀時鐘一個周期;對于讀地址模塊的使能應延遲輸出使能一個時鐘周期,使得地址0 可以保持被時鐘上升沿采集到,否則輸出的第一位輸出不穩定的數據。
寫FIFO1 時只需判斷FIFO1 非滿即可回應外部的請求信號,將數據寫入FIFO1 中。
讀取FIFO1 中數據時,需同步將讀出的數據寫入RAM中。對于讀出的FIFO1 數據首先判斷包頭,并且內部計數器需要開始計算接收到的數據長度,根據包頭位置可找相應的包長,并根據得到的包長信息,判斷最后的包尾是否是協議規定的數據,此時才能判斷出這一包數據是否符合協議要求。若符合協議要求,則向RAM 發送讀RAM 的請求信號。若RAM 已經響應,但是上一幀數據沒有被讀走的時候,是不能去讀FIFO1 中的數據的,不然會導致RAM 中的數據發生兩幀數據沖突。
在寫RAM 的時候,同步計算寫數據的個數,直到該數據與之前得到的包長度一致時,即寫完一包數據,停止寫數據和寫地址的操作。
當RAM 收到讀請求的時候,意味著FIFO1 中的一包數據是正確的了,此時需要判斷FIFO2 是否有足夠的空間來存儲,若FIFO2 空間滿足條件,可響應請求,產生有效的讀信號和讀地址。
RAM 讀信號有效時,即可開始對地址指針進行操作,當讀FIFO1 數據計數器結果和包長度一致時,將RAM 讀地址復位清零,以便下一次數據讀取。
RAM 讀出數據時,計算好數據、地址、讀信號之間的延遲時間,產生寫FIFO2 的寫指針和寫地址,將對齊之后的數據寫入FIFO2 中。
FIFO2 的數據讀取則要根據下一級模塊的時序結合起來操作,本文中可將FIFO2 的非空標志輸出至下級模塊,下級模塊根據非空標志可產生相應FIFO2 讀信號。

圖2 讀FIFO1 時序圖
圖2 中:標記1:外部輸入的數據;標記2:FIFO1 寫信號與讀信號;標記3:從FIFO1 讀出的數據;標記4:從FIFO1 讀出數據正確,產生讀RAM 請求信號及應答信號,此時完成了正確數據流的存儲。

圖3 讀RAM 圖
圖3 中:標記1 即讀RAM 的請求與應答信號;標記2:從RAM 讀出數據包,寫入FIFO2 中。當判斷FIFO2 的存儲空間滿足需要時,將RAM 的數據包轉入到FIFO2 中,以待下級模塊的讀取。
此流程可完成數據的存儲、判斷、分發,可保障從FPGA 分發至下級模塊的數據是符合協議的,避免了錯誤數據下發而導致的下級模塊處理不正常的情況。