專利名稱:基于fpga的壓縮系統(tǒng)及其方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)的壓縮技術(shù),尤其是一種基于FPGA的壓縮系統(tǒng)及其方法。
背景技術(shù):
在嵌入式開發(fā)系統(tǒng)中,對數(shù)據(jù)進(jìn)行壓縮和解壓縮是非常重要的手段之一,其可以大幅度的提高磁盤的有效容量,提高讀寫操作時輸入輸出的有效帶寬,提高應(yīng)用層程序的執(zhí)行速度。當(dāng)前,數(shù)據(jù)的壓縮和解壓縮一般采用GZIP算法,并通過軟件的方式進(jìn)行數(shù)據(jù)處理,然而GZIP算法里面有大量的串行的操作,使用軟件算法進(jìn)行處理的效率較低。而且GZIP解壓縮的算法均采用軟件來實現(xiàn),它采用多級查表的方式完成哈夫曼解碼,也就是說接觸一個碼可能需要查表多次,該方法的優(yōu)點是內(nèi)存的使用量較少,對應(yīng)大部分查表只需要一次查表即可完成,效率較高,所以在軟件里面廣泛應(yīng)用,但該算法的并行度較低,在大規(guī)模的數(shù)據(jù)處理中會占用大量的CPU資源,不合適硬件實現(xiàn)。因此在大規(guī)模的數(shù)據(jù)處理中,待壓縮的數(shù)據(jù)流巨大;其 使用CPU進(jìn)行壓縮解壓縮時必然要占用大量的CPU資源,在進(jìn)行數(shù)據(jù)解壓時CPU資源占用的問題更為明顯。因此,如何提高壓縮處理效率成為現(xiàn)有GZIP解壓縮技術(shù)亟待解決的技術(shù)問題,尤其是能否針對現(xiàn)有GZIP解壓算法提供相應(yīng)的解決方案。
發(fā)明內(nèi)容
本發(fā)明要解決的一個技術(shù)問題是提供一個壓縮方法和硬件系統(tǒng),來提高磁盤的有效容量,同時也有效的提高原有GZIP壓縮算法的處理效率。本發(fā)明的一個方面提供了一種基于FPGA的壓縮系統(tǒng),其包括:將外部數(shù)據(jù)進(jìn)行壓縮的FPGA模塊、向FPGA模塊提供外部數(shù)據(jù)的數(shù)據(jù)模塊、接收經(jīng)FPGA模塊壓縮后的數(shù)據(jù)的外部存儲模塊,其中FPGA模塊包括與數(shù)據(jù)模塊相連的輸入接口單元、與接口單元相連的存儲單元、壓縮文件格式單元、對由存儲單元而來的數(shù)據(jù)按照壓縮文件格式單元的文件格式進(jìn)行壓縮的壓縮算法單元、以及將壓縮算法單元所壓縮的數(shù)據(jù)輸出至外部存儲模塊的輸出接口單元。優(yōu)選地,所述存儲單元為內(nèi)存,而外部存儲模塊為硬盤。優(yōu)選地,所述文件格式具有頭部、數(shù)據(jù)部、和用于校驗的尾部,其中所述頭部包括IDl、ID2、CM、FLG、MTIME, XFL、OS、以及額外的頭字段,而所述數(shù)據(jù)部為DEFLATE數(shù)據(jù)格式。優(yōu)選地,所述壓縮算法單元包括LZ77算法、哈夫曼編碼。優(yōu)選地,所述IDl與ID2各占I字節(jié),且為固定值,所述CM、FLG、XFL、OS均占I字節(jié),而所述Μ ΜΕ占4字節(jié)。本發(fā)明的另一個方面提供了一種基于FPGA的壓縮方法,其包括:由輸入接口單元接收外部數(shù)據(jù);存儲所接收的外部數(shù)據(jù);對所存儲的外部數(shù)據(jù)按照文件格式進(jìn)行壓縮,其中壓縮算法至少包括LZ77算法、哈夫曼編碼;通過輸出接口單元將壓縮數(shù)據(jù)輸出到外部存儲模塊。
優(yōu)選地,所述文件格式具有頭部、數(shù)據(jù)部、和用于校驗的尾部三部分,其中所述頭部包括ID1、ID2、CM、FLG、MHME、XFL、0S、以及額外的頭字段,而所述數(shù)據(jù)部為DEFLATE數(shù)據(jù)格式。優(yōu)選地,所述IDl與ID2各占I字節(jié),且為固定值,所述CM、FLG、XFL、OS均占I字節(jié),而所述Μ ΜΕ占4字節(jié)。優(yōu)選地,所述的LZ77算法的變種是指如果文件中有兩塊內(nèi)容相同的話,那么只要知道前一塊的位置和大小,就可以確定后一塊的內(nèi)容,所以可以用(兩者之間的距離,相同內(nèi)容的長度)這樣一對信息,來替換后一塊內(nèi)容,而由于(兩者之間的距離,相同內(nèi)容的長度)這一對信息的大小,小于被替換內(nèi)容的大小,所以文件得到了壓縮。優(yōu)選地,所述的LZ77算法,使用〃滑動窗口 〃的方法,來尋找文件中的相同部分,也就是匹配串,先對這里的串做一個說明,它是指一個任意字節(jié)的序列,而不僅僅是可以在文本文件中顯示出來的那些字節(jié)的序列。這里的串強(qiáng)調(diào)的是它在文件中的位置,它的長度隨著匹配的情況而變化。LZ77從文件的開始處開始,一個字節(jié)一個字節(jié)的向后進(jìn)行處理。一個固定大小的窗口(在當(dāng)前處理字節(jié)之前,并且緊挨著當(dāng)前處理字節(jié)),隨著處理的字節(jié)不斷的向后滑動,就象在陽光下,飛機(jī)的影子滑過大地一樣。對于文件中的每個字節(jié),用當(dāng)前處理字節(jié)開始的串,和窗口中的每個串進(jìn)行匹配,尋找最長的匹配串。窗口中的每個串指,窗口中每個字節(jié)開始的串。如果當(dāng)前處理字節(jié)開始的串在窗口中有匹配串,就用(之間的距離,匹配長度)這樣一對信息,來替換當(dāng)前串,然后從剛才處理完的串之后的下一個字節(jié),繼續(xù)處理。如果當(dāng)前處理字節(jié)開始的串在窗口中沒有匹配串,就不做改動的輸出當(dāng)前處理字節(jié)。處理文件中第一個字節(jié)的時候,窗口在當(dāng)前處理字節(jié)之前,也就是還沒有滑到文件上,這時窗口中沒有任何內(nèi)容,被處理的字節(jié)就會不做改動的輸出。隨著處理的不斷向后,窗口越來越多的滑入文件,最后整個窗口滑入文件,然后整個窗口在文件上向后滑動,直到整個文件結(jié)束。
優(yōu)選地,所述的哈夫曼編碼是對于出現(xiàn)次數(shù)非常多的,則用較少的位來表示,對于出現(xiàn)次數(shù)非常少的,則用較多的位來表示,這樣一來,文件的一些部分位數(shù)變少了,一些部分位數(shù)變多了,由于變小的部分比變大的部分多,所以整個文件的大小還是會減小,所以文件得到了壓縮。優(yōu)選地,所述的壓縮算法,是指先對數(shù)據(jù)進(jìn)行LZ77算法,再進(jìn)行哈夫曼編碼,從而實現(xiàn)高效壓縮目的。本發(fā)明通過四路數(shù)據(jù)并行接入,利用硬件系統(tǒng),解決GZIP算法里面有大量的串行的操作且使用軟件算法進(jìn)行處理的效率低的問題,提高壓縮處理效率。
下面結(jié)合附圖及實施例對本發(fā)明作進(jìn)一步描述:圖1是本發(fā)明的結(jié)構(gòu)框圖。圖2是本發(fā)明中文件格式的結(jié)構(gòu)框圖。圖3是本發(fā)明中GZIP壓縮算法的流程圖。圖4是本發(fā)明中LZ77壓縮算法的流程圖。圖5是本發(fā)明中DEFLATE算法的流程圖。
具體實施例方式實施例:下面參照附圖用本發(fā)明的示例,對本發(fā)明進(jìn)行更詳細(xì)的描述和說明。如圖1所示,本發(fā)明提供一種基于FPGA的壓縮系統(tǒng)的具體實施例,其包括:將外部數(shù)據(jù)進(jìn)行壓縮的FPGA模塊1、向FPGA模塊I提供外部數(shù)據(jù)的數(shù)據(jù)模塊2、接收經(jīng)FPGA模塊I壓縮后的數(shù)據(jù)的外部存儲模塊3,其中FPGA模塊I包括與數(shù)據(jù)模塊2相連的輸入接口單元10、與接口單元10相連的存儲單元12、壓縮文件格式單元14、對由存儲單元12而來的數(shù)據(jù)按照壓縮文件格式單元14的文件格式進(jìn)行壓縮的壓縮算法單元16、以及將壓縮算法單元16所壓縮的數(shù)據(jù)輸出至外部存儲模塊3的輸出接口單元18。本實施例中輸入接口單元10為并行接口,存儲單元12優(yōu)選為內(nèi)存,而外部存儲模塊3優(yōu)選為硬盤。其中,如圖2所示,壓縮文件格式單元14的文件格式為GZIP壓縮文件格式,其為標(biāo)準(zhǔn)化壓縮文件格式并用于打包壓縮數(shù)據(jù),所述文件格式具有頭部、數(shù)據(jù)部、和用于校驗的尾部三部分,其中頭部用于設(shè)置壓縮方法、壓縮格式、系統(tǒng)等;數(shù)據(jù)部用于承載獲得的數(shù)據(jù);尾部用于對數(shù)據(jù)進(jìn)行CRC32校驗,以判斷解壓縮的正確性,其包括CRC32:4字節(jié),保存原始數(shù)據(jù)的32位校驗和。ISIZE:4字節(jié),用來保存原始數(shù)據(jù)長度的低32位,同時頭部包括ID1、ID2、CM、FLG、MTIME, XFL、OS、以及額外的頭字段,而所述數(shù)據(jù)部為DEFLATE數(shù)據(jù)格式。其中,如圖3所示,GZIP壓縮算法包括兩個部分:LZ77算法和哈夫曼編碼。其中如圖4所示,其為LZ77算法壓縮流程,并做以下具體描述:如圖4中所述尋找匹配可以做以下表述:GZIP算法對遇到的每一個串,首先會把它插入到一個“字典”中。這樣當(dāng)以后有和它可以匹配的串,都可以直接從“字典”中查出這個串。在插入的時候,使用這個插入串的前三個字節(jié),計算出插入的“字典”位置,然后把插入串的開始位置保存在這個“字典”位置中。查出的時候,使用查出串的前三個字節(jié),計算出“字典”位置,由于插入和查出使用的是同一種計算方法,所以如果兩個串的前三個字節(jié)相同的話,計算出的“字典”位置肯定是相同的,所以就可以直接在該“字典”位置中,取出以前插入時,保存進(jìn)去的那個串的開始位置。于是查出串,就找到了一個串,而這個串的前三個字節(jié)和自己的一樣,所以就找到了一個匹配串。但是會有多個串,他們的前三個字節(jié)都相同,那么他們在“字典”里的位置相同,他們將由一條鏈相連,放在對應(yīng)的“字典”計算的位置的鏈上。所以,查到了一個相應(yīng)在“字典”位置,也就查到了對應(yīng)的一個鏈。所有和它前三個字節(jié)相同的串,都在這個鏈上。所以要找最長的匹配,就要遍歷這個鏈上的每一個串,比較看和哪個串的匹配長度能獲得最大值。上述技術(shù)方案中涉及到的插入head[ins_h]表述為:當(dāng)前字節(jié)用strstart標(biāo)記。利用第strstart, strstart+1, strstart+2,這三個字節(jié)的值,使用一個哈希函數(shù)算出ins_h (在head□表中的插入位置)。然后將當(dāng)前字節(jié)的位置,即strstart,填到在head[ins_h]中。如圖4所述的是否可以匹配是指:當(dāng)使用哈希函數(shù)算出ins_h,查到head[ins_h]中的值不為空的話,那么head[ins_h]中的值,便是之前保存在這里的一個串的位置,(這個串的前三個字節(jié)算出的ins_h,和當(dāng)前串的前三個字節(jié)算出的ins_h相同)也就是說有可能有匹配。如果head[ins_h]的值為空的話,那么,肯定不存在匹配。關(guān)于GZIP所 使用的哈希函數(shù)的說明:當(dāng)GZIP發(fā)現(xiàn)head[ins_h]不空后,也就是說有可能有匹配串的話,會對鏈上的每一個串進(jìn)行真正的串的比較。所以一個鏈上的串,只是前三個字節(jié)用哈希函數(shù)算出的值相同,而并不一定前三個字節(jié)都是相同的。但是這樣已經(jīng)很大的縮小了需要進(jìn)行串比較的范圍。不同的三個字節(jié)有可能得到同一個結(jié)果的原因是,三個字節(jié),一共24位,有2~24種可能值。而三個字節(jié)的哈希函數(shù)的計算結(jié)果為15位,有2~ 15種可能值。也就是說2~24種值,與2~ 15種值進(jìn)行對應(yīng),必然是多對一的,也就是說,必然是有多種三個字節(jié)的值,用這個哈希函數(shù)計算出的值都是相同的??梢赃@樣使用哈希函數(shù)的理由是,只是在一個窗口大小的范圍內(nèi)尋找匹配串,這樣能出現(xiàn)的三個字節(jié)的值組合情況也是很有限的,將遠(yuǎn)遠(yuǎn)小于2~24,所以使用一個比較合適的哈希函數(shù)是非常高效的。如圖4所述的建立prev[]鏈:在每次處理當(dāng)前串的時候,首先計算出插入的位置,然后,把當(dāng)前的串的位置,保存到head[ins_h]中,如果head[ins_h]中(不空的話)為前一個串的開始位置。那么進(jìn)行以下的操作:prev[strstart] =head[ins_h] ;head[ins_h] =strstart; 一次次的進(jìn)行不斷的插入操作,prev[]鏈就形成了。其中prev[]鏈的作用:head[ins_h]中的值,它本身就是一個前三個字節(jié)計算結(jié)果為ins_h的串的位置。同時,它是一個在prev[]數(shù)組中的索引,利用這個索引在prev[]中,可以找到前一個前三個字節(jié)計算結(jié)果為ins_h的串的位置。即prev [head [ins_h]]的值(當(dāng)不為空時)是前一個前三個字節(jié)計算結(jié)果為ins_h的串的位置??梢圆粩嘞蛏现钡絧rev[]為空,表示鏈結(jié)束。在prev[]鏈中ins_h的所有的串被鏈在了一起,head[ins_h]為鏈頭,preV[]數(shù)組中放著的更早的串的位置。prev[]鏈的特點:順著prev[]鏈不斷向前,則它與當(dāng)前處理strstart位置之間的距離越來越遠(yuǎn)。如圖4所述lazy match,其算法的使用:在當(dāng)前串尋找到了最長匹配之后,GZIP并不立即就決定使用這個串進(jìn)行替換。而是看下一個字節(jié)開始的串是否也有匹配串,如果比現(xiàn)在這個匹配串有更長的匹配串的話,將不使用現(xiàn)在的這個匹配。如果比現(xiàn)在這個短的話,將確定使用現(xiàn)在的這個匹配。GZIP在滿足lazy match的前提條件下,一次lazy match發(fā)現(xiàn)了更長的匹配串之后,仍會再進(jìn)行l(wèi)azy match,如果這次lazy match,發(fā)現(xiàn)了比上次更長的匹配串,那么上一次的懶·匹配找到的匹配串就不用了。lazy match可以增加壓縮的效果,同時,也會付出不小的時間代價。所以有必要對其使用加以限制。只有當(dāng)當(dāng)前匹配串的匹配長度,GZIP也就是當(dāng)前匹配長度小于max_lazy_match (max_lazy_match在固定的壓縮級別下,有固定的值)時,才會進(jìn)行l(wèi)azy match ο本發(fā)明的LZ77算法對大于64KB的文件,用關(guān)于滑動窗口實現(xiàn):當(dāng)前串(當(dāng)前處理字標(biāo)記strstart開始的串)只是在它之前的一個滑動窗口中尋找匹配串的,也就是說只是在它之前的一定大小的范圍內(nèi)尋找匹配串的。GZIP的這個滑動窗口的大小為WSIZE,32KB。在內(nèi)存中將建一個window[]的緩沖區(qū),大小為2個窗口的大小,64KB。需要被壓縮的文件的內(nèi)容將被讀到這個window[]中,再在window[]緩沖區(qū)上進(jìn)行LZ77算法的處理,得到結(jié)果將放在其他緩沖區(qū)中。GZIP對window[]中的內(nèi)容,從開始處開始,一個字節(jié)一個字節(jié)的向后處理。當(dāng)當(dāng)前處理字節(jié)開始的串沒有合適的匹配時,不做任何改動的輸出當(dāng)前處理字節(jié),strstart向后移動一個字節(jié)。當(dāng)當(dāng)前處理字節(jié)開始的串找到了合適的匹配時,輸出(匹配長度,相隔距離)對,strstart向后移動匹配長度個字節(jié)。從strstart到window[]結(jié)束的這部分內(nèi)容,叫做lookahead buffer (超前查看緩沖區(qū))。變量lookahead,保存著超前查看緩沖區(qū)所剩的字節(jié)數(shù)。lookahead,最開始被初始化為整個讀入內(nèi)容的大小,隨著處理的進(jìn)行,strstart不斷后移,超前查看緩沖區(qū)不斷減小,相應(yīng)的lookahead的值也不斷的減小。如果匹配串出了一個窗口的限制,貝1J不與匹配。當(dāng)當(dāng)前串計算ins_h,發(fā)現(xiàn)head[ins_h]值不為空時(head[ins_h]為一個串的開始位置),說明當(dāng)前串有可能有匹配串,把這個值保存在hash_head中。這時就要做一個限制范圍的判斷,strstart_hash_head〈=窗口大小,strstart-hash_head是當(dāng)前串和最近的匹配串之間的距離,如果是在一個窗口的范圍之內(nèi)的話,還需要在鏈上尋找最長的匹配串,在和每個串進(jìn)行比較的時候,也需要判斷當(dāng)前串和該串的距離是否超過一個窗口的范圍,超過的話,就不能進(jìn)行匹配。實際中,GZIP為了使代碼簡單點,距離限制要比一個窗口的大小還要小一點。本發(fā)明中的LZ77算法對于小于64KB的文件處理過程:初始化的時候整個文件都被讀入到window[]中。在window[]上進(jìn)行LZ77算法的處理,從開始直到文件結(jié)束。本發(fā)明對于大于64KB的文件處理過程:壓縮開始之前的初始化,會從文件中讀入64KB的內(nèi)容到window[]中,窗口大小為32KB,也就是讀入2窗的內(nèi)容到window[]中。壓縮不斷進(jìn)行,直到lookahead < MIN_L00KAHEAD,也就是處理到了 64KB內(nèi)容的接近結(jié)束部分,也就是如果再處理,超前查看緩沖區(qū)中的內(nèi)容就可能不夠了。由于lookahead < MIN_LOOKAHEAD,將執(zhí)行fill_windowO。fill_windowO判斷是否壓縮已經(jīng)進(jìn)行到了 2窗內(nèi)容快用完了,該把新的內(nèi)容放進(jìn)來了。如果是的話,fill_window()把第二窗的內(nèi)容,復(fù)制到第一窗中,這樣第一窗中的內(nèi)容就被覆蓋掉了。然后更新匹配鏈的鏈頭數(shù)組,head□,更新prev[]數(shù)組,從頭到尾過一遍,如果這個頭中保存的串的位置,在窗口二中,就對這個串的位置做修正。如果這個頭中保存的串的位置,在窗口一中,就不要了,否則就超過了 32k的限制。,如果某項的內(nèi)容,在窗口二中,就做修正。最后fill_window()從文件中再讀出一窗內(nèi)容,也就是讀出32KB的內(nèi)容,復(fù)制到第二個窗中,注意第二個窗口中原來的內(nèi)容,已經(jīng)被復(fù)制到了第一個窗口中。就這樣,一窗窗的不斷的處理,直到整個文件結(jié)束。
·
如圖4中所述分塊輸出:LZ77壓縮的結(jié)果放在l_buf [],d_buf [],flag_buf []中。對于LZ77的壓縮結(jié)果,可能使用一塊輸出或者分成多塊輸出(LZ77壓縮一定的部分之后,就進(jìn)行一次塊輸出,輸出一塊)。塊的大小不是固定的。輸出的時候,會對LZ77算法處理的壓縮結(jié)果,進(jìn)行Huffman編碼,最終把Huffman編碼的結(jié)果輸出到outbuf[]緩沖區(qū)中。在flush_block()中進(jìn)行Huffman編碼,并輸出的工作。在ct_tally()中進(jìn)行判斷,如果滿足一些條件的話,當(dāng)從ct_tally()中返回之后,就會對現(xiàn)有的LZ77的結(jié)果,進(jìn)行Huffman編碼,輸出到一個塊中。在整個文件處理結(jié)束,deflate O函數(shù)要結(jié)束的時候,會把LZ77的結(jié)果,進(jìn)行Huffman編碼,輸出到一個塊中。而當(dāng)l_buf[]滿了的時候,或者d_buf[]滿了的時候,將肯定對現(xiàn)有的LZ77壓縮的結(jié)果,進(jìn)行Huffman編碼,輸出到一個塊中。決定輸出一塊的話,建立Huffman樹,會只針對這一塊的內(nèi)容。這一塊內(nèi)容將會被進(jìn)行Huffman編碼壓縮,并被輸出到outbuf []中。如果是動態(tài)Huffman編碼,樹的信息也被輸出到outbuf[]中。輸出之后,會調(diào)用init_block O,初始化一個新塊,重新初始化一些變量,包括動態(tài)樹的結(jié)點被置0,也就是說,將為新塊將來的Huffman樹重新開始統(tǒng)計信息。每個塊最開始的2位,用來指明本塊使用的是哪種編碼方式,00表示直接存儲,01表示靜態(tài)Huffman編碼,10表不動態(tài)Huffman編碼。接下來的I位,指明本塊是否是最后一塊,O表不不是,I表不是最后一塊。
上述技術(shù)方案所述的Huffman編碼與動態(tài)Huffman編碼:靜態(tài)Huffman編碼就是使用GZIP自己預(yù)先定義好了一套編碼進(jìn)行壓縮,解壓縮的時候也使用這套編碼,這樣不需要傳遞用來生成樹的信息。動態(tài)Huffman編碼就是使用統(tǒng)計好的各個符號的出現(xiàn)次數(shù),建立Huffman樹,產(chǎn)生各個符號的Huffman編碼,用這產(chǎn)生的Huffman編碼進(jìn)行壓縮,這樣需要傳遞生成樹的信息。GZIP在為一塊進(jìn)行Huffman編碼之前,會同時建立靜態(tài)Huffman樹,和動態(tài)Huffman樹,計算使用靜態(tài)Huffman樹編碼,生成的塊的大小,以及計算使用動態(tài)Huffman樹編碼,生成塊的大小。最后再進(jìn)行比較,使用生成塊較小的方法進(jìn)行最終的Huffman編碼。當(dāng)文件比較小時,往往使用靜態(tài)樹能產(chǎn)生比較好的壓縮效果,因為動態(tài)樹需要傳遞生成樹的那部分信息。 如圖5所示,DEFLATE算法流程圖的文字說明如下:Strstart:當(dāng)前串首字符的位置;所說的“字典”,是用數(shù)組head[]表示的;所說的“字典”位置,放在一個叫做ins_h的變量中,而該位置,用哈希函數(shù)根據(jù)串的前三個字節(jié)算出;所說的鏈,是在一個叫做prev[]的數(shù)組中;字符:文件具體內(nèi)容;串:多個字符組成串,在GZIP算法中;對:(串長,與之前匹配串的距離);字典:存放串,供尋找匹配串用;插入位置:串在字典中的位置;`讀串:系統(tǒng)得到要壓縮的文件,讀入字符串到緩沖區(qū)。Gzip算法對遇到的每一個串,首先會把它插入到一個“字典”中。這樣當(dāng)以后有和它可以匹配的串,都可以直接從“字典”中查出這個串。用變量strstart指向串的首字符。Strstart->NULL :判斷 ststart 指向是否為空;哈希表查找插入位置insh:哈希表查找,效率較高鏈表是否存在該串:鏈表,是由,不同串組成,但是,每個鏈上,串的前三個字節(jié)相同,這樣可以提高查找效率。找鏈表prev中最長匹配:所謂最長匹配,是指匹配長度最長。MAX_LAZY_MATCH:在當(dāng)前串尋找到了最長匹配之后,gzip并不立即就決定使用這個串進(jìn)行替換。而是看下一個字節(jié)開始的串是否也有匹配串,如果比現(xiàn)在這個匹配串有更長的匹配串的話,將不使用現(xiàn)在的這個匹配。如果比現(xiàn)在這個短的話,將確定使用現(xiàn)在的這個匹配。GZIP在滿足lazy match的前提條件下,一次lazy match發(fā)現(xiàn)了更長的匹配串之后,仍會再進(jìn)行l(wèi)azy match,如果這次lazy match,發(fā)現(xiàn)了比上次更長的匹配串,那么上一次的懶匹配找到的匹配串就不用了。lazy match可以增加壓縮的效果,同時,也會付出不小的時間代價。所以有必要對其使用加以限制。只有當(dāng)當(dāng)前匹配串的匹配長度,gzi也就是當(dāng)前匹配長度小于maX_lazy_match (max_lazy_match在固定的壓縮級別下,有固定的值)時,才會進(jìn)行l(wèi)azy match。分配緩沖區(qū)window:在內(nèi)存中將建一個window[]的緩沖區(qū),大小為2個窗口的大小,64KB。需要被壓縮的文件的內(nèi)容將被讀到這個window[]中,在window[]緩沖區(qū)上進(jìn)行LZ77算法的處理,得到結(jié)果將放在其他緩沖區(qū)中。當(dāng)然上述實施例只為說明本發(fā)明的技術(shù)構(gòu)思及特點,其目的在于讓熟悉此項技術(shù)的人能夠了解本發(fā)明的內(nèi)容并據(jù)以實 施,并不能以此限制本發(fā)明的保護(hù)范圍。凡根據(jù)本發(fā)明主要技術(shù)方案的精神實質(zhì)所做的等效變換或修飾,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種基于FPGA的壓縮系統(tǒng),其特征在于其包括:將外部數(shù)據(jù)進(jìn)行壓縮的FPGA模塊(I)、向FPGA模塊(I)提供外部數(shù)據(jù)的數(shù)據(jù)模塊(2 )、接收經(jīng)FPGA模塊(I)壓縮后的數(shù)據(jù)的外部存儲模塊(3 ),其中FPGA模塊(I)包括與數(shù)據(jù)模塊(2 )相連的輸入接口單元(10 )、與接口單元(10)相連的存儲單元(12)、壓縮文件格式單元(14)、對由存儲單元(12)而來的數(shù)據(jù)按照壓縮文件格式單元(14)的文件格式進(jìn)行壓縮的壓縮算法單元(16)、以及將壓縮算法單元(16)所壓縮的數(shù)據(jù)輸出至外部存儲模塊(3)的輸出接口單元(18)。
2.根據(jù)權(quán)利要求1所述的壓縮系統(tǒng),其特征在于:所述存儲單元(12)為內(nèi)存,而外部存儲模塊(3)為硬盤。
3.根據(jù)權(quán)利要求1或2所述的壓縮系統(tǒng),其特征在于:所述文件格式具有頭部、數(shù)據(jù)部、和用于校驗的尾部,其中所述頭部包括ID1、ID2、CM、FLG、MHME、XFL、0S、以及額外的頭字段,而所述數(shù)據(jù)部為DEFLATE數(shù)據(jù)格式。
4.根據(jù)權(quán)利要求3所述的壓縮系統(tǒng),其特征在于:所述壓縮算法單元(16)包括LZ77算法、哈夫曼編碼。
5.根據(jù)權(quán)利要求3所述的壓縮系統(tǒng),其特征在于:所述IDl與ID2各占I字節(jié),且為固定值,所述CM、FLG、XFL、OS均占I字節(jié),而所述Μ ΜΕ占4字節(jié)。
6.一種基于FPGA的壓縮方法,其特征在于其包括: 由輸入接口單元(10)接收外部數(shù)據(jù); 存儲所接收的外部數(shù)據(jù); 對所存儲的外部數(shù)據(jù)按照文件格式進(jìn)行壓縮,其中壓縮算法至少包括LZ77算法、哈夫曼編碼; 通過輸出接口單元(18 )將壓縮數(shù)據(jù)輸出到外部存儲模塊(3 )。
7.根據(jù)權(quán)利要求6所述的壓縮方法,其特征在于:所述文件格式具有頭部、數(shù)據(jù)部、和用于校驗的尾部三部分,其中所述頭部包括IDl、ID2、CM、FLG、MTIME, XFL、OS、以及額外的頭字段,而所述數(shù)據(jù)部為DEFLATE數(shù)據(jù)格式。
8.根據(jù)權(quán)利要求7所述的壓縮方法,其特征在于:所述IDl與ID2各占I字節(jié),且為固定值,所述CM、FLG、XFL、OS均占I字節(jié),而所述Μ ΜΕ占4字節(jié)。
全文摘要
本發(fā)明公開了一種基于FPGA的壓縮系統(tǒng)及其方法,其包括將外部數(shù)據(jù)進(jìn)行壓縮的FPGA模塊、向FPGA模塊提供外部數(shù)據(jù)的數(shù)據(jù)模塊、接收經(jīng)FPGA模塊壓縮后的數(shù)據(jù)的外部存儲模塊。其中FPGA模塊將GZIP壓縮算法嵌入到FPGA硬件中,用于對FPGA中的目標(biāo)文件先進(jìn)行LZ77算法,再進(jìn)行哈夫曼編碼,從而實現(xiàn)高效壓縮目的。
文檔編號H03M7/30GK103248369SQ20131019703
公開日2013年8月14日 申請日期2013年5月21日 優(yōu)先權(quán)日2013年5月21日
發(fā)明者姬磊, 唐敏, 陶澤文, 劉文天 申請人:南京暢洋科技有限公司