基於verilog實現哈夫曼編碼的新方法

2021-01-08 電子產品世界

作者 / 賈先韜 張旭 劉澤曦 山東大學 物理學院(山東 濟南 250100)

本文引用地址:http://www.eepw.com.cn/article/201711/372158.htm

*大學生集成電路創新創業大賽全國總決賽三等獎

摘要:傳統的硬體實現哈夫曼編碼的方法主要有:預先構造哈夫曼編碼表,編碼器通過查表的方法輸出哈夫曼編碼[1];編碼器動態生成哈夫曼樹,通過遍歷節點方式獲取哈夫曼編碼[2-3]。第一種方法從平均碼長角度看,在很多情況下非最優;第二種方法需要生成完整的哈夫曼樹,會產生大量的節點,且需遍歷哈夫曼樹獲取哈夫曼編碼,資源佔用多,實現較為麻煩。本文基於軟體實現[4]時,使用哈夫曼樹,會提出一種適用於硬體並行實現的新數據結構——字符池,通過對字符池的頻數屬性比較和排序來決定各個字符節點在字符池中的歸屬。配置字符池的同時逐步生成哈夫曼編碼,可以提高硬體利用率,並且無需額外操作來提取哈夫曼編碼。

引言

  哈夫曼(Huffman)編碼對出現頻率較高的字符採用較短的編碼,對出現頻率較低的字符採用較長的編碼,它可以保證平均碼長最短,具有較高的編碼效率。因而哈夫曼編碼被廣泛應用於數據壓縮領域。已有的硬體實現方法包括預先構造哈夫曼編碼表和模仿軟體實時生成完整哈夫曼樹兩種。前一種方法在大多數情況下不是最優編碼,後一種方法不僅需要生成大量節點,而且需要額外硬體模塊實現遍歷節點操作。針對這些問題,本文提出一種新的適用於硬體實現的數據結構——字符池來對輸入數據實時生成哈夫曼編碼。

1 哈夫曼編碼的原理

  哈夫曼編碼是一種不等長編碼,根據每個字符出現頻率進行編碼,每個字符的編碼不能是其他字符編碼的前綴,所有字符編碼總長度相比原碼而言將會降低。

2 哈夫曼編碼硬體總體實現方案

  本文採用自頂而下的設計方式。總體框架由一個頂層模塊、接收模塊、計算模塊、輸出模塊和FIFO模塊構成。頂層模塊由其餘4個模塊連接而成,系統總體結構如圖1所示。

  接收模塊:接收數據源並分類統計各字符出現的頻數,數據接收完成後,接收模塊向計算模塊發送開始計算信號。計算模塊進行計算,生成各字符對應的編碼值,做成編碼表,結束後向輸出模塊發送輸出信號。最後輸出模塊通過查表方式輸出各字符的編碼值以及哈夫曼編碼結果。FIFO模塊用於接收原始數據和向輸出模塊提供數據源。

3 實現流程

  本文使用verilog語言在vivado平臺上進行哈夫曼編碼硬體模塊的實現,選用器件為xc7a100tcsq324-1。

3.1 FIFO模塊

  本文的FIFO模塊使用vivado的IP核生成,設計時選擇好相應參數配置,生成verilog文件後即可直接調用。

3.2 輸入模塊

  使用多個計數器對輸入各字符頻數以及輸入字符總量進行計數,頻數被存放在寄存器中,當字符輸入結束(例如輸入字符總量達到了約定值)時,輸入模塊向計算模塊輸出計算開始信號,同時頻數寄存器中的數據被並行輸出至計算模塊。

3.3 計算模塊

