何文青, 章 愷, 馬超男, 席燕博, 陳偉雄
(上海無線電設備研究所,上海201109)
1553B總線的全稱為MIL-STD-1553B總線,原是美國軍方為飛機設備制定的一種用于信息傳輸的總線標準。隨著1553B總線的應用日益廣泛,國外許多公司推出了自己的1553B協議芯片[1-2]。但這些芯片價格昂貴,對于科研生產中的一般使用來說,許多功能也顯得多余。現今由于芯片技術和工藝的持續發展,用現場可編程門陣列(FPGA)實現1553B總線的編解碼已經可行。
近年來,采用FPGA實現1553B總線編碼或解碼功能的設計方法被提出,但實現過程均較為復雜。文獻[3]在1.5 MHz時鐘上升沿來臨時,將輸入寄存器中的數據經過并-串轉換輸出,同時與3 MHz時鐘相異或,完成曼徹斯特編碼。整個編碼過程需要設置兩個時鐘信號,較為繁瑣。解碼過程對接收寄存器兩兩分組進行解碼。這樣做風險較大,一旦寄存器存儲錯位,解碼的數據將完全相反。文獻[4]通過一個2選1選擇器進行編碼,雖較文獻[3]簡便,但編碼過程耗時較長,在解碼過程中則需要提取“00”或“11”作為標志位,且未有效利用同步頭。文獻[5]和文獻[6]通過設計狀態機對同步頭鎖定實現解碼,狀態機之間的關聯和跳轉邏輯稍顯復雜。本文設計了通過寄存器處理、快速進行曼徹斯特編碼的方法,并采用移位寄存器匹配同步頭的方法完成解碼,從而解決了1553B總線編解碼器結構、邏輯復雜及編解碼速度慢的問題。
1553B總線采用的曼徹斯特碼(Manchester Code),又稱為雙相碼,是通過電平跳變來表示二進制信息的數字編碼碼型。圖1為相同時鐘下不歸零(Not Return to Zero,NRZ)碼和曼徹斯特碼的對照圖。相比于不歸零碼,曼徹斯特碼每一位時中間都有一次跳變[1]。圖中以兩條虛線之間,即時鐘信號兩個上升沿之間,為一個位時。在一個位時中,不歸零碼為“1”時,曼徹斯特碼用“10”表示。反之,不歸零碼為“0”時,曼徹斯特碼用“01”表示。

圖1 不歸零碼和曼徹斯特碼對照圖
傳統的1553B總線編碼過程,無論是采用寄存器輸出后與時鐘異或,或是按位使用2選1選擇器產生曼徹斯特碼,都是逐位進行編碼。該方式使得整個編碼過程耗時較長,編碼效率低下,系統資源占用率高。
傳統的1553B總線在曼徹斯特碼解碼過程中通常采用讀取“00”或“11”標志位或狀態機方法進行解碼。如果連續多位出現“10”或“01”,使用標志位方法并不能有效解碼。采用狀態機的方法其本身也是一種利用同步頭進行匹配的方式,但是狀態機跳轉的邏輯表達并沒有直接利用同步頭進行匹配直觀。
1553B總線的協議規定組成消息的最小單位為字,每個字由連續的20位組成。圖2為數據字的組成示意圖,其中包含3位同步頭,16位信息位和1位校驗位[2,7]。

圖2 數據字組成示意圖
該曼徹斯特編碼模塊的設計目的是使輸入數據能快速完成編碼并發送。主要完成以下功能:(1)編碼器根據檢測數據類型標志位生成同步頭;(2)并行輸入16位信息位并產生奇偶校驗位,將16位輸入信息和校驗位快速進行曼徹斯特編碼,并加入同步頭;(3)計數器根據計數確定發送位,進行串行發送。圖3為曼徹斯特編碼模塊的邏輯框圖。

圖3 曼徹斯特編碼模塊邏輯圖
編碼模塊時鐘enc_clk采用2 MHz,輸入端采用并行方式輸入數據。根據1553B總線協議,數據在總線上的傳輸速率為1 Mb/s,因此原來3位的同步頭將擴展為6位[2,7]。產生同步頭部分,在時鐘上升沿時監測同步頭標志位tx_csw(命令字或狀態字)和tx_dw(數據字)。當tx_csw=1且tx_dw=0時,同步頭sync_bits賦值“6’b111_000”。當tx_csw=0且tx_dw=1時,同步頭sync_bits賦值“6’b000_111”。
數據編碼部分,預先設置一個17位寄存器reg_in用于存儲信息位和奇偶校驗位。奇偶校驗位由信息位逐位異或得到。程序中設置一個使能端en,初始化值為“0”。當enc_clk處于上升沿時,若同步頭標志tx_csw或tx_dw存在且使能端en為“0”,允許并行輸入數據tx_dword存入寄存器reg_in。16位信息位和1位校驗位存入寄存器reg_in后,進行曼徹斯特編碼,并在編碼后的數據頭部加入同步頭sync_bits。本文采用將輸入的17位數據分別按位取反插入到原數據后的方法,將原來的17位數據編碼后變成34位數據,實現快速曼徹斯特編碼。具體程序如下:

