支亞軍, 蔣 林, 劉意先
(西安郵電學(xué)院電子工程學(xué)院,陜西 西安710061)
傳真通信中,需要把要掃描后的數(shù)據(jù)進(jìn)行 A/D轉(zhuǎn)換和二值化處理,轉(zhuǎn)化成表示連續(xù)黑白點(diǎn)的1/0數(shù)據(jù),再對(duì)該數(shù)據(jù)序列進(jìn)行編碼后發(fā)送。接收端對(duì)收到的編碼數(shù)據(jù)進(jìn)行譯碼,最后輸出到打印頭。傳真數(shù)據(jù)的編譯碼,是傳真通信關(guān)鍵技術(shù)之一。
一維改進(jìn)的Huffman碼(MHC)是在數(shù)據(jù)壓縮中較常使用的一種變長編碼。它是ITU-T.4標(biāo)準(zhǔn)中推薦的一維標(biāo)準(zhǔn)編碼方法,主要應(yīng)用于三類傳真機(jī)[1]。MHC編碼表是根據(jù)一組典型文件游程概率分布的統(tǒng)計(jì)均值構(gòu)造出來的,它的形成是由形成碼和終止碼組合實(shí)現(xiàn)的,能夠用較短的編碼來表示較長的連續(xù)黑點(diǎn)或白點(diǎn)。這樣,編碼后一行的數(shù)據(jù)量大為壓縮[2]。
對(duì)于MHC而言,首先它是一個(gè)變長碼,發(fā)送端在編碼時(shí)把游程長度所對(duì)應(yīng)的碼元數(shù)據(jù)不留間隙的存入發(fā)送緩沖區(qū)中,再調(diào)制載波后發(fā)送出去。接收端解調(diào)出來的數(shù)據(jù)就是編碼數(shù)據(jù),譯碼時(shí)從數(shù)據(jù)序列中分離出碼字,再根據(jù)編碼查找碼表中所對(duì)應(yīng)的游程長度,輸出到打印緩沖區(qū),就完成譯碼過程[3]。
MHC主要改進(jìn)的是將碼字分為終止碼和形成碼,0到63的游程長度用終止碼表示,64整數(shù)倍的游程長度由形成碼表示,任意游程長度大于63的碼字表示為“形成碼+終止碼”。例如,當(dāng)白游程長度為65(64+1)時(shí),編碼表示為11011 000111,即白游程長度64的形成碼11011加上白游程長度為1的終止碼000111。
EOL(End of Line)為行結(jié)束符,也為行同步標(biāo)志。每個(gè)EOL后面數(shù)據(jù)為本行的編碼,WRLC(White Run Length Coding)為白游程長度編碼,BRLC(Black Run Length Coding)為黑游程長度編碼,每一行的第一個(gè)游程長度編碼為白碼字,黑白游程長度碼字連續(xù)交替。收到連續(xù)的六個(gè)EOL后表示該頁結(jié)束。根據(jù)T.4的表述,一張編碼后的傳真數(shù)據(jù)格式如表1所示。
表1 傳真編碼數(shù)據(jù)格式
譯碼的基本思想,構(gòu)造出譯碼樹,把序列中所包含的所有碼字都分配到一個(gè)端點(diǎn)上。這樣一來,每一個(gè)碼字與樹圖編碼時(shí)類似,以碼字首位碼元開始,從樹根起上移一步,到達(dá)一級(jí)節(jié)點(diǎn),再以次位碼元為依據(jù),再上移到高一級(jí)節(jié)點(diǎn)上,繼續(xù)下去可達(dá)到端點(diǎn)節(jié)點(diǎn),即葉節(jié)點(diǎn),這樣就實(shí)現(xiàn)了碼字的分離。顯然,從樹根起每上移一級(jí)節(jié)點(diǎn),必須提供節(jié)點(diǎn)信息,即該節(jié)點(diǎn)是中間節(jié)點(diǎn)還是終端節(jié)點(diǎn)。為查詢方便,樹中的每一個(gè)節(jié)點(diǎn),分配一個(gè)地址,用來存放節(jié)點(diǎn)信息。在節(jié)點(diǎn)信息上還應(yīng)提供是形成碼節(jié)點(diǎn)還是終止碼節(jié)點(diǎn)。若是形成碼節(jié)點(diǎn),地址中存放的二進(jìn)制數(shù)據(jù)再乘以 64就是所譯出的游程長度;若為終止碼,地址中的值就是該碼子所對(duì)應(yīng)的游程長度。中間節(jié)點(diǎn)地址中存放的二進(jìn)制數(shù)據(jù)是下一步搜索地址信息即基址[4]。
顯然,要提高譯碼速度,可以采用多步合一的方法,減少查找碼表的次數(shù),也就是一次輸入多個(gè)碼元,根據(jù)碼表的特點(diǎn),對(duì)白譯碼而言,第一次可直接輸入4個(gè)碼元,對(duì)于黑譯碼,第一次可輸入2個(gè)碼元,隨后每次可輸入2個(gè)碼元或1個(gè)碼元。
根據(jù)MHC的特點(diǎn)和快速譯碼的思想,并采用地址散列的原理思想,構(gòu)造出簡單有效的譯碼表,每次譯碼時(shí)產(chǎn)生查表地址時(shí)鐘周期都是確定,適合于在FPGA上進(jìn)行傳真譯碼的電路設(shè)計(jì)。譯碼表中的節(jié)點(diǎn)按類型可分為表2中的5類。
表2 節(jié)點(diǎn)類型說明
中間碼下次譯碼時(shí)會(huì)產(chǎn)生新的子節(jié)點(diǎn),其中第一種根據(jù)下步要進(jìn)的兩個(gè)碼元會(huì)有四種可能:00,01,10和 11,所以對(duì)子節(jié)點(diǎn)分配連續(xù)的四個(gè)地址,且從地址最低位 10開始分配;第二種根據(jù)下步要進(jìn)的碼元有兩種可能:0和 1,需要連續(xù)的兩個(gè)地址,并且從地址最低位為 00的地址空間開始分配。這樣才符合對(duì)節(jié)點(diǎn)位置和屬性的描述并且滿足下步搜索所需要的地址結(jié)構(gòu)。每4個(gè)地址空間或2個(gè)地址空間都采用地址散列的思想,即對(duì)于本次中間節(jié)點(diǎn)中的數(shù)據(jù)其實(shí)就是一個(gè)未被分配的地址。由于白碼表和黑碼表中碼子個(gè)數(shù)都一樣多,再加上中間節(jié)點(diǎn),可以確定碼表的大小?;谝陨系姆治?,對(duì)白碼表和黑碼表都分配256*8的存儲(chǔ)單元。
以白譯碼表為例,第一次譯碼可先進(jìn)四位碼元,所以最開始會(huì)有16種可能的碼字0000~1111,它們分別對(duì)應(yīng)地址為00000000~00001111,即將初始碼型高位補(bǔ)零形成8位地址。輸出對(duì)應(yīng)地址中的數(shù)據(jù),如果該數(shù)據(jù)的最低兩位為“10”,表示下次來兩個(gè)碼元后再譯碼,當(dāng)下次來的碼元00、01、10或11,直接與當(dāng)前數(shù)據(jù)相加,即為下次譯碼地址,通過該地址讀出數(shù)據(jù)。
譯碼時(shí),需先進(jìn)行并串轉(zhuǎn)換,串行數(shù)據(jù)再送給譯碼模塊。譯出碼字后送該數(shù)據(jù)到游程輸出模塊,該模塊完成代表黑白點(diǎn)的1/0數(shù)據(jù)的輸出,再送往行數(shù)據(jù)打印緩沖區(qū)。系統(tǒng)模塊如圖1所示。
圖1 傳真譯碼電路框
譯碼模塊是傳真譯碼電路的部分,對(duì)接收的串行數(shù)據(jù)譯碼。先檢測EOL行同步標(biāo)識(shí),當(dāng)確認(rèn)EOL后,再對(duì)碼元進(jìn)行譯碼。白碼字和黑碼字進(jìn)行譯碼是不同的,對(duì)應(yīng)于兩個(gè)不同的譯碼表。當(dāng)譯白碼字時(shí)(對(duì)于每行第一個(gè)碼元數(shù)據(jù)必須為白碼字),首先接收4 bit數(shù)據(jù),形成8 bit地址,根據(jù)這個(gè)地址查找白譯碼表存儲(chǔ)空間并返回一個(gè)8 bit數(shù)據(jù),判斷這組數(shù)據(jù)的最低兩位標(biāo)志位的值來執(zhí)行下一步操作。
當(dāng)最低兩位為‘00’時(shí),再接收一位數(shù)據(jù)后和 data_8相加并形成新地址,再查找譯碼表;當(dāng)最低兩位為‘10’時(shí),表示連續(xù)接收2 bit數(shù)據(jù),和data_8相加,形成新地址,再查找譯碼表,依次重復(fù)執(zhí)行操作,直到譯出該碼字或譯碼出錯(cuò)。當(dāng)data_8的最低兩位為‘01’時(shí),輸出數(shù)據(jù)高6 bit的值,并輸出終止碼數(shù)據(jù)有效使能信號(hào);當(dāng)data_8的最低兩位為‘11’時(shí),輸出數(shù)據(jù)高6 bit的值,并輸出形成碼數(shù)據(jù)有效使能信號(hào)。
黑譯碼時(shí),其譯碼過程和白譯碼基本相同。不同之處在于:首先接收2 bit碼元數(shù)據(jù),形成8 bit地址,根據(jù)這個(gè)地址來查找黑碼表中對(duì)應(yīng)的數(shù)據(jù),再判斷數(shù)據(jù)的標(biāo)志位,執(zhí)行相應(yīng)操作。直至譯出碼字或譯碼出錯(cuò)。譯碼過程中先檢測EOL序列,之后執(zhí)行白譯碼、黑譯碼,白譯碼交替譯碼操作。對(duì)于該過程采用有限狀態(tài)機(jī)來描述實(shí)現(xiàn),見圖2。
游程轉(zhuǎn)換模塊完成對(duì)譯碼輸出的6 bit數(shù)據(jù)轉(zhuǎn)換,串行輸出該碼字對(duì)應(yīng)的連續(xù)黑點(diǎn)或連續(xù)白點(diǎn)的個(gè)數(shù)。當(dāng)終止碼數(shù)據(jù)使能有效時(shí),把對(duì)應(yīng)的6 bit數(shù)據(jù)進(jìn)行轉(zhuǎn)換,串行輸出連續(xù)的“1”或“0”;當(dāng)形成碼數(shù)據(jù)使能有效時(shí),6 bit數(shù)據(jù)表示有多少個(gè)64個(gè)連續(xù)的表示黑點(diǎn)或白點(diǎn)的“1”或“0”,最多連續(xù)輸出1728個(gè)點(diǎn)。每1個(gè)點(diǎn)的輸出需要一個(gè)時(shí)鐘周期。例如,當(dāng)本次白譯碼時(shí),終止碼對(duì)應(yīng)的6 bit數(shù)據(jù)為“001000”,則輸出連續(xù)8個(gè)“0”序列;黑譯碼時(shí)就輸出連續(xù)的“1”序列,并輸出數(shù)據(jù)有效使能信號(hào)。
行數(shù)據(jù)打印緩沖區(qū)負(fù)責(zé)接收“0”或“1”序列,由系統(tǒng)時(shí)鐘打入由一個(gè)FIFO緩沖區(qū),大小設(shè)定為存儲(chǔ)兩行的數(shù)據(jù)。當(dāng)存儲(chǔ)數(shù)據(jù)滿一行時(shí),串行輸出到打印頭打印。整個(gè)譯碼電路采用異步復(fù)位和全局同步時(shí)鐘設(shè)計(jì),時(shí)鐘頻率為50 MHz。兩個(gè)碼表的設(shè)計(jì)由ROM單元的IP核定制生成,只輸入構(gòu)造的碼表數(shù)據(jù)。在QuartusII開發(fā)環(huán)境中采用Verilog HDL硬件語言描述電路設(shè)計(jì)。
圖 2 譯碼狀態(tài)
該電路在QuartusII環(huán)境下進(jìn)行功能仿真驗(yàn)證[5]。由于碼表數(shù)據(jù)的生成采用軟件方案實(shí)現(xiàn)并進(jìn)行過軟件測試,所以功能仿真主要對(duì)各種碼元類型的組合情況和譯碼狀態(tài)進(jìn)行驗(yàn)證,并查看輸出波形圖,結(jié)果均與設(shè)計(jì)要求一致。
對(duì)于連續(xù)32個(gè)白點(diǎn)和黑點(diǎn)的編碼數(shù)據(jù),先進(jìn)行白譯碼,連續(xù)32個(gè)時(shí)鐘周期輸出出‘0’數(shù)據(jù)和數(shù)據(jù)有效標(biāo)識(shí),下次輸入表示32個(gè)黑點(diǎn)的編碼數(shù)據(jù),譯出數(shù)據(jù)為連續(xù)32個(gè)‘1’,圖3為仿真結(jié)果。
圖3 仿真部分波形
針對(duì)Cyclone的FPGA器件庫,綜合該譯碼電路,時(shí)序報(bào)告滿足設(shè)計(jì)要求,面積報(bào)告顯示僅使用了 300多個(gè)LE(Logic Element)和6000多Memory bits。把綜合后生成的網(wǎng)表文件、延時(shí)文件和FPGA器件庫放到Modelsim環(huán)境中進(jìn)行時(shí)序仿真,仿真結(jié)果與功能仿真一致,滿足設(shè)計(jì)要求。
最后,在QuartusII環(huán)境下,通過SOPC配置CPU核,把該電路當(dāng)做 CPU的外圍模塊,下載到 ALTERA 公司的Cyclone 系列器件 EP1C20F400C7開發(fā)板上。CPU核與該電路模塊通過PIO端口連接,在NiosII開發(fā)環(huán)境中使用軟件測試該電路系統(tǒng)。CPU核向電路寫入數(shù)據(jù)和使能信號(hào),待輸出標(biāo)識(shí)位數(shù)據(jù)有效后,再讀出譯碼后數(shù)據(jù)。測試結(jié)果表明,對(duì)寫入正確的編碼數(shù)據(jù)都能讀出正確譯碼結(jié)果;對(duì)異常的編碼能正確處理,讀出結(jié)果和預(yù)期一致,電路連續(xù)譯碼工作正常。
本文通過對(duì)傳真譯碼原理深入分析,結(jié)合FPGA的特點(diǎn)提出一種新的MHC碼表構(gòu)造方法,并在QuartusII開發(fā)環(huán)境下設(shè)計(jì)實(shí)現(xiàn)了傳真譯碼電路。仿真測試結(jié)果表明該電路工作穩(wěn)定,譯碼速度快并且占用很少的資源。與早期的傳真譯碼電路設(shè)計(jì)相比集成度和工作頻率更高;與目前的傳真芯片相比,易于添加傳真機(jī)的硬件功能,縮短開發(fā)周期,前景廣闊。
[1] International Telecommunication Union,T.4(200),Standardization of Group 3 facsimile terminals for document transmission[S].Switzerland Geneva:3-11.
[2] 劉立柱.數(shù)字傳真通信[M].成都:電子科技大學(xué)出版社,2000:169-171.
[3] 劉立柱.傳真圖像和傳真信號(hào)處理原理與技術(shù)[M].北京:國防工業(yè)出版社,2006:58-66.
[4] 劉意先,韓俊剛,支亞軍.基于 MHC快速譯碼算法的譯碼樹的構(gòu)造方法[J].通信技術(shù),2009,42(07):28-30.
[5] 魏建英,葉玉堂,吳云峰,等.基于FPGA的超長CIS圖像采集系統(tǒng)[J].通信技術(shù),2009,42(02):298-300.