3.3.1 新數據結構及對應的硬體實現

  本文基於哈夫曼樹的思想構建了新的數據結構——字符池用於硬體實現哈夫曼編碼。根據n種字符構建n個字符池和n個字符節點。每個字符池包含一個屬性:包含的所有字符的頻數之和。每個字符節點包含以下屬性:所屬字符池序號、自身編碼值和自身編碼長度。因此,定義n個寄存器記錄字符節點對應的字符池序號、n個寄存器記錄編碼值、n個寄存器記錄編碼長度以及n個寄存器記錄字符池的頻數。

3.3.2 哈夫曼編碼計算流程

  進行哈夫曼編碼計算時,計算模塊通過執行循環操作完成各字符編碼的生成以及字符在字符池中的移動。以圖2中的實例描述計算流程。

  圖2中共有5種字符,各自頻數為:「0」:5,「1」:10,「2」:20,「3」:30,「4」:35。

  圖2(a)為初始化效果,此時每個字符池包含一個字符,每個字符池的頻數恰為那個字符的頻數;每個字符的編碼值和編碼長度清零。圖2(a)到圖2(d)共經過4次循環操作,最終可以從圖2(d)中讀取出每個字符的編碼值和編碼長度,「0」編碼值為0011,「1」編碼值為1011,「2」編碼值為111,「3」編碼值為01,「4」編碼值為0。

  每次循環操作包含排序、挑選、最小值和次小值求和、頻數更新、字符移動、編碼值更新及編碼長度更新8步。其中前4步按順序完成,然後同時完成後4步。總循環次數由字符種類數控制。

  排序操作功能是將每個節點池的頻數從小到大進行排序,本文借鑑了參考文獻[5]中的方法,硬體實現時通過構建比較器陣列將每兩個數兩兩比較,再通過加法器對每個字符頻數的比較結果求和。對一個字符頻數,若它小於另一個字符的頻數,則相應結果為0,否則為1。那麼通過指定字符頻數與其他字符頻數的比較結果之和可以得知它的頻數在所有頻數中的位置。

  挑選操作是將排序操作中比較結果為0和1對應的字符頻數選出,它們代表最小頻數和次小頻數,挑選操作同時挑選出這兩個頻數對應的字符池ID。硬體實現時構建多個比較器,將比較結果之和與0和1比較,再通過多路復用器從多個頻數和字符池ID中準確挑選出所需的值。例如在圖2(b)中,挑選出的兩個頻數為15和20,它們對應字符池ID為1和2。

  接下來的最小值和次小值求和操作就是將挑選操作挑選出的最小頻數和次小頻數求和,然後輸出。此步驟硬體實現時需要一個多位加法器。例如在圖2(b)中,求和值為15+20=35。

  頻數更新操作指根據挑選操作挑選出的結果進行字符池頻數的更新。按照本文約定方法,將最小頻數對應字符池的頻數更新成無效值,無效值應大於所有可能的頻數,它的目的是避免此字符池的頻數被接下來的循環挑選操作挑選出。本文將次小頻數對應字符池的頻數以求和操作的加法結果替代。例如圖2(c)中1號字符池頻數變成100,2號字符池頻數變成35。

  字符移動操作指將特定字符從一個字符池移動到另一個字符池中。按照本文約定方法,將最小頻數對應字符池的所有字符移動到次小頻數對應字符池中。例如將圖2(c)和圖2(b)對比可發現1號字符池的字符「0」和「1」被移動到了2號字符池中。

  編碼值、編碼長度更新操作中,按本文約定方法,將最小頻數對應字符池的所有字符編碼值左移1位並在最後一位補0,長度加1。將次小頻數對應字符池的所有字符編碼值左移1位並在最後一位補1,長度加1。將圖2(c)和圖2(b)對比可看出,字符「0」的編碼值從0變成00,「1」編碼值從1變成10,「2」編碼值從無變成1。

  所有循環結束後編碼表已生成,計算模塊向輸出模塊發送計算結束信號。

3.4 輸出模塊

  輸出模塊負責從FIFO中讀取出原始數據、從編碼表中獲取編碼值,再通過並串轉換以一位數據口首先輸出各字符編碼值,再輸出字符串編碼結果。