數據發送部分,在完成輸入數據寄存的同一個enc_clk上升沿時刻,若同步頭標志位為“1”,則使能端en變為“1”,在下一個enc_clk時鐘上升沿觸發計數器cnt開始計數,用于串行數據的發送。當數據送入輸出寄存器data_out后,由計數器cnt確定發送位,開始在時鐘上升沿時刻逐位發送數據。
曼徹斯特解碼模塊通過移位寄存器準確匹配同步頭完成解碼,主要完成以下功能:(1)對接收的數據進行存儲;(2)對同步頭進行檢測,并進行匹配和鎖定;(3)對同步頭以外的數據部分進行曼徹斯特解碼,完成解碼后將串行數據再次轉換為并行數據,并進行奇偶校驗。圖4為曼徹斯特解碼模塊的邏輯框圖。

圖4 曼徹斯特解碼模塊邏輯圖
同步頭檢測和鎖定是正確解碼的關鍵。為了保證采樣的準確性,解碼模塊采用8 MHz的采樣時鐘。由于同步頭并非曼徹斯特波形,理論上只需檢測接收數據中是否存在與命令字/狀態字匹配的數據,就可以判斷是否檢測到同步頭。但為了避免采樣時亞穩態問題或傳輸過程中可能存在的干擾影響,保證判定可靠,還需檢測同步頭之后的首位數據是否存在邊緣跳變,只有兩者同時成立時才能判定檢測到同步頭而完成匹配。因此接收端設置了24位的移位寄存器sync_shift_reg和8位的移位寄存器data_shift_reg,分別用于檢測同步頭及同步頭之后的首位曼徹斯特碼數據。兩個移位寄存器設置如下:

即,由時鐘觸發,data_shift_reg接收的數據從低位輸入并向高位移動,data_shift_reg的最高位數據向sync_shift_reg的最低位移動,并不斷向sync_shift_reg高位移動。結合解碼模塊采樣時鐘的設置,用于同步頭檢測的具體程序如下:

當移位寄存器sync_shift_reg內存儲的數據為“24’hFFF_000”或“24’h000_FFF”,且移位寄存器data_shift_reg的第2位和第6位相異,即存在邊沿跳變時,則判定檢測到編碼模塊發送過來的同步頭,完成同步頭匹配并鎖定。
在解碼環節,當同步頭被匹配并鎖定后,開始進行曼徹斯特解碼。由于解碼模塊采樣時鐘頻率為8 MHz,是編碼模塊時鐘頻率的4倍。解碼模塊中對曼徹斯特編碼進行采樣,每8次采樣代表未編碼原始數據的一位。利用移位寄存器data_shift_reg以及曼徹斯特編碼的特性,根據時鐘信號每移位8次取一次移位寄存器data_shift_reg最高位的方法,將原始數據還原并依次存入一個新的寄存器。同時利用計數器,當計數器被計滿,所有數據被解碼還原后,對新寄存器中的數據進行串行轉并行處理,然后輸出。
圖5為編碼模塊的仿真圖。編碼時鐘信號enc_clk頻率為2 MHz,復位信號rst_n低電平有效;tx_csw和tx_dw分別代表命令/狀態字和數據字標志,當tx_csw或tx_dw為“1”時,代表發送數據為命令/狀態字或為數據字;tx_dword為并行發送的數據內容;tx_data為經過曼徹斯特編碼后的數據內容。

圖5 編碼模塊仿真結果
由圖5可知,當tx_dw為“1”時,同步頭輸出為“000111”(圖5中畫圈處)。當輸入數據為“11000000000000001”,經奇偶校驗和曼徹斯特編碼后,輸出數據為“1010010101010101010101010 101011010”,實現了編碼模塊的功能。
圖6為解碼模塊的仿真圖。解碼時鐘信號dec_clk頻率為8 MHz;sync_csw和sync_dw分別為命令/狀態字和數據字同步頭的匹配標志;rx_csw和rx_dw分別為接收端命令/狀態字和數據字標志;dword_out為解碼過程中的數據變化,可以檢驗解碼過程中數據的情況;data_sample為解碼過程的采樣時鐘;rx_dword_out為最終接收并解碼后的并行數據;rx_done和rx_perr分別為接收完成標志和校驗錯誤標志。當sync_dw輸出高電平脈沖時,表示數據字同步頭匹配完成,可以進行解碼;隨后采樣時鐘data_sample為上升沿時,按照解碼規則采樣移位寄存器中的數據,并存入新的寄存器中;最終采集的數據將全部送給rx_dword_out進行并行輸出。當rx_dword_out輸出最終解碼的數據“11000000000000001”后,數據字標志rx_dw輸出高電平脈沖表示輸出為數據內容,同時接收完成標志rx_done輸出高電平脈沖表示完成解碼數據接收。校驗錯誤標志rx_perr為低電平時表示沒有錯誤。

圖6 解碼模塊仿真結果
本文對1553B總線的編碼和解碼模塊進行了設計與改進。改進后的編碼模塊舍棄了傳統的逐位進行曼徹斯特編碼的方式,采用寄存器按位統一編碼的方式,提高了整體的編碼效率。解碼模塊有效利用移位寄存器對數據進行檢測,完成同步頭匹配,實現了快速解碼并提高了解碼的可靠性。系統采用硬件描述語言實現,經軟件仿真測試符合設計要求,為后續系統的設計與改進提供了基礎。