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