4 仿真和調試

  本文使用vivado對頂層模塊進行綜合實現,通過實現後仿真驗證 結果正確性。

  圖3展示了模塊輸入時序。本文測試時以huf_in_start高電平脈衝標誌數據輸入開始,實際數據以4為並口輸入,測試字符範圍為「0」至「9」。

  圖4展示了模塊輸出時序。通過huf_out_start高電平脈衝表明輸出開始。首先輸出各字符編碼序列,包含4bit編碼長度和實際編碼值,然後輸出原始字符串的編碼值。huf_out_end高電平脈衝表明輸出結束。

  圖5為vivado控制臺輸出,它展示了各字符編碼值以及原始字符和testbench進行的解碼字符比較,說明模塊正常運行。

5 結論

  本文提出了一種新的在硬體上實現哈夫曼編碼的方法,利用本文的字符池數據結構,對每次輸入的數據實時生成哈夫曼編碼表,從平均碼長角度保證了編碼的最優,同時避免了生成完整的哈夫曼樹,減少了資源佔用,並避免了遍歷哈夫曼樹所需的額外操作,實現方便快捷。

  參考文獻:

  [1]鄧麗娟,田金文,柳健,等.哈夫曼編碼器IP核的設計與實現[J].微電子學與計算機,2005(02):9-12.

  [2]張穎超.基於FPGA的Huffman編碼並行實現及高速存儲系統設計[D].長安大學,2015.

  [3]曾英,鄧曙光.基於FPGA的Huffman編碼器的設計[J].湖南城市學院學報(自然科學版), 2014(01):32-35.

  [4]楊蘭.基於C語言的哈夫曼編碼的實現[J].軟體導刊,2012(09):40-42.

  [5]師廷偉,金長江.基於FPGA的並行全比較排序算法[J].數位技術與應用,2013(10):126-127.

  本文來源於《電子產品世界》2017年第12期第40頁,歡迎您寫論文時引用,並註明出處。

