基于verilog實現(xiàn)哈夫曼編碼的新方法
作者 / 賈先韜 張旭 劉澤曦 山東大學 物理學院(山東 濟南 250100)
本文引用地址:http://cafeforensic.com/article/201711/372158.htm*大學生集成電路創(chuàng)新創(chuàng)業(yè)大賽全國總決賽三等獎
摘要:傳統(tǒng)的硬件實現(xiàn)哈夫曼編碼的方法主要有:預先構造哈夫曼編碼表,編碼器通過查表的方法輸出哈夫曼編碼[1];編碼器動態(tài)生成哈夫曼樹,通過遍歷節(jié)點方式獲取哈夫曼編碼[2-3]。第一種方法從平均碼長角度看,在很多情況下非最優(yōu);第二種方法需要生成完整的哈夫曼樹,會產(chǎn)生大量的節(jié)點,且需遍歷哈夫曼樹獲取哈夫曼編碼,資源占用多,實現(xiàn)較為麻煩。本文基于軟件實現(xiàn)[4]時,使用哈夫曼樹,會提出一種適用于硬件并行實現(xiàn)的新數(shù)據(jù)結構——字符池,通過對字符池的頻數(shù)屬性比較和排序來決定各個字符節(jié)點在字符池中的歸屬。配置字符池的同時逐步生成哈夫曼編碼,可以提高硬件利用率,并且無需額外操作來提取哈夫曼編碼。
引言
哈夫曼(Huffman)編碼對出現(xiàn)頻率較高的字符采用較短的編碼,對出現(xiàn)頻率較低的字符采用較長的編碼,它可以保證平均碼長最短,具有較高的編碼效率。因而哈夫曼編碼被廣泛應用于數(shù)據(jù)壓縮領域。已有的硬件實現(xiàn)方法包括預先構造哈夫曼編碼表和模仿軟件實時生成完整哈夫曼樹兩種。前一種方法在大多數(shù)情況下不是最優(yōu)編碼,后一種方法不僅需要生成大量節(jié)點,而且需要額外硬件模塊實現(xiàn)遍歷節(jié)點操作。針對這些問題,本文提出一種新的適用于硬件實現(xiàn)的數(shù)據(jù)結構——字符池來對輸入數(shù)據(jù)實時生成哈夫曼編碼。
1 哈夫曼編碼的原理
哈夫曼編碼是一種不等長編碼,根據(jù)每個字符出現(xiàn)頻率進行編碼,每個字符的編碼不能是其他字符編碼的前綴,所有字符編碼總長度相比原碼而言將會降低。
2 哈夫曼編碼硬件總體實現(xiàn)方案
本文采用自頂而下的設計方式??傮w框架由一個頂層模塊、接收模塊、計算模塊、輸出模塊和FIFO模塊構成。頂層模塊由其余4個模塊連接而成,系統(tǒng)總體結構如圖1所示。
接收模塊:接收數(shù)據(jù)源并分類統(tǒng)計各字符出現(xiàn)的頻數(shù),數(shù)據(jù)接收完成后,接收模塊向計算模塊發(fā)送開始計算信號。計算模塊進行計算,生成各字符對應的編碼值,做成編碼表,結束后向輸出模塊發(fā)送輸出信號。最后輸出模塊通過查表方式輸出各字符的編碼值以及哈夫曼編碼結果。FIFO模塊用于接收原始數(shù)據(jù)和向輸出模塊提供數(shù)據(jù)源。
3 實現(xiàn)流程
本文使用verilog語言在vivado平臺上進行哈夫曼編碼硬件模塊的實現(xiàn),選用器件為xc7a100tcsq324-1。
3.1 FIFO模塊
本文的FIFO模塊使用vivado的IP核生成,設計時選擇好相應參數(shù)配置,生成verilog文件后即可直接調(diào)用。
3.2 輸入模塊
使用多個計數(shù)器對輸入各字符頻數(shù)以及輸入字符總量進行計數(shù),頻數(shù)被存放在寄存器中,當字符輸入結束(例如輸入字符總量達到了約定值)時,輸入模塊向計算模塊輸出計算開始信號,同時頻數(shù)寄存器中的數(shù)據(jù)被并行輸出至計算模塊。
3.3 計算模塊
3.3.1 新數(shù)據(jù)結構及對應的硬件實現(xiàn)
本文基于哈夫曼樹的思想構建了新的數(shù)據(jù)結構——字符池用于硬件實現(xiàn)哈夫曼編碼。根據(jù)n種字符構建n個字符池和n個字符節(jié)點。每個字符池包含一個屬性:包含的所有字符的頻數(shù)之和。每個字符節(jié)點包含以下屬性:所屬字符池序號、自身編碼值和自身編碼長度。因此,定義n個寄存器記錄字符節(jié)點對應的字符池序號、n個寄存器記錄編碼值、n個寄存器記錄編碼長度以及n個寄存器記錄字符池的頻數(shù)。
3.3.2 哈夫曼編碼計算流程
進行哈夫曼編碼計算時,計算模塊通過執(zhí)行循環(huán)操作完成各字符編碼的生成以及字符在字符池中的移動。以圖2中的實例描述計算流程。
圖2中共有5種字符,各自頻數(shù)為:“0”:5,“1”:10,“2”:20,“3”:30,“4”:35。
圖2(a)為初始化效果,此時每個字符池包含一個字符,每個字符池的頻數(shù)恰為那個字符的頻數(shù);每個字符的編碼值和編碼長度清零。圖2(a)到圖2(d)共經(jīng)過4次循環(huán)操作,最終可以從圖2(d)中讀取出每個字符的編碼值和編碼長度,“0”編碼值為0011,“1”編碼值為1011,“2”編碼值為111,“3”編碼值為01,“4”編碼值為0。
每次循環(huán)操作包含排序、挑選、最小值和次小值求和、頻數(shù)更新、字符移動、編碼值更新及編碼長度更新8步。其中前4步按順序完成,然后同時完成后4步??傃h(huán)次數(shù)由字符種類數(shù)控制。
排序操作功能是將每個節(jié)點池的頻數(shù)從小到大進行排序,本文借鑒了參考文獻[5]中的方法,硬件實現(xiàn)時通過構建比較器陣列將每兩個數(shù)兩兩比較,再通過加法器對每個字符頻數(shù)的比較結果求和。對一個字符頻數(shù),若它小于另一個字符的頻數(shù),則相應結果為0,否則為1。那么通過指定字符頻數(shù)與其他字符頻數(shù)的比較結果之和可以得知它的頻數(shù)在所有頻數(shù)中的位置。
挑選操作是將排序操作中比較結果為0和1對應的字符頻數(shù)選出,它們代表最小頻數(shù)和次小頻數(shù),挑選操作同時挑選出這兩個頻數(shù)對應的字符池ID。硬件實現(xiàn)時構建多個比較器,將比較結果之和與0和1比較,再通過多路復用器從多個頻數(shù)和字符池ID中準確挑選出所需的值。例如在圖2(b)中,挑選出的兩個頻數(shù)為15和20,它們對應字符池ID為1和2。
接下來的最小值和次小值求和操作就是將挑選操作挑選出的最小頻數(shù)和次小頻數(shù)求和,然后輸出。此步驟硬件實現(xiàn)時需要一個多位加法器。例如在圖2(b)中,求和值為15+20=35。
頻數(shù)更新操作指根據(jù)挑選操作挑選出的結果進行字符池頻數(shù)的更新。按照本文約定方法,將最小頻數(shù)對應字符池的頻數(shù)更新成無效值,無效值應大于所有可能的頻數(shù),它的目的是避免此字符池的頻數(shù)被接下來的循環(huán)挑選操作挑選出。本文將次小頻數(shù)對應字符池的頻數(shù)以求和操作的加法結果替代。例如圖2(c)中1號字符池頻數(shù)變成100,2號字符池頻數(shù)變成35。
字符移動操作指將特定字符從一個字符池移動到另一個字符池中。按照本文約定方法,將最小頻數(shù)對應字符池的所有字符移動到次小頻數(shù)對應字符池中。例如將圖2(c)和圖2(b)對比可發(fā)現(xiàn)1號字符池的字符“0”和“1”被移動到了2號字符池中。
編碼值、編碼長度更新操作中,按本文約定方法,將最小頻數(shù)對應字符池的所有字符編碼值左移1位并在最后一位補0,長度加1。將次小頻數(shù)對應字符池的所有字符編碼值左移1位并在最后一位補1,長度加1。將圖2(c)和圖2(b)對比可看出,字符“0”的編碼值從0變成00,“1”編碼值從1變成10,“2”編碼值從無變成1。
所有循環(huán)結束后編碼表已生成,計算模塊向輸出模塊發(fā)送計算結束信號。
3.4 輸出模塊
輸出模塊負責從FIFO中讀取出原始數(shù)據(jù)、從編碼表中獲取編碼值,再通過并串轉(zhuǎn)換以一位數(shù)據(jù)口首先輸出各字符編碼值,再輸出字符串編碼結果。
4 仿真和調(diào)試
本文使用vivado對頂層模塊進行綜合實現(xiàn),通過實現(xiàn)后仿真驗證 結果正確性。
圖3展示了模塊輸入時序。本文測試時以huf_in_start高電平脈沖標志數(shù)據(jù)輸入開始,實際數(shù)據(jù)以4為并口輸入,測試字符范圍為“0”至“9”。
圖4展示了模塊輸出時序。通過huf_out_start高電平脈沖表明輸出開始。首先輸出各字符編碼序列,包含4bit編碼長度和實際編碼值,然后輸出原始字符串的編碼值。huf_out_end高電平脈沖表明輸出結束。
圖5為vivado控制臺輸出,它展示了各字符編碼值以及原始字符和testbench進行的解碼字符比較,說明模塊正常運行。
5 結論
本文提出了一種新的在硬件上實現(xiàn)哈夫曼編碼的方法,利用本文的字符池數(shù)據(jù)結構,對每次輸入的數(shù)據(jù)實時生成哈夫曼編碼表,從平均碼長角度保證了編碼的最優(yōu),同時避免了生成完整的哈夫曼樹,減少了資源占用,并避免了遍歷哈夫曼樹所需的額外操作,實現(xiàn)方便快捷。
參考文獻:
[1]鄧麗娟,田金文,柳健,等.哈夫曼編碼器IP核的設計與實現(xiàn)[J].微電子學與計算機,2005(02):9-12.
[2]張穎超.基于FPGA的Huffman編碼并行實現(xiàn)及高速存儲系統(tǒng)設計[D].長安大學,2015.
[3]曾英,鄧曙光.基于FPGA的Huffman編碼器的設計[J].湖南城市學院學報(自然科學版), 2014(01):32-35.
[4]楊蘭.基于C語言的哈夫曼編碼的實現(xiàn)[J].軟件導刊,2012(09):40-42.
[5]師廷偉,金長江.基于FPGA的并行全比較排序算法[J].數(shù)字技術與應用,2013(10):126-127.
本文來源于《電子產(chǎn)品世界》2017年第12期第40頁,歡迎您寫論文時引用,并注明出處。
評論