喻 鵬
(中國艦船研究設計中心 武漢 430061)
通用異步收發傳輸(UART)是一種主要將并行信號通過串行方式傳輸的技術。該技術常用來處理需要并行轉串行,傳輸距離遠,數據率要求不高的場合,在工程領域,尤其是嵌入式領域有著較多的研究和應用[1~4]。針對UART 的研究一個方向在于UART 傳輸中提升傳輸速率[5],減少誤碼以及提升性能功耗比。如文獻[6]使用CPLD 器件用VHDL 語言完成了基于RS422 的串行接口實現,對各模塊的設計作了詳細介紹,并具有低于10(^-9)的誤碼率。文獻[7]研究了串口的異步設計實現,并跟三種不同的同步串口設計實現方式作了對比,得出該異步設計串口相對同步設計平均功率消耗僅有四分之一。文獻[8]研究了使用FPGA[9~12]實現的UART 串口的各模塊詳細實現,完成數據的串并轉換,以及完成通信所需的任務、時序以及校驗等功能。另一方向的研究在于UART 在滿足應用場景要求下的實現,如文獻[13]中,介紹了一種可實現紅外通信以及支持DMA 模式的UART 實現方法,該方法特點是具備DMA模式減少CPU的占用,并在長時間以及不同波特率下均能正常工作。在文獻[14]提出的綠色通訊概念,設計了溫度感知的高效UART,該設計在不同的溫度情況下節能比例可以達到59%以上。
結合上述研究工作,本文結合多板卡仿真系統的應用背景,設計了一種主從設計的UART 串口實現結構,除了利用FPGA 邏輯代碼完成數據串并轉換,波特率產生,發送接收模塊等功能實現外,該實現結構顯著特點是能滿足在多板卡仿真系統中通過單路UART 完成指令配置與狀態監控的方法,并且具有時序滿足要求,不占用DSP 計算資源,消耗FPGA資源少的特點。
在星上仿真系統[15]中,包含有多波段圖像數據,低幀頻圖像為掃描過程圖像采集結果,高幀頻圖像為掃描圖像中重點觀察區域。仿真系統結構如圖1 所示,包含多波段圖像生成系統,一個主處理板卡與兩個協處理板卡,單星地面處理機,地面綜合信息處理機。多波段圖像生成系統生成多個波段的圖像數據發送至主處理版與兩個協處理板。三個處理板分別對圖像數據做目標提取等相關處理,處理結果通過千兆以太網口發送至單星地面處理機,單星地面處理機對板卡處理結果做多波段信息關聯與融合,得到該仿真過程的預警信息。地面綜合信息處理機執行板卡的指令下達與狀態監控功能。

圖1 仿真系統架構
綜合信息處理機處理流程如圖2 所示。地面綜合信息處理機通過USB轉串口的硬件接口,將指令控制數據包通過LVDS 差分數據信號與主處理板卡通信。主處理板卡通過通信隔離器完成差分信號到單Bit 信號轉換。單Bit 信號進入FPGA 中,由串并轉換模塊恢復出指令控制數據包。

圖2 指令控制架構
協處理板卡1和協處理板卡2在處理完每幀圖像后,打包自身狀態信息發送至主處理板卡,主處理板卡接收狀態信息,分別存入相應緩存FIFO。主處理板卡在每個圖像幀處理結束后打包自身狀態信息,存入緩存FIFO,并給出Ready 信號。主處理板的發送狀態機檢測到Ready 信號上升沿后由空閑狀態跳轉入發送狀態。處于發送狀態的狀態機依次讀取主處理板卡,協處理板卡1,協處理板卡2 的緩存FIFO 中數據,將數據合并成完整的狀態數據包經時鐘匹配、并串轉換,通過驅動IC 從板卡發出至綜合信息處理機。
指令數據包設計如圖3 所示,包含主包頭,和相應三個板卡分包頭與對應數據內容。

圖3 指令包格式
主處理板卡的接收狀態機命名為接收狀態機0。緩存FIFO 接收整包的指令控制數據包后給出READY=1 的單bit 信號,接收狀態機0 在檢測到該單bit 信號的上升沿后,狀態機由默認的空閑狀態開始跳轉。其流程如圖4 所示。IDLE 狀態開始,狀態機每個時鐘讀取出FIFO中一個數據,S1、S2狀態判斷讀取的包頭數據內容,是否為協議規定的90H,90H,是則跳入下一個狀態;S3 狀態判斷數據是否為主指令數據包頭11H;S4開始讀取出主指令數據包數據,通過計數器NS_CNT 控制讀取數據數量,在數據數量等于數據包長度LENGTH時進入下一個狀態;S5狀態判斷數據是否為協1指令數據包頭;S6 狀態讀取出協1 指令數據包數據,通過計數器控制數據讀取并判斷是否進入下一個狀態;S7狀態判斷數據是否為協2指令數據包頭;S8狀態讀取出協2 指令數據包數據,計數器控制數據量并跳入idle狀態。

