何文青, 章 愷, 馬超男, 席燕博, 陳偉雄
(上海無(wú)線電設(shè)備研究所,上海201109)
1553B總線的全稱為MIL-STD-1553B總線,原是美國(guó)軍方為飛機(jī)設(shè)備制定的一種用于信息傳輸?shù)目偩€標(biāo)準(zhǔn)。隨著1553B總線的應(yīng)用日益廣泛,國(guó)外許多公司推出了自己的1553B協(xié)議芯片[1-2]。但這些芯片價(jià)格昂貴,對(duì)于科研生產(chǎn)中的一般使用來(lái)說(shuō),許多功能也顯得多余。現(xiàn)今由于芯片技術(shù)和工藝的持續(xù)發(fā)展,用現(xiàn)場(chǎng)可編程門陣列(FPGA)實(shí)現(xiàn)1553B總線的編解碼已經(jīng)可行。
近年來(lái),采用FPGA實(shí)現(xiàn)1553B總線編碼或解碼功能的設(shè)計(jì)方法被提出,但實(shí)現(xiàn)過(guò)程均較為復(fù)雜。文獻(xiàn)[3]在1.5 MHz時(shí)鐘上升沿來(lái)臨時(shí),將輸入寄存器中的數(shù)據(jù)經(jīng)過(guò)并-串轉(zhuǎn)換輸出,同時(shí)與3 MHz時(shí)鐘相異或,完成曼徹斯特編碼。整個(gè)編碼過(guò)程需要設(shè)置兩個(gè)時(shí)鐘信號(hào),較為繁瑣。解碼過(guò)程對(duì)接收寄存器兩兩分組進(jìn)行解碼。這樣做風(fēng)險(xiǎn)較大,一旦寄存器存儲(chǔ)錯(cuò)位,解碼的數(shù)據(jù)將完全相反。文獻(xiàn)[4]通過(guò)一個(gè)2選1選擇器進(jìn)行編碼,雖較文獻(xiàn)[3]簡(jiǎn)便,但編碼過(guò)程耗時(shí)較長(zhǎng),在解碼過(guò)程中則需要提取“00”或“11”作為標(biāo)志位,且未有效利用同步頭。文獻(xiàn)[5]和文獻(xiàn)[6]通過(guò)設(shè)計(jì)狀態(tài)機(jī)對(duì)同步頭鎖定實(shí)現(xiàn)解碼,狀態(tài)機(jī)之間的關(guān)聯(lián)和跳轉(zhuǎn)邏輯稍顯復(fù)雜。本文設(shè)計(jì)了通過(guò)寄存器處理、快速進(jìn)行曼徹斯特編碼的方法,并采用移位寄存器匹配同步頭的方法完成解碼,從而解決了1553B總線編解碼器結(jié)構(gòu)、邏輯復(fù)雜及編解碼速度慢的問(wèn)題。
1553B總線采用的曼徹斯特碼(Manchester Code),又稱為雙相碼,是通過(guò)電平跳變來(lái)表示二進(jìn)制信息的數(shù)字編碼碼型。圖1為相同時(shí)鐘下不歸零(Not Return to Zero,NRZ)碼和曼徹斯特碼的對(duì)照?qǐng)D。相比于不歸零碼,曼徹斯特碼每一位時(shí)中間都有一次跳變[1]。圖中以兩條虛線之間,即時(shí)鐘信號(hào)兩個(gè)上升沿之間,為一個(gè)位時(shí)。在一個(gè)位時(shí)中,不歸零碼為“1”時(shí),曼徹斯特碼用“10”表示。反之,不歸零碼為“0”時(shí),曼徹斯特碼用“01”表示。
圖1 不歸零碼和曼徹斯特碼對(duì)照?qǐng)D
傳統(tǒng)的1553B總線編碼過(guò)程,無(wú)論是采用寄存器輸出后與時(shí)鐘異或,或是按位使用2選1選擇器產(chǎn)生曼徹斯特碼,都是逐位進(jìn)行編碼。該方式使得整個(gè)編碼過(guò)程耗時(shí)較長(zhǎng),編碼效率低下,系統(tǒng)資源占用率高。
傳統(tǒng)的1553B總線在曼徹斯特碼解碼過(guò)程中通常采用讀取“00”或“11”標(biāo)志位或狀態(tài)機(jī)方法進(jìn)行解碼。如果連續(xù)多位出現(xiàn)“10”或“01”,使用標(biāo)志位方法并不能有效解碼。采用狀態(tài)機(jī)的方法其本身也是一種利用同步頭進(jìn)行匹配的方式,但是狀態(tài)機(jī)跳轉(zhuǎn)的邏輯表達(dá)并沒(méi)有直接利用同步頭進(jìn)行匹配直觀。
1553B總線的協(xié)議規(guī)定組成消息的最小單位為字,每個(gè)字由連續(xù)的20位組成。圖2為數(shù)據(jù)字的組成示意圖,其中包含3位同步頭,16位信息位和1位校驗(yàn)位[2,7]。
圖2 數(shù)據(jù)字組成示意圖
該曼徹斯特編碼模塊的設(shè)計(jì)目的是使輸入數(shù)據(jù)能快速完成編碼并發(fā)送。主要完成以下功能:(1)編碼器根據(jù)檢測(cè)數(shù)據(jù)類型標(biāo)志位生成同步頭;(2)并行輸入16位信息位并產(chǎn)生奇偶校驗(yàn)位,將16位輸入信息和校驗(yàn)位快速進(jìn)行曼徹斯特編碼,并加入同步頭;(3)計(jì)數(shù)器根據(jù)計(jì)數(shù)確定發(fā)送位,進(jìn)行串行發(fā)送。圖3為曼徹斯特編碼模塊的邏輯框圖。
圖3 曼徹斯特編碼模塊邏輯圖
編碼模塊時(shí)鐘enc_clk采用2 MHz,輸入端采用并行方式輸入數(shù)據(jù)。根據(jù)1553B總線協(xié)議,數(shù)據(jù)在總線上的傳輸速率為1 Mb/s,因此原來(lái)3位的同步頭將擴(kuò)展為6位[2,7]。產(chǎn)生同步頭部分,在時(shí)鐘上升沿時(shí)監(jiān)測(cè)同步頭標(biāo)志位tx_csw(命令字或狀態(tài)字)和tx_dw(數(shù)據(jù)字)。當(dāng)tx_csw=1且tx_dw=0時(shí),同步頭sync_bits賦值“6’b111_000”。當(dāng)tx_csw=0且tx_dw=1時(shí),同步頭sync_bits賦值“6’b000_111”。
數(shù)據(jù)編碼部分,預(yù)先設(shè)置一個(gè)17位寄存器reg_in用于存儲(chǔ)信息位和奇偶校驗(yàn)位。奇偶校驗(yàn)位由信息位逐位異或得到。程序中設(shè)置一個(gè)使能端en,初始化值為“0”。當(dāng)enc_clk處于上升沿時(shí),若同步頭標(biāo)志tx_csw或tx_dw存在且使能端en為“0”,允許并行輸入數(shù)據(jù)tx_dword存入寄存器reg_in。16位信息位和1位校驗(yàn)位存入寄存器reg_in后,進(jìn)行曼徹斯特編碼,并在編碼后的數(shù)據(jù)頭部加入同步頭sync_bits。本文采用將輸入的17位數(shù)據(jù)分別按位取反插入到原數(shù)據(jù)后的方法,將原來(lái)的17位數(shù)據(jù)編碼后變成34位數(shù)據(jù),實(shí)現(xiàn)快速曼徹斯特編碼。具體程序如下:
數(shù)據(jù)發(fā)送部分,在完成輸入數(shù)據(jù)寄存的同一個(gè)enc_clk上升沿時(shí)刻,若同步頭標(biāo)志位為“1”,則使能端en變?yōu)椤?”,在下一個(gè)enc_clk時(shí)鐘上升沿觸發(fā)計(jì)數(shù)器cnt開(kāi)始計(jì)數(shù),用于串行數(shù)據(jù)的發(fā)送。當(dāng)數(shù)據(jù)送入輸出寄存器data_out后,由計(jì)數(shù)器cnt確定發(fā)送位,開(kāi)始在時(shí)鐘上升沿時(shí)刻逐位發(fā)送數(shù)據(jù)。
曼徹斯特解碼模塊通過(guò)移位寄存器準(zhǔn)確匹配同步頭完成解碼,主要完成以下功能:(1)對(duì)接收的數(shù)據(jù)進(jìn)行存儲(chǔ);(2)對(duì)同步頭進(jìn)行檢測(cè),并進(jìn)行匹配和鎖定;(3)對(duì)同步頭以外的數(shù)據(jù)部分進(jìn)行曼徹斯特解碼,完成解碼后將串行數(shù)據(jù)再次轉(zhuǎn)換為并行數(shù)據(jù),并進(jìn)行奇偶校驗(yàn)。圖4為曼徹斯特解碼模塊的邏輯框圖。
圖4 曼徹斯特解碼模塊邏輯圖
同步頭檢測(cè)和鎖定是正確解碼的關(guān)鍵。為了保證采樣的準(zhǔn)確性,解碼模塊采用8 MHz的采樣時(shí)鐘。由于同步頭并非曼徹斯特波形,理論上只需檢測(cè)接收數(shù)據(jù)中是否存在與命令字/狀態(tài)字匹配的數(shù)據(jù),就可以判斷是否檢測(cè)到同步頭。但為了避免采樣時(shí)亞穩(wěn)態(tài)問(wèn)題或傳輸過(guò)程中可能存在的干擾影響,保證判定可靠,還需檢測(cè)同步頭之后的首位數(shù)據(jù)是否存在邊緣跳變,只有兩者同時(shí)成立時(shí)才能判定檢測(cè)到同步頭而完成匹配。因此接收端設(shè)置了24位的移位寄存器sync_shift_reg和8位的移位寄存器data_shift_reg,分別用于檢測(cè)同步頭及同步頭之后的首位曼徹斯特碼數(shù)據(jù)。兩個(gè)移位寄存器設(shè)置如下:
即,由時(shí)鐘觸發(fā),data_shift_reg接收的數(shù)據(jù)從低位輸入并向高位移動(dòng),data_shift_reg的最高位數(shù)據(jù)向sync_shift_reg的最低位移動(dòng),并不斷向sync_shift_reg高位移動(dòng)。結(jié)合解碼模塊采樣時(shí)鐘的設(shè)置,用于同步頭檢測(cè)的具體程序如下:
當(dāng)移位寄存器sync_shift_reg內(nèi)存儲(chǔ)的數(shù)據(jù)為“24’hFFF_000”或“24’h000_FFF”,且移位寄存器data_shift_reg的第2位和第6位相異,即存在邊沿跳變時(shí),則判定檢測(cè)到編碼模塊發(fā)送過(guò)來(lái)的同步頭,完成同步頭匹配并鎖定。
在解碼環(huán)節(jié),當(dāng)同步頭被匹配并鎖定后,開(kāi)始進(jìn)行曼徹斯特解碼。由于解碼模塊采樣時(shí)鐘頻率為8 MHz,是編碼模塊時(shí)鐘頻率的4倍。解碼模塊中對(duì)曼徹斯特編碼進(jìn)行采樣,每8次采樣代表未編碼原始數(shù)據(jù)的一位。利用移位寄存器data_shift_reg以及曼徹斯特編碼的特性,根據(jù)時(shí)鐘信號(hào)每移位8次取一次移位寄存器data_shift_reg最高位的方法,將原始數(shù)據(jù)還原并依次存入一個(gè)新的寄存器。同時(shí)利用計(jì)數(shù)器,當(dāng)計(jì)數(shù)器被計(jì)滿,所有數(shù)據(jù)被解碼還原后,對(duì)新寄存器中的數(shù)據(jù)進(jìn)行串行轉(zhuǎn)并行處理,然后輸出。
圖5為編碼模塊的仿真圖。編碼時(shí)鐘信號(hào)enc_clk頻率為2 MHz,復(fù)位信號(hào)rst_n低電平有效;tx_csw和tx_dw分別代表命令/狀態(tài)字和數(shù)據(jù)字標(biāo)志,當(dāng)tx_csw或tx_dw為“1”時(shí),代表發(fā)送數(shù)據(jù)為命令/狀態(tài)字或?yàn)閿?shù)據(jù)字;tx_dword為并行發(fā)送的數(shù)據(jù)內(nèi)容;tx_data為經(jīng)過(guò)曼徹斯特編碼后的數(shù)據(jù)內(nèi)容。
圖5 編碼模塊仿真結(jié)果
由圖5可知,當(dāng)tx_dw為“1”時(shí),同步頭輸出為“000111”(圖5中畫圈處)。當(dāng)輸入數(shù)據(jù)為“11000000000000001”,經(jīng)奇偶校驗(yàn)和曼徹斯特編碼后,輸出數(shù)據(jù)為“1010010101010101010101010 101011010”,實(shí)現(xiàn)了編碼模塊的功能。
圖6為解碼模塊的仿真圖。解碼時(shí)鐘信號(hào)dec_clk頻率為8 MHz;sync_csw和sync_dw分別為命令/狀態(tài)字和數(shù)據(jù)字同步頭的匹配標(biāo)志;rx_csw和rx_dw分別為接收端命令/狀態(tài)字和數(shù)據(jù)字標(biāo)志;dword_out為解碼過(guò)程中的數(shù)據(jù)變化,可以檢驗(yàn)解碼過(guò)程中數(shù)據(jù)的情況;data_sample為解碼過(guò)程的采樣時(shí)鐘;rx_dword_out為最終接收并解碼后的并行數(shù)據(jù);rx_done和rx_perr分別為接收完成標(biāo)志和校驗(yàn)錯(cuò)誤標(biāo)志。當(dāng)sync_dw輸出高電平脈沖時(shí),表示數(shù)據(jù)字同步頭匹配完成,可以進(jìn)行解碼;隨后采樣時(shí)鐘data_sample為上升沿時(shí),按照解碼規(guī)則采樣移位寄存器中的數(shù)據(jù),并存入新的寄存器中;最終采集的數(shù)據(jù)將全部送給rx_dword_out進(jìn)行并行輸出。當(dāng)rx_dword_out輸出最終解碼的數(shù)據(jù)“11000000000000001”后,數(shù)據(jù)字標(biāo)志rx_dw輸出高電平脈沖表示輸出為數(shù)據(jù)內(nèi)容,同時(shí)接收完成標(biāo)志rx_done輸出高電平脈沖表示完成解碼數(shù)據(jù)接收。校驗(yàn)錯(cuò)誤標(biāo)志rx_perr為低電平時(shí)表示沒(méi)有錯(cuò)誤。
圖6 解碼模塊仿真結(jié)果
本文對(duì)1553B總線的編碼和解碼模塊進(jìn)行了設(shè)計(jì)與改進(jìn)。改進(jìn)后的編碼模塊舍棄了傳統(tǒng)的逐位進(jìn)行曼徹斯特編碼的方式,采用寄存器按位統(tǒng)一編碼的方式,提高了整體的編碼效率。解碼模塊有效利用移位寄存器對(duì)數(shù)據(jù)進(jìn)行檢測(cè),完成同步頭匹配,實(shí)現(xiàn)了快速解碼并提高了解碼的可靠性。系統(tǒng)采用硬件描述語(yǔ)言實(shí)現(xiàn),經(jīng)軟件仿真測(cè)試符合設(shè)計(jì)要求,為后續(xù)系統(tǒng)的設(shè)計(jì)與改進(jìn)提供了基礎(chǔ)。