韓美林 喬成芳
(商洛學(xué)院電子信息與電氣工程學(xué)院 商洛 726000)
關(guān)鍵字 解復(fù)用電路;成幀器;幀頭字符定位
從高速的串行數(shù)據(jù)中恢復(fù)出來(lái)的不同類型的數(shù)據(jù)只是按照順序以各自的bit寬度重新放置,并沒(méi)有按照正確的幀格式字節(jié)對(duì)齊,導(dǎo)致后續(xù)電路無(wú)法直接使用這樣的數(shù)據(jù),所以成幀器是尋找標(biāo)準(zhǔn)幀格式起始位置的關(guān)鍵電路[5]。
光傳送網(wǎng)的幀格式是一個(gè)4行×4080字節(jié)的塊狀幀結(jié)構(gòu),其中第1列至第16列字節(jié)是開銷字節(jié),第17列至第3824列字節(jié)是凈荷數(shù)據(jù),第3825列至第 4080列字節(jié)是前向糾錯(cuò)(FEC)編碼數(shù)據(jù)[6]。G.709規(guī)定,幀定位開銷字節(jié)是一個(gè)OTUk/ODUk幀的起始字節(jié),占用OTUk/ODUk幀結(jié)構(gòu)的第1行的前7個(gè)字節(jié),第一行的1到6個(gè)字節(jié)為幀定位開銷(FAS),這6個(gè)字節(jié)的內(nèi)容為“0xF6F6F6282828”,第七個(gè)字節(jié)為復(fù)幀定位MFAS復(fù)幀定位開銷(MFAS)[7]。
OTU2字符定位檢測(cè)就是要從64bit數(shù)據(jù)中找到FAS(0xF6F6F6282828),考慮到OTU2信號(hào)是由SFI4.2接口中的串并轉(zhuǎn)換單元不考慮數(shù)據(jù)幀頭的位置隨機(jī)將相鄰64bit數(shù)據(jù)劃分在一起輸出的[8],所以連續(xù)的48bit幀頭數(shù)據(jù)可能處在一個(gè)時(shí)鐘周期的64bit數(shù)據(jù)中,也可能處在兩個(gè)時(shí)鐘周期的64bit數(shù)據(jù)之間。所以首先把第一個(gè)時(shí)鐘周期的64bit數(shù)據(jù)緩存,再與下一個(gè)周期的64bit組合成128bit數(shù)據(jù)[9]。通過(guò)比較器與128bit數(shù)據(jù)比較,最終檢測(cè)出固定的48bit幀頭數(shù)據(jù)。具體實(shí)現(xiàn)結(jié)構(gòu)如圖1所示。
圖1 OTU2_64bit的幀頭字符檢測(cè)模塊結(jié)構(gòu)圖
如圖1所示,首先將第一個(gè)時(shí)鐘周期的64bit數(shù)據(jù)緩存再與下一個(gè)周期的64bit數(shù)據(jù)組合為128bit的join_data數(shù)據(jù);其次,在128bit數(shù)據(jù)里找48bit幀頭時(shí)先將0x28與join_data的第16位到第23位逐一進(jìn)行比較,如果比較結(jié)果為高則在join_data出現(xiàn)0x28的位置向前繼續(xù)與0x2828進(jìn)行比較,如果比較結(jié)果為高則在join_data出現(xiàn)0x282828的位置逐一向前繼續(xù)與0xf6f6進(jìn)行比較,如果比較結(jié)果為高則在join_data出現(xiàn)0xf6f6282828的位置逐一向前繼續(xù)與0xf6進(jìn)行比較,如果結(jié)果為高則鎖定數(shù)據(jù),將其看做為幀頭數(shù)據(jù),并給出幀頭指示信號(hào)check_1st。根據(jù)給出的幀頭指示信號(hào)將行列指示清零重新進(jìn)行計(jì)數(shù)[10]。如果其中有一次比較結(jié)果為低則從比較結(jié)果為低的位置向前重新開始比較,直到找到幀頭。
找到幀頭指示信號(hào)后,需要通過(guò)幀頭同步來(lái)確定是否是數(shù)據(jù)流的正確幀頭。通過(guò)分析得知幀同步過(guò)程中有幀丟失、幀失步、和重新發(fā)現(xiàn)幀頭等多種可能性,考慮到這點(diǎn)所以此電路設(shè)計(jì)采用有限狀態(tài)機(jī)來(lái)實(shí)現(xiàn)其包含的所有狀態(tài)[11]。如圖2所示為各個(gè)狀態(tài)跳轉(zhuǎn)的狀態(tài)轉(zhuǎn)移圖。
圖2 OTU2_64bit的幀同步狀態(tài)轉(zhuǎn)移圖
幀同步狀態(tài)轉(zhuǎn)移圖所有狀態(tài)的具體含義為
1)幀丟失狀態(tài):電路在復(fù)位狀態(tài)下處于幀丟失狀態(tài),通過(guò)幀頭檢測(cè)模塊給出的幀頭使能信號(hào)與行列指示信號(hào)來(lái)判斷是否進(jìn)入下一狀態(tài)。如果幀頭使能信號(hào)為高且?guī)^位置在第一行第一列則進(jìn)入找到幀頭狀態(tài),否則一直保持幀丟失狀態(tài)。
2)找到幀頭狀態(tài):電路處于找到幀頭狀態(tài)后,在下一幀幀頭位置繼續(xù)檢測(cè)是否為幀頭,如果連續(xù)三次在幀頭位置都能找到幀頭則進(jìn)入到幀同步狀態(tài),否則返回到幀丟失狀態(tài),重新開始檢測(cè)幀頭。
3)幀同步狀態(tài):在幀同步狀態(tài)時(shí)電路一直處于幀同步狀態(tài)直到在幀格式的起始位置沒(méi)有檢測(cè)到幀頭指示信號(hào),則進(jìn)入到幀失步狀態(tài)。
4)幀失步狀態(tài):在幀失步狀態(tài)時(shí),繼續(xù)在前同步狀態(tài)的幀格式起始位置尋找?guī)^,如果三次及三次以內(nèi)重新找到幀頭則電路進(jìn)入幀同步狀態(tài),否則進(jìn)入幀丟失狀態(tài)[12]。
本狀態(tài)機(jī)是根據(jù)G.709的幀格式設(shè)計(jì)出來(lái)的,因?yàn)镺TU2、ODU1、ODU0的幀格式本質(zhì)相同,所以O(shè)TU2、ODU1、ODU0的幀同步電路狀態(tài)機(jī)基本一致,此處不再說(shuō)明。
ODU1的幀頭字符檢測(cè)設(shè)計(jì)與OTU2的幀頭字符檢測(cè)設(shè)計(jì)最大的不同在于輸出的數(shù)據(jù)比特位寬度不同,OTU2一個(gè)時(shí)鐘周期輸出64bit數(shù)據(jù),ODU1一個(gè)時(shí)鐘周期輸出16bit數(shù)據(jù),這使得ODU1幀頭字符檢測(cè)設(shè)計(jì)與OTU2的幀頭字符檢測(cè)設(shè)計(jì)有所不同[13]。
ODU1一個(gè)時(shí)鐘周期輸出16bit數(shù)據(jù),則至少需要三個(gè)時(shí)鐘周期才可以找到FAS(0xF6F6F6282828),考慮到數(shù)據(jù)的連續(xù)性,將輸出的ODU1數(shù)據(jù)進(jìn)行數(shù)據(jù)的組合[14]。具體實(shí)現(xiàn)結(jié)構(gòu)如圖3所示。
圖3 ODU1_16bit的幀頭字符檢測(cè)模塊結(jié)構(gòu)圖
如圖3所示,將ODU1輸入數(shù)據(jù)延遲一個(gè)節(jié)拍再與下一節(jié)拍輸入數(shù)據(jù)拼接為32bit的join_data0數(shù)據(jù),再將join_data0數(shù)據(jù)與下一節(jié)拍輸入數(shù)據(jù)拼接為48bit的join_data1數(shù)據(jù),最后將join_data1數(shù)據(jù)與下一節(jié)拍輸入數(shù)據(jù)拼接為64bit的join_data2數(shù)據(jù),最終完成數(shù)據(jù)的拼接,為找?guī)^檢測(cè)電路提供數(shù)據(jù)的連續(xù)性[15]。幀頭檢測(cè)首先采用16位的比較器比較data_in與0x28是否一致,其次用32位的比較器比較join_data0的8至32位的數(shù)據(jù)是否與0x2828一致,再次用48位的比較器比較join_data1的24~47位的數(shù)據(jù)是否與0xF6F6一致,然后用64位的比較器比較join_data2的40至55位的數(shù)據(jù)是否與0xF6一致,最后將這幾個(gè)比較器的比較結(jié)果相與,如果為高則檢測(cè)到幀頭數(shù)據(jù),如果為低則沒(méi)有檢測(cè)到幀頭數(shù)據(jù)。
ODU0_8bit的幀頭字符檢測(cè)模塊的設(shè)計(jì)與ODU1的幀頭字符檢測(cè)模塊的設(shè)計(jì)方法一致,此處不再說(shuō)明。
如圖4為OTU2成幀器的幀頭字符定位檢測(cè)和幀同步電路仿真結(jié)果圖。data_in表示幀頭字符定位檢測(cè)的輸入數(shù)據(jù),join_data為128bit的拼接數(shù)據(jù),check_1st置高表示找到幀頭,combine_data表示找到幀頭后輸出的數(shù)據(jù),line和colunm分別表示輸出數(shù)據(jù)的行列指示。從圖中可以看出當(dāng)check_1st為高時(shí)行列指示全部清零重新開始計(jì)數(shù),并且將join_data中拼接的幀頭信息找到后提取出來(lái)作為combine_data數(shù)據(jù)的第一行第一列為幀頭數(shù)據(jù)“f6f6f6282828xxxx”。data_in_0表示幀同步的輸入數(shù)據(jù),state為四種狀態(tài)轉(zhuǎn)移信號(hào),check_1st為高表示找到幀頭,data_out為OTU2成幀后的數(shù)據(jù)輸出,line和colunm分別表示輸出數(shù)據(jù)的行列指示。從圖中可以看出當(dāng)找到幀頭時(shí)行列指示清零開始重新計(jì)數(shù),幀頭位置數(shù)據(jù)為“f6f6f6282828xxxx”。
如圖5為ODU1成幀器的幀頭字符定位檢測(cè)和幀同步電路仿真結(jié)果圖。read_en_gap為ODU1時(shí)鐘的使能信號(hào),data_in表示幀頭字符定位檢測(cè)的輸入數(shù)據(jù),join_data0、join_data1、join_data2分別為輸入數(shù)據(jù)的拼接,check_out置高表示找到幀頭,com?bine_data表示找到幀頭后輸出的數(shù)據(jù),line和col?unm分別表示輸出數(shù)據(jù)的行列指示。從圖中可以看出當(dāng)check_out為高時(shí)行列指示全部清零重新開始計(jì)數(shù),并且將join_data2中拼接的幀頭信息找到后提取出來(lái)作為combine_data數(shù)據(jù)的第一行第一列為幀頭數(shù)據(jù)的起始數(shù)據(jù)。data_in1表示幀同步的輸入數(shù)據(jù),state為四種狀態(tài)轉(zhuǎn)移信號(hào),check_out為高表示找到幀頭,data_out為ODU1成幀后的數(shù)據(jù)輸出,line和colunm分別表示輸出數(shù)據(jù)的行列指示。從圖中可以看出當(dāng)找到幀頭時(shí)行列指示清零開始重新計(jì)數(shù)。
圖4 OTU2成幀器的幀頭字符定位檢測(cè)和幀同步電路仿真結(jié)果圖
圖5 ODU1成幀器的幀頭字符定位檢測(cè)和幀同步電路仿真結(jié)果圖
本文設(shè)計(jì)的成幀器模塊完成的主要功能是從輸入的OTU2或ODUK數(shù)據(jù)單元中找到處于任意位置的固定48bit數(shù)據(jù),找到固定的48bit數(shù)據(jù)后判斷是否是合法的幀頭,如果合法則給出行列指示,否則重新進(jìn)行查找。對(duì)于不在數(shù)據(jù)格式首位的幀頭進(jìn)行數(shù)據(jù)重排并校正行列指示,再進(jìn)行后續(xù)處理。有效地解決了解復(fù)用處理電路中沒(méi)有按照正確的幀格式字節(jié)對(duì)齊的數(shù)據(jù)所帶來(lái)的問(wèn)題。通過(guò)仿真結(jié)果表明,該電路能夠準(zhǔn)確地完成幀頭字符定位檢測(cè)。