圖4 接收狀態機0
完成上述流程,接收狀態機0 即執行一次接收數據包分解,針對三個板卡的指令數據分別被提取出來,并緩存入對應的緩存FIFO 中。讀取主處理板指令緩存FIFO 獲得主處理板指令數據,指令數據配置至對應的寄存器,以完成主處理板的指令配置過程。協處理板1 指令緩存入對應FIFO 后,給出協處理板的READY 信號。發送邏輯塊讀取FIFO 中數據,經過并串轉換,并添加起始位,校驗位,結束位信號送入UART驅動IC,轉換成LVDS的差分信號傳輸到板卡外部。
協處理板卡1 以差分信號線接收的主處理板卡轉發的指令數據,通過UART驅動IC轉化為字節數據并緩存入FIFO。當FIFO 緩存數據達到傳輸協議約定的長度時,給出program_full 信號。協板卡接收狀態機1的跳轉過程如圖5所示。
IDLE:接收狀態機的默認狀態,并判斷寫入數據長度(wr_data_count)是否等于指令數據包長度(RX_LEN),若相等則跳轉入下一個狀態READ_FIFO;
READ_FIFO:將 FIFO 的 讀 使 能 信 號(sm_rx_fifo_rden)置為1,并跳轉至下一個狀態PARAMETER_SET;
PARAMETER_SET:對讀取出的指令數據計數(rden_cnt),依據計數值做分支選擇,指令數據被配置至相應的寄存器。 判斷指令數據計數(rden_cnt),若等于指令數據包長度(RX_LEN),則指令配置結束跳轉回IDLE 狀態,否則停留在PARAMETER_SET狀態。

圖5 接收狀態機1
協處理板卡1 中的接收狀態機1 從PARAMETER_SET跳轉回IDLE狀態則完成了指令數據獲取和配置過程。協處理板卡2 處理流程與協處理板卡1過程相似。
狀態信息由協處理板1、協處理板2 將狀態信息通過LVDS 信號傳輸至主處理板卡,主處理板卡緩存協處理板卡狀態信息并結合自身狀態信息按格式打包成完整的數據包后上傳至綜合信息處理機。綜合信息處理機獲取數據包內容顯示各板卡的狀態信息。
協處理板卡1發送過程如圖6所示。

圖6 發送狀態機1
IDLE:發送狀態機的默認狀態,在狀態數據準備好(READY==1),狀態機跳轉至WRITE_FIFO 狀態,否則停留在IDLE不變。
WRITE_FIFO:進入WRITE_FIFO 狀態,發送FIFO 的寫使能置為有效(sm_tx_fifo_wren=1),并跳轉入SEND_STATUS狀態。
SEND_STATUS:該狀態先對時鐘計數(wr_en_cnt),并且以該計數為條件判斷分支,來決定往發送FIFO 中寫入的數據。 判斷計數wr_en_cnt 達到數據包長度TX_LEN,則跳轉入IDLE狀態,并結束FIFO寫操作。
經一個完整的發送狀態機1 的狀態跳轉,協處理板卡1 的狀態信息被寫入到發送FIFO 中,在寫入FIFO 完畢給出的結束信號觸發下,發送邏輯塊讀取FIFO 中數據,并經過并串轉換過程,以及對每個字節數據增加起始位,校驗位,結束位信號后變成單bit 數據。數據送入UART 驅動IC,轉換成LVDS的差分信號傳輸到板卡外部。
主處理板卡以接收邏輯塊接收兩個協處理板卡發送的狀態信息,通過UART驅動IC接收差分信號轉換來的單bit 數據流,通過識別起始位,校驗位,結束位以及串并轉換等操作將數據恢復至字節數據,并緩存入FIFO中。
主處理板通過發送狀態機0 將自身狀態信息以及協處理板卡狀態信息打包成完整的狀態信息數據包,通過發送邏輯塊以及UART驅動IC傳遞至綜合信息處理機中。
狀態反饋數據包格式如圖7 所示,總長度為LENGTH×3+5,包含三個狀態數據包,4個包頭控制字。

圖7 狀態數據格式
發送狀態機0的狀態跳轉流程圖如圖8所示。