相關焦點

  • 靜態哈夫曼編碼的快速硬體實現
    但是傳統的方法存在兩個比較大的缺陷:一是在構造哈夫曼樹時,每次生成一個父節點都會進行一次排序操作,這樣的多次排序操作不僅會花費大量的時間,也會耗費大量的硬體資源;二是編碼操作是在哈夫曼二叉樹生成之後進行,其實每次當一個父節點生成的時候,該父節點包含的葉子節點的哈夫曼編碼的一個比特就已經確定了,所以如果採用傳統的方法,就必須要保存整棵二叉樹,並且沒有有效利用生成二叉樹的這段時間,這樣做也浪費了更多的資源和更多的時間
  • 基於FPGA的快速哈夫曼編碼設計
    ,另一種用靜態編碼實現。碼錶方式將題目與實際應用結合起來,針對不同場景給出不同的碼錶快速編碼;不過考慮到無規律信號的編碼,所以通過靜態編碼使我們的作品更加具有普適性,我們還採用三位範式編碼的方式,縮短輸出周期;同時在數據輸入結束之前開始排序,減少編碼實際佔用的時間。0 引言  哈夫曼編碼是基於帶權路徑最小的最優二叉樹——哈夫曼樹的一種平均碼長最短的編碼方式。
  • 哈夫曼編碼 :: 如何求出一串字符集各個字符對應的哈夫曼編碼
    只要會構造哈夫曼樹,哈夫曼編碼特別簡單,一眼就能看出來。方法如下:首先看下面題目已知字符集{ a, b, c, d, e, f },若各字符出現的次數分別為{ 6, 3, 8, 2, 10, 4 },則對應字符集中各字符的哈夫曼編碼可能是:A,00, 1011, 01, 1010, 11, 100B,00, 100, 110, 000, 0010
  • 面試官:給我手寫一個哈夫曼編碼(java語言實現)
    哈弗曼樹往往都會根據哈夫曼編碼結合著來說,因此這篇文章,主要結合著面試問題來說明。一、基本概念哈夫曼樹的目的是找出存放一串字符所需的最少的二進位編碼, 原理是通過統計出每種字符出現的頻率!不斷地對其合併。
  • 漫畫:「哈夫曼編碼」 是什麼鬼?
    哈夫曼編碼(Huffman Coding),同樣是由麻省理工學院的哈夫曼博所發明,這種編碼方式實現了兩個重要目標:1.任何一個字符編碼,都不是其他字符編碼的前綴。2.信息編碼的總長度最小。哈夫曼編碼的生成過程是什麼樣子呢?讓我們看看下面的例子:假如一段信息裡只有A,B,C,D,E,F這6個字符,他們出現的次數依次是2次,3次,7次,9次,18次,25次,如何設計對應的編碼呢?
  • golang哈夫曼編碼壓縮文件代碼實現全流程(超詳細版)
    :www.topgoer.com1.僅僅介紹了哈夫曼樹的機制,並沒有算法實現,只知道原理可不一定能寫出代碼2.代碼實現了哈夫曼樹的構造,並且完成編碼,存儲在string變量中,列印出被哈夫曼編碼過的字符串,這其實變相增大了文件的體積,是一種耍流氓,壓根沒有達到目的,沒有理解哈夫曼編碼的真正精髓是bit壓縮3.通過全局變量將編碼的table保存在內存中,而非保存在被壓縮的文件中
  • 床長人工智慧教程pdf下載——Java數據結構——哈夫曼
    哈夫曼樹又稱最優二叉樹,它是個帶權的葉子結點構成的所有二叉樹中帶權路徑長度最下的二叉樹。二哈夫曼樹的構造算法假設有個權值,則構造出的哈夫曼樹有個葉子結點。個權值分別設為,則哈夫曼樹的構造算法為將看成是有棵樹的深林每棵樹僅有一個結點在森林中選出兩個根結點的權值最小的樹,作為一棵樹的左右子樹,且樹的根結點權值為左右子樹根結點權值之和從森林中刪除選取的兩棵樹,並將新樹加入森林
  • Verilog模型到門級的映射,要注意這些編碼原則
    Design Compiler(DC)作為Synopsys公司開發的一款用於電路綜合的EDA工具,在全球數字電路市場去得了巨大的成功,它的設計初衷是將用Verilog HDL語言描述的RTL(寄存器傳輸級)電路,映射成基於某個特定工藝庫的門級網標。
  • 基於FPGA的Verilog實現VGA驅動電路
    基於FPGA的Verilog實現VGA驅動電路 FPGA開源工作室 發表於 2020-11-20 16:02:55 VGA全稱是Video
  • 漫畫:什麼是 「哈夫曼樹」?
    哈夫曼樹是由麻省理工學院的哈夫曼博士於1952年發明,這到底是一顆什麼樣的樹呢?剛才我們學習了樹的帶權路徑長度(WPL),而哈夫曼樹(Huffman Tree)是在葉子結點和權重確定的情況下,帶權路徑長度最小的二叉樹,也被稱為最優二叉樹。舉個例子,給定權重分別為1,3,4,6,8的葉子結點,我們應當構建怎樣的二叉樹,才能保證其帶權路徑長度最小?
  • 基於Verilog FPGA 流水燈設計
    在FPGA電路設計中,儘管流水燈的設計屬於比較簡單的入門級應用,但是其運用到的方法,是FPGA設計中最核心和最常用部分之一,是FPGA設計必須牢固掌握的基礎知識。從這一步開始,形成良好的設計習慣,寫出整潔簡潔的代碼,對於FPGA設計師來說至關重要。  在本案例中,使用常用的verilog語言完成該程序,設計並控制8個燈的花式或循環點亮。
  • 基於摩爾狀態機的自適應調製編碼方法
    基於摩爾狀態機的自適應調製編碼方法 李倩 發表於 2018-07-14 08:30:33 摘要: 針對鐵路長期演進(LTE-R)通信系統,開展自適應調製編碼
  • 基於QPSK數字調製解調的FPGA實現
    基於QPSK數字調製解調的FPGA實現 佚名 發表於 2018-02-20 07:50:00 隨著FPGA技術的發展,數字通信技術與FPGA的結合體現了現代數字通信系統發展的一個趨勢。
  • 螳螂慧視產品研發總監王晨:基於編碼結構光的三維成像實現與應用|...
    由於直接編碼法對每個像素都進行了編碼,在理論上可以達到較高的解析度,但是容易受環境噪聲影響,測量精度較低;時間編碼是將多幅不同的編碼圖案先後投射到物體表面上,形成圖案序列以獲得編碼值,從而得到3D信息,易於實現、空間解析度高、3D測量精度高,但由於需要投影多幅圖案,因而比較適合靜態場景,不適用於動態場景;空間編碼是將一幅具有特定空間分布特徵的編碼圖案投射到物體表面上,利用投影圖案中每個點和其相鄰點的關係進行編碼
  • 基於軟體無線電架構加速無線開發測試
    以下還列出了一些正在研發階段的新興的無線標準:OFDM(正交頻分復用)——這一技術正逐漸得以普及而且正在許多新標準中得以實現。通過軟體數位訊號處理技術實現多種無線技術讓我們先來了解一下典型的通信系統所包含的主要功能模塊,這將幫助更好的理解整個設計和測試的流程。信源編碼和解碼信源編碼主要用於數據的壓縮,以利於後續的傳輸。常見的信源編碼算法包括JPEG壓縮,zip(LZ77和哈夫曼編碼算法的結合),MP3和MPEG-2等。
  • 網絡高效安全數據傳輸方法設計
    通過對哈夫曼壓縮方法研究可知,不同的數據文件經過哈夫曼壓縮後可形成不同的少量數據的哈夫曼壓縮編碼表和壓縮文件。通過對哈夫曼編碼表進行非對稱加密設計的方案,可以減少非對稱加密算法加密的字節數,實現大數據量文件的非對稱加密。同時通過對大數據文件的壓縮,可以減少整個文件大小,提高網絡傳輸效率。該方案已在多個網絡安全傳輸項目中得到應用,完全能夠滿足網絡傳輸安全要求。
  • 比較Verilog中Wire和Reg的不同之處
    比較Verilog中Wire和Reg的不同之處 MangoWen 發表於 2020-03-08 17:18:00 wire 和reg是Verilog程序裡的常見的兩種變量類型,他們都是構成verilog
  • 一種基於小波域的分形圖像編碼改進算法
    小波圖像編碼和分形圖像編碼是兩種不同的圖像編碼方法,二者各有其特點,又都存在一定的局限性[1-3]。一幅圖像經過小波變換後,其相同方向但不同解析度的子圖像具有較強的相似性,這種相似性正好與分形編碼的特點具有互補性。
  • 玩轉賽靈思Zedboard開發板(3):基於Zynq PL的流水燈
    打開APP 玩轉賽靈思Zedboard開發板(3):基於Zynq PL的流水燈 超群天晴 發表於 2012-12-05 14:25:41
  • verilog 語言設計時鐘分頻設計問題全解
    一般在FPGA中都有集成的鎖相環可以實現各種時鐘的分頻和倍頻設計,但是通過語言設計進行時鐘分頻是最基本的訓練,在對時鐘要求不高的設計時也能節省鎖相環資源。分頻有兩種一種偶分頻,一種奇分頻。偶分頻則意味著M為偶數,奇分頻則意味著M為奇數。如輸入時鐘為50M,輸出時鐘為25M,則M=2,N=1。偶分頻則意味著M為偶數。