圖8 發送狀態機0
IDLE:空閑狀態,如果數據準備好,即READY信號為1,則跳轉至HEAD1 狀態,否則停留在IDLE狀態。
HEAD1:往發送緩存FIFO 中寫入標識字第一個字節EBH,然后跳轉入下一個狀態HEAD2。
HEAD2:往發送緩存FIFO 中寫入標識字第二個字節90H,然后跳轉入下一個狀態HEAD3。
HEAD3:往發送緩存FIFO 中寫入主處理板數據(NS_DATA)標識字11H,然后跳轉入START 狀態。
START:判斷主處理板狀態數據準備好(ns_fifo_ready)信號有效,如果有效則將主處理板狀態數據緩存FIFO 讀使能有效,并跳轉入SEND_NS_DATA狀態,否則停留在START狀態。
SEND_NS_DATA:保持主處理板狀態數據緩存FIFO 讀使能有效,并計數寫入發送緩存FIFO 數據量send_ns_cnt,若其達到協議定義主處理板數據長度(LENGTH),則跳轉入HEAD4 狀態,否則停留在SEND_NS_DATA狀態。
HEAD4:往發送緩存FIFO 中寫入協處理板1數據(SM_DATA)標識字22H,并跳轉入下一個狀態SEND_SM_DATA。
SEND_SM_DATA:保持協處理板卡1狀態數據緩存FIFO 讀使能有效,并計數寫入發送緩存FIFO數據量send_sm_cnt,若其達到協議定義協處理板1數據長度(LENGTH),則跳轉入HEAD5 狀態,否則停留在SEND_SM_DATA狀態。
HEAD5:往發送緩存FIFO 中寫入協處理板2數據(SS_DATA)標識字33H,并跳轉入下一個狀態SEND_SS_DATA。
SEND_SS_DATA:保持協處理板卡2 狀態數據緩存FIFO 讀使能有效,并計數寫入發送緩存FIFO數據量send_ss_cnt,若其達到協議定義協處理板2數據長度(LENGTH),則跳轉入END 狀態,否則停留在SEND_SS_DATA狀態。
END:輸出發送緩存FIFO 數據寫完(ns_to_zh_end_flag)的信號,并跳轉入IDLE狀態。
ns_to_zh_end_flag 信號由發送模塊拾取,并由發送模塊讀取發送緩存FIFO 數據,并將數據轉換后發送至綜合控制機,綜合控制機獲取的板卡狀態參數并實時顯示。
本文仿真系統主處理板處理0.1s 每幀的低分辨率圖像,協處理板處理3s 每幀的高分辨率圖像。主處理板指令的獲取與分發,狀態信息的收集與上傳的邏輯控制塊均采用50Mhz 的像素時鐘驅動,協處理板卡的指令獲取與狀態信息的上傳采用50Mhz 的像素時鐘驅動。串口的波特率通過時鐘分頻得到115200bps波特率的信號。
以主處理板卡上數據包發送耗時分析有,數據包總長度為5+3*LENGTH=101byte,每個BYTE 在串口傳輸中以起始位、數據位、校驗位、結束位傳送。則在串口傳輸下對應為101*11=1111 個時鐘周期。串口速率115200bps,傳輸過程耗時為9.64ms。主處理板一幀圖像接收加算法處理時間為250ms,主處理板中使用1024*1024大小圖像,輸入cameralink格式采用行無效時間為10像素時鐘,接收一幀圖像耗時為(1024+10)*1024/50MHz=21.18ms。串口傳輸在每一幀圖像接收周期內即可完成,傳輸時間消耗滿足要求。
多板卡協調過程如圖9所示,在主處理板每幀結束時,得到主處理板的算法狀態,此時協處理板存在多種狀態。A 點時,發送數據包包含有效的主處理板狀態信息,無效的協1、協2 處理板狀態信息,B點時發送數據包包含有效的主、協1處理板狀態信息,無效的協2處理板狀態信息,C點時發送數據包包含有效的主、協2 處理板狀態信息,無效的協1處理板狀態信息。

圖9 狀態發送時序
在FPGA 中實現的指令控制結構設計,其占用資源如表1 所示,本實現方法中各處理板中FPGA芯片均為Xilinx 公司的Kintex-7 系列的kc325t 型號。
主處理板中占用資源稍多,但寄存器、查找表、塊RAM 的占用量均為全芯片資源的1%量級,甚至更小。可見本方法實現的指令控制既實現功能又具有較少的系統資源消耗。

表1 資源占用
硬件仿真系統中算法處理器件為FPGA,經利用FPGA 的剩余資源實現指令控制系統,避免了使用DSP 做指令控制導致的器件資源浪費。同時經過時間性能分析,工程實際驗證,指令傳輸耗時低于10ms,在時序上滿足硬件仿真系統的需求,并且硬件資源占用量少,對硬件仿真系統本身性能不產生影響,并能夠持續穩定地完成指令下發、狀態上傳等指令控制功能。