本發(fā)明涉及編碼系統(tǒng)領(lǐng)域,特別是涉及一種用于vlsi設(shè)計(jì)的huffman編碼實(shí)現(xiàn)系統(tǒng)及其實(shí)現(xiàn)方法。
背景技術(shù):
目前,在對(duì)芯片面積、編碼速率和壓縮效率要求較高的數(shù)據(jù)無損壓縮系統(tǒng)如視頻和圖像編碼系統(tǒng)等一些領(lǐng)域,基于動(dòng)態(tài)huffman編碼或者傳統(tǒng)靜態(tài)huffman編碼芯片已經(jīng)很難滿足要求。huffman編碼屬于最佳熵編碼法的同時(shí)也是一種前綴碼,其數(shù)據(jù)壓縮效率最高。為了提高編碼壓縮效率的需要通常可采用動(dòng)態(tài)huffman編碼或者靜態(tài)huffman編碼二種方案。
動(dòng)態(tài)huffman編碼對(duì)輸入字符的統(tǒng)計(jì)是動(dòng)態(tài)進(jìn)行的,隨著待壓縮數(shù)據(jù)的輸入,逐步構(gòu)造huffman樹,因此隨著編碼的進(jìn)行,同一個(gè)字符的編碼可能發(fā)生改變(變得更長或更短)。動(dòng)態(tài)huffman編碼算法中每輸入一個(gè)字符就要更新一次huffman樹,這也導(dǎo)致動(dòng)態(tài)huffman編碼算法非常復(fù)雜,需要更多的寄存器和邏輯運(yùn)算電路。在待壓縮數(shù)據(jù)量不大時(shí),由于不用預(yù)先統(tǒng)計(jì)待壓縮數(shù)據(jù)中每種字符的頻數(shù),相對(duì)靜態(tài)huffman編碼可以節(jié)約時(shí)鐘周期,但隨著待壓縮數(shù)據(jù)量的增加,消耗在更新huffman樹上的時(shí)鐘周期數(shù)急劇增加,降低了系統(tǒng)編碼速率,不適合對(duì)編碼速率要求較高且數(shù)據(jù)量巨大的編碼系統(tǒng)。
此外,編碼系統(tǒng)通常應(yīng)該具有與之對(duì)應(yīng)的同樣優(yōu)秀的解碼系統(tǒng)才更具有實(shí)用價(jià)值,然而動(dòng)態(tài)huffman編碼系統(tǒng)每編碼完一個(gè)字符,解碼系統(tǒng)都必須使用和編碼系統(tǒng)相同的算法更新huffman樹后才能解壓縮一個(gè)字符,解壓縮效率的低下也導(dǎo)致動(dòng)態(tài)huffman編碼實(shí)際應(yīng)用并不廣泛。
靜態(tài)huffman編碼系統(tǒng)通過對(duì)待壓縮數(shù)據(jù)的一次掃描,統(tǒng)計(jì)每種字符的出現(xiàn)頻數(shù)后構(gòu)造huffman樹并得到每個(gè)字符對(duì)應(yīng)的的編碼,再對(duì)一次掃描中存儲(chǔ)的待壓縮數(shù)據(jù)進(jìn)行遍歷得到輸出碼流。在具備高速率編碼功能的同時(shí)無需額外的存儲(chǔ)器或復(fù)雜邏輯運(yùn)算電路結(jié)構(gòu),節(jié)約芯片面積的同時(shí)也保證了整體編碼系統(tǒng)的穩(wěn)定性,這些特點(diǎn)使得其在對(duì)編碼速率要求較高且數(shù)據(jù)量巨大的編碼系統(tǒng)應(yīng)用中成為一個(gè)很好的選擇方案。
然而傳統(tǒng)靜態(tài)huffman編碼系統(tǒng)一般是利用高級(jí)編程語言如c/c++語言中豐富的數(shù)據(jù)結(jié)構(gòu)(如結(jié)構(gòu)體變量和枚舉變量)來描述構(gòu)造huffman樹過程中每一個(gè)節(jié)點(diǎn)的數(shù)據(jù)特性(如頻數(shù)、節(jié)點(diǎn)位置關(guān)系、在huffman樹中所處層數(shù))并在軟件開發(fā)平臺(tái)上完成。在vhdl/veriloghdl硬件描述語言中并沒有高級(jí)編程語言中類似結(jié)構(gòu)體或枚舉的數(shù)據(jù)結(jié)構(gòu),無法將傳統(tǒng)靜態(tài)huffman編碼直接移植到vlsi設(shè)計(jì)中。
因此,若想要實(shí)現(xiàn)適用于vlsi設(shè)計(jì)的huffman編碼系統(tǒng),首先必須要在兼顧編碼速率、芯片面積和系統(tǒng)功能穩(wěn)定性的前提下,結(jié)合靜態(tài)huffman樹的構(gòu)造過程提出了一種新的適合huffman編碼器電路實(shí)現(xiàn)的數(shù)據(jù)格式
另一個(gè)問題是傳統(tǒng)靜態(tài)huffman編碼系統(tǒng)中采用先構(gòu)造huffman樹后編碼的算法不適合硬件電路實(shí)現(xiàn)且效率很低,因此必須改進(jìn)靜態(tài)huffman編碼系統(tǒng)中構(gòu)造huffman樹的算法。新算法必須要在構(gòu)造huffman樹的過程中完成每次從隊(duì)列里遞歸找到最小的兩個(gè)節(jié)點(diǎn),并且前一次的遞歸運(yùn)算結(jié)果作為后一次的輸入的同時(shí)完成對(duì)節(jié)點(diǎn)的編碼,即在構(gòu)造huffman樹的過程中完成所有節(jié)點(diǎn)的編碼。最后根據(jù)新的數(shù)據(jù)格式特點(diǎn),在huffman樹所有節(jié)點(diǎn)中快速匹配找到葉子節(jié)點(diǎn)及其對(duì)應(yīng)的編碼。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明的目的是提供一種用于vlsi設(shè)計(jì)的huffman編碼系統(tǒng)及其實(shí)現(xiàn)方法,可用于vlsi設(shè)計(jì)的對(duì)編碼速率要求較高且待壓縮數(shù)據(jù)量巨大的無損壓縮編碼系統(tǒng)。
本發(fā)明采用以下方案實(shí)現(xiàn):一種用于vlsi設(shè)計(jì)的huffman編碼系統(tǒng),包括:
一復(fù)位信號(hào)檢測單元,用以在系統(tǒng)運(yùn)行時(shí)檢測到復(fù)位信號(hào)使能后,使系統(tǒng)異步復(fù)位,并重新初始化編碼系統(tǒng);
一開始信號(hào)檢測單元,用以當(dāng)復(fù)位信號(hào)未使能且開始信號(hào)有效時(shí)啟動(dòng)編碼系統(tǒng),編碼系統(tǒng)開始運(yùn)行;
一輸入數(shù)據(jù)掃描單元,用以對(duì)輸入的待壓縮數(shù)據(jù)進(jìn)行掃描;
一輸入數(shù)據(jù)緩存單元,用于保存掃描后的待壓縮數(shù)據(jù);
一碼字頻數(shù)緩存單元,用以保存待壓縮數(shù)據(jù)中每種字符和它出現(xiàn)的頻數(shù);
一數(shù)據(jù)拼接單元,用以將頻數(shù)、識(shí)別、字符、編碼這四種寄存器變量按順序拼接成與輸入字符種類數(shù)目相同的寄存器變量;
一拼接數(shù)據(jù)緩存單元,用以保存拼接后的數(shù)據(jù);
一huffman樹節(jié)點(diǎn)生成單元,用以按靜態(tài)huffman樹生成節(jié)點(diǎn)的構(gòu)造方法生成所有節(jié)點(diǎn);
一huffman樹節(jié)點(diǎn)緩存單元,用以存放生成的huffman樹的所有節(jié)點(diǎn)數(shù)據(jù);
一huffman樹構(gòu)造編碼單元,用以將生成的所有節(jié)點(diǎn)從上到下逐層構(gòu)造huffman樹,并在構(gòu)造huffman樹的同時(shí)完成對(duì)所有節(jié)點(diǎn)的編碼;
一葉子節(jié)點(diǎn)識(shí)別單元,用以從huffman樹的所有節(jié)點(diǎn)中識(shí)別出葉子節(jié)點(diǎn)及其對(duì)應(yīng)的編碼;
一根節(jié)點(diǎn)編碼位去除單元,用以去掉每個(gè)葉子節(jié)點(diǎn)所對(duì)應(yīng)編碼中的根節(jié)點(diǎn)編碼位,去掉每個(gè)葉子節(jié)點(diǎn)所對(duì)應(yīng)編碼中的根節(jié)點(diǎn)編碼位;
一huffman碼表建立單元,用以建立huffman碼表并得到每個(gè)葉子節(jié)點(diǎn)所對(duì)應(yīng)編碼的長度;
一編碼輸出單元,用以根據(jù)huffman碼表按位輸出編碼結(jié)果;
一編碼輸出結(jié)束標(biāo)志單元,用以表示編碼輸出是否結(jié)束;
一返回開始信號(hào)檢測單元,用以重新檢測開始信號(hào),等待編碼系統(tǒng)再次運(yùn)行。
本發(fā)明還采用以下方案實(shí)現(xiàn):一種用于vlsi設(shè)計(jì)的huffman編碼系統(tǒng)的實(shí)現(xiàn)方法,包括下述步驟:
步驟s1:所述編碼系統(tǒng)運(yùn)行時(shí)對(duì)復(fù)位信號(hào)是否使能進(jìn)行實(shí)時(shí)檢測,若檢測到復(fù)位信號(hào)使能,則使系統(tǒng)異步復(fù)位,并重新初始化編碼系統(tǒng);
步驟s2:當(dāng)復(fù)位信號(hào)未使能且開始信號(hào)有效時(shí),啟動(dòng)編碼系統(tǒng),開始掃描輸入的待壓縮數(shù)據(jù);
步驟s3:對(duì)輸入的待壓縮數(shù)據(jù)進(jìn)行一遍掃描,將輸入的待壓縮數(shù)據(jù)送入輸入數(shù)據(jù)緩存單元,通過加法器實(shí)現(xiàn)每一種字符出現(xiàn)的頻數(shù)進(jìn)行統(tǒng)計(jì),將頻數(shù)統(tǒng)計(jì)結(jié)果送入碼字頻數(shù)緩存單元,將待壓縮數(shù)據(jù)保存入寄存器中;
步驟s4:將字符、頻數(shù)這兩種寄存器變量與識(shí)別、編碼這兩種寄存器變量,依次按頻數(shù)、識(shí)別、字符、編碼的順序分配一定位寬后拼接成與輸入字符種類數(shù)目相同的寄存器變量,此時(shí)初始時(shí)識(shí)別、編碼位均為零,并送入拼接數(shù)據(jù)緩存單元保存;
步驟s5:將按照新數(shù)據(jù)格式構(gòu)造的數(shù)據(jù),采用靜態(tài)huffman樹生成節(jié)點(diǎn)的算法遞歸生成所有節(jié)點(diǎn);
步驟s6:對(duì)根節(jié)點(diǎn)編碼1并初始化第一層的兩個(gè)節(jié)點(diǎn)的編碼,用第一層的節(jié)點(diǎn)匹配出下一層的節(jié)點(diǎn),從上到下逐層構(gòu)造出huffman樹,并在構(gòu)造huffman樹的同時(shí)對(duì)所有節(jié)點(diǎn)進(jìn)行編碼;
步驟s7:對(duì)huffman樹中所有的節(jié)點(diǎn)進(jìn)行識(shí)別,找出所有葉子節(jié)點(diǎn)及其對(duì)應(yīng)的編碼;
步驟s8:去掉每個(gè)葉子節(jié)點(diǎn)所對(duì)應(yīng)編碼中的根節(jié)點(diǎn)編碼位,得到每個(gè)葉子節(jié)點(diǎn)所對(duì)應(yīng)編碼的長度,根據(jù)最后得到的葉子節(jié)點(diǎn)的編碼和編碼長度,建立huffman碼表;
步驟s9:按照huffman碼表按位輸出編碼結(jié)果,編碼結(jié)果全部輸出后,編碼輸出結(jié)束標(biāo)志單元置1,編碼輸出結(jié)束;
步驟s10:返回開始信號(hào)檢測,為系統(tǒng)下一次開始編碼進(jìn)行初始化。
進(jìn)一步地,所述步驟s4中,數(shù)據(jù)拼接單元對(duì)給定的總共m個(gè)n種字符(a0~an-1)和每種字符對(duì)應(yīng)的頻數(shù)、識(shí)別和編碼進(jìn)行拼接,其中拼接的數(shù)據(jù)格式總位寬,由低位至高位依次是編碼n位,字符
進(jìn)一步地,所述步驟s5包括以下步驟:
步驟s51:生成huffman樹中所有節(jié)點(diǎn),huffman樹節(jié)點(diǎn)生成單元在集合f所有的節(jié)點(diǎn)中選取兩個(gè)最小的節(jié)點(diǎn)相加,生成一個(gè)新節(jié)點(diǎn),將新節(jié)點(diǎn)的識(shí)別位加1;
步驟s52:在f中刪除已選取的兩個(gè)最小節(jié)點(diǎn),并將生成的新節(jié)點(diǎn)加入到集合f中;
步驟s53:返回步驟s51,重復(fù)步驟s51與步驟s52,直到集合f中只剩兩個(gè)節(jié)點(diǎn)為止,最后兩個(gè)節(jié)點(diǎn)相加及得到根節(jié)點(diǎn)后即生成了huffman樹中所有節(jié)點(diǎn);將所有生成的huffman樹的節(jié)點(diǎn)數(shù)據(jù)存儲(chǔ)于huffman樹節(jié)點(diǎn)緩存單元,此時(shí)節(jié)點(diǎn)生成的先后順序就是節(jié)點(diǎn)數(shù)據(jù)按升序排列的順序。
進(jìn)一步地,所述步驟s6中構(gòu)造huffman樹,首先huffman樹構(gòu)造編碼單元對(duì)根節(jié)點(diǎn)編碼1,然后根據(jù)所有節(jié)點(diǎn)生成的從后往前順序,從最晚生成的節(jié)點(diǎn)開始,檢測每一個(gè)節(jié)點(diǎn)是否是由在它生成之前的兩個(gè)節(jié)點(diǎn)相加而成,如果是,將當(dāng)前檢測節(jié)點(diǎn)的識(shí)別位加1,如果不是,則當(dāng)前檢測節(jié)點(diǎn)是葉子節(jié)點(diǎn),開始檢測下一個(gè)節(jié)點(diǎn);在構(gòu)造huffman樹的同時(shí),huffman樹構(gòu)造編碼單元根據(jù)每個(gè)節(jié)點(diǎn)在huffman樹上的位置,得到所有節(jié)點(diǎn)的huffman編碼。
進(jìn)一步地,所述步驟s7中,遍歷huffman樹的所有節(jié)點(diǎn),葉子節(jié)點(diǎn)識(shí)別單元將識(shí)別出所有的葉子節(jié)點(diǎn),同時(shí)得到了葉子節(jié)點(diǎn)的編碼,也就是輸入數(shù)據(jù)的編碼,此時(shí)的編碼還不是真實(shí)的huffman編碼,由于每個(gè)編碼的最高位是根節(jié)點(diǎn)的編碼位,在最后的編碼結(jié)果中,這一位是冗余的。
進(jìn)一步地,所述步驟s8中,根節(jié)點(diǎn)編碼位去除單元將所有葉子節(jié)點(diǎn)對(duì)應(yīng)編碼的最高位去除,也就是將根節(jié)點(diǎn)的編碼位去除,得到了每個(gè)葉子節(jié)點(diǎn)真實(shí)的huffman編碼;則此時(shí)huffman碼表建立單元根據(jù)每個(gè)葉子節(jié)點(diǎn)所表示的字符和它對(duì)應(yīng)的編碼建立huffman碼表,并且記錄下每個(gè)葉子節(jié)點(diǎn)對(duì)應(yīng)huffman編碼的編碼長度,也就是最后每個(gè)編碼輸出結(jié)果的編碼長度。
進(jìn)一步地,所述步驟s9中,編碼輸出單元遍歷輸入數(shù)據(jù)緩存單元中保存的待壓縮數(shù)據(jù),根據(jù)huffman碼表建立單元?jiǎng)?chuàng)建的huffman碼表對(duì)輸入的待壓縮碼流數(shù)據(jù)進(jìn)行編碼,得到編碼后的碼流;然后編碼輸出單元從高位到地位,依次按位串行輸出碼流的編碼結(jié)果。
相較于現(xiàn)有技術(shù),本發(fā)明具有以下有益效果:本發(fā)明通過veriloghdl硬件描述語言完成了用于vlsi設(shè)計(jì)的huffman編碼實(shí)現(xiàn)系統(tǒng),并在huffman編碼實(shí)現(xiàn)過程中,提出了一種新的數(shù)據(jù)格式用于構(gòu)造huffman樹并對(duì)所有節(jié)點(diǎn)編碼,采用了新的快速算法實(shí)現(xiàn)了構(gòu)造huffman樹和得到節(jié)點(diǎn)編碼可以同時(shí)進(jìn)行等創(chuàng)新技術(shù),大量邏輯和算術(shù)運(yùn)算使用veriloghdl硬件描述語言實(shí)現(xiàn)的遞歸電路中,使得該發(fā)明可用于vlsi設(shè)計(jì)的對(duì)編碼速率要求較高且待壓縮數(shù)據(jù)量巨大的無損壓縮編碼系統(tǒng)。另外,本發(fā)明通過對(duì)原有靜態(tài)huffman編碼過程的優(yōu)化,簡化了編碼的步驟,提高了編碼的可讀性和可維護(hù)性,節(jié)約了電路面積。其次,采用了更加快速的統(tǒng)計(jì)字符方法以及同時(shí)完成建樹和編碼的技術(shù),使得數(shù)據(jù)的吞吐率有了較大提升,提高了編碼的效率,減小了電路的面積。除此之外,采用了提前清空單元緩存的技術(shù),有利于降低電路的噪聲和干擾。最后,本發(fā)明在編碼過程中使用了新的huffman編碼的方法,使編碼過程更加靈活、快速、高效。該編碼設(shè)計(jì)兼顧了功耗、速度等方面的性能,適合超大規(guī)模集成電路實(shí)現(xiàn)、數(shù)字信號(hào)處理、數(shù)字圖像處理以及數(shù)據(jù)傳輸?shù)阮I(lǐng)域。
附圖說明
圖1是本發(fā)明的一種用于vlsi設(shè)計(jì)的huffman編碼系統(tǒng)的狀態(tài)轉(zhuǎn)換圖。
圖2是本發(fā)明的一種用于vlsi設(shè)計(jì)的huffman編碼系統(tǒng)的數(shù)據(jù)格式圖。
圖3是本發(fā)明的一種用于vlsi設(shè)計(jì)的huffman編碼系統(tǒng)的設(shè)計(jì)流程圖。
圖4是本發(fā)明的huffman編碼的仿真電路時(shí)序說明圖。
圖5是本發(fā)明的huffman編碼時(shí)鐘周期的modelsim仿真結(jié)果圖。
圖6是本發(fā)明的huffman編碼結(jié)果輸出的modelsim仿真結(jié)果圖。
具體實(shí)施方式
下面結(jié)合附圖及實(shí)施例對(duì)本發(fā)明做進(jìn)一步說明。
本實(shí)施例提供一種用于vlsi設(shè)計(jì)的huffman編碼系統(tǒng),包括:
一復(fù)位信號(hào)檢測單元,用以在系統(tǒng)運(yùn)行時(shí)檢測到復(fù)位信號(hào)使能后,使系統(tǒng)異步復(fù)位,并重新初始化編碼系統(tǒng);
一開始信號(hào)檢測單元,用以當(dāng)復(fù)位信號(hào)未使能且開始信號(hào)有效時(shí)啟動(dòng)編碼系統(tǒng),編碼系統(tǒng)開始運(yùn)行;
一輸入數(shù)據(jù)掃描單元,用以對(duì)輸入的待壓縮數(shù)據(jù)進(jìn)行掃描;
一輸入數(shù)據(jù)緩存單元,用于保存掃描后的待壓縮數(shù)據(jù);
一碼字頻數(shù)緩存單元,用以保存待壓縮數(shù)據(jù)中每種字符和它出現(xiàn)的頻數(shù);
一數(shù)據(jù)拼接單元,用以將頻數(shù)、識(shí)別、字符、編碼這四種寄存器變量按順序拼接成與輸入字符種類數(shù)目相同的寄存器變量;
一拼接數(shù)據(jù)緩存單元,用以保存拼接后的數(shù)據(jù);
一huffman樹節(jié)點(diǎn)生成單元,用以按靜態(tài)huffman樹生成節(jié)點(diǎn)的構(gòu)造方法生成所有節(jié)點(diǎn);
一huffman樹節(jié)點(diǎn)緩存單元,用以存放生成的huffman樹的所有節(jié)點(diǎn)數(shù)據(jù);
一huffman樹構(gòu)造編碼單元,用以將生成的所有節(jié)點(diǎn)從上到下逐層構(gòu)造huffman樹,并在構(gòu)造huffman樹的同時(shí)完成對(duì)所有節(jié)點(diǎn)的編碼;
一葉子節(jié)點(diǎn)識(shí)別單元,用以從huffman樹的所有節(jié)點(diǎn)中識(shí)別出葉子節(jié)點(diǎn)及其對(duì)應(yīng)的編碼;
一根節(jié)點(diǎn)編碼位去除單元,用以去掉每個(gè)葉子節(jié)點(diǎn)所對(duì)應(yīng)編碼中的根節(jié)點(diǎn)編碼位,去掉每個(gè)葉子節(jié)點(diǎn)所對(duì)應(yīng)編碼中的根節(jié)點(diǎn)編碼位;
一huffman碼表建立單元,用以建立huffman碼表并得到每個(gè)葉子節(jié)點(diǎn)所對(duì)應(yīng)編碼的長度;
一編碼輸出單元,用以根據(jù)huffman碼表按位輸出編碼結(jié)果;
一編碼輸出結(jié)束標(biāo)志單元,用以表示編碼輸出是否結(jié)束;
一返回開始信號(hào)檢測單元,用以重新檢測開始信號(hào),等待編碼系統(tǒng)再次運(yùn)行。
在本實(shí)施例中,一種用于vlsi設(shè)計(jì)的huffman編碼系統(tǒng)的實(shí)現(xiàn)方法,包括下述步驟:
步驟s1:所述編碼系統(tǒng)運(yùn)行時(shí)對(duì)復(fù)位信號(hào)是否使能進(jìn)行實(shí)時(shí)檢測,若檢測到復(fù)位信號(hào)使能,則使系統(tǒng)異步復(fù)位,并重新初始化編碼系統(tǒng);
步驟s2:當(dāng)復(fù)位信號(hào)未使能且開始信號(hào)有效時(shí),啟動(dòng)編碼系統(tǒng),開始掃描輸入的待壓縮數(shù)據(jù);
步驟s3:對(duì)輸入的待壓縮數(shù)據(jù)進(jìn)行一遍掃描,將輸入的待壓縮數(shù)據(jù)送入輸入數(shù)據(jù)緩存單元,通過加法器實(shí)現(xiàn)每一種字符出現(xiàn)的頻數(shù)進(jìn)行統(tǒng)計(jì),將頻數(shù)統(tǒng)計(jì)結(jié)果送入碼字頻數(shù)緩存單元,將待壓縮數(shù)據(jù)保存入寄存器中;
步驟s4:將字符、頻數(shù)這兩種寄存器變量與識(shí)別、編碼這兩種寄存器變量,依次按頻數(shù)、識(shí)別、字符、編碼的順序分配一定位寬后拼接成與輸入字符種類數(shù)目相同的寄存器變量,此時(shí)初始時(shí)識(shí)別、編碼位均為零,并送入拼接數(shù)據(jù)緩存單元保存;
步驟s5:將按照新數(shù)據(jù)格式構(gòu)造的數(shù)據(jù),采用靜態(tài)huffman樹生成節(jié)點(diǎn)的算法遞歸生成所有節(jié)點(diǎn);
步驟s6:對(duì)根節(jié)點(diǎn)編碼1并初始化第一層的兩個(gè)節(jié)點(diǎn)的編碼,用第一層的節(jié)點(diǎn)匹配出下一層的節(jié)點(diǎn),從上到下逐層構(gòu)造出huffman樹,并在構(gòu)造huffman樹的同時(shí)對(duì)所有節(jié)點(diǎn)進(jìn)行編碼;
步驟s7:對(duì)huffman樹中所有的節(jié)點(diǎn)進(jìn)行識(shí)別,找出所有葉子節(jié)點(diǎn)及其對(duì)應(yīng)的編碼;
步驟s8:去掉每個(gè)葉子節(jié)點(diǎn)所對(duì)應(yīng)編碼中的根節(jié)點(diǎn)編碼位,得到每個(gè)葉子節(jié)點(diǎn)所對(duì)應(yīng)編碼的長度,根據(jù)最后得到的葉子節(jié)點(diǎn)的編碼和編碼長度,建立huffman碼表;
步驟s9:按照huffman碼表按位輸出編碼結(jié)果,編碼結(jié)果全部輸出后,編碼輸出結(jié)束標(biāo)志單元置1,編碼輸出結(jié)束;
步驟s10:返回開始信號(hào)檢測,為系統(tǒng)下一次開始編碼進(jìn)行初始化。
在本實(shí)施例中,所述步驟s4中,數(shù)據(jù)拼接單元對(duì)給定的總共m個(gè)n種字符(a0~an-1)和每種字符對(duì)應(yīng)的頻數(shù)、識(shí)別和編碼進(jìn)行拼接,其中拼接的數(shù)據(jù)格式總位寬,由低位至高位依次是編碼n位,
字符
在本實(shí)施例中,所述步驟s5包括以下步驟:
步驟s51:生成huffman樹中所有節(jié)點(diǎn),huffman樹節(jié)點(diǎn)生成單元在集合f所有的節(jié)點(diǎn)中選取兩個(gè)最小的節(jié)點(diǎn)相加,生成一個(gè)新節(jié)點(diǎn),將新節(jié)點(diǎn)的識(shí)別位加1;
步驟s52:在f中刪除已選取的兩個(gè)最小節(jié)點(diǎn),并將生成的新節(jié)點(diǎn)加入到集合f中;
步驟s53:返回步驟s51,重復(fù)步驟s51與步驟s52,直到集合f中只剩兩個(gè)節(jié)點(diǎn)為止,最后兩個(gè)節(jié)點(diǎn)相加及得到根節(jié)點(diǎn)后即生成了huffman樹中所有節(jié)點(diǎn);將所有生成的huffman樹的節(jié)點(diǎn)數(shù)據(jù)存儲(chǔ)于huffman樹節(jié)點(diǎn)緩存單元,此時(shí)節(jié)點(diǎn)生成的先后順序就是節(jié)點(diǎn)數(shù)據(jù)按升序排列的順序。
在本實(shí)施例中,所述步驟s6中構(gòu)造huffman樹,首先huffman樹構(gòu)造編碼單元對(duì)根節(jié)點(diǎn)編碼1,然后根據(jù)所有節(jié)點(diǎn)生成的從后往前順序,從最晚生成的節(jié)點(diǎn)開始,檢測每一個(gè)節(jié)點(diǎn)是否是由在它生成之前的兩個(gè)節(jié)點(diǎn)相加而成,如果是,將當(dāng)前檢測節(jié)點(diǎn)的識(shí)別位加1,如果不是,則當(dāng)前檢測節(jié)點(diǎn)是葉子節(jié)點(diǎn),開始檢測下一個(gè)節(jié)點(diǎn);在構(gòu)造huffman樹的同時(shí),huffman樹構(gòu)造編碼單元根據(jù)每個(gè)節(jié)點(diǎn)在huffman樹上的位置,得到所有節(jié)點(diǎn)的huffman編碼。
在本實(shí)施例中,所述步驟s7中,遍歷huffman樹的所有節(jié)點(diǎn),葉子節(jié)點(diǎn)識(shí)別單元將識(shí)別出所有的葉子節(jié)點(diǎn),同時(shí)得到了葉子節(jié)點(diǎn)的編碼,也就是輸入數(shù)據(jù)的編碼,此時(shí)的編碼還不是真實(shí)的huffman編碼,由于每個(gè)編碼的最高位是根節(jié)點(diǎn)的編碼位,在最后的編碼結(jié)果中,這一位是冗余的。
在本實(shí)施例中,所述步驟s8中,根節(jié)點(diǎn)編碼位去除單元將所有葉子節(jié)點(diǎn)對(duì)應(yīng)編碼的最高位去除,也就是將根節(jié)點(diǎn)的編碼位去除,得到了每個(gè)葉子節(jié)點(diǎn)真實(shí)的huffman編碼;則此時(shí)huffman碼表建立單元根據(jù)每個(gè)葉子節(jié)點(diǎn)所表示的字符和它對(duì)應(yīng)的編碼建立huffman碼表,并且記錄下每個(gè)葉子節(jié)點(diǎn)對(duì)應(yīng)huffman編碼的編碼長度,也就是最后每個(gè)編碼輸出結(jié)果的編碼長度。
在本實(shí)施例中,所述步驟s9中,編碼輸出單元遍歷輸入數(shù)據(jù)緩存單元中保存的待壓縮數(shù)據(jù),根據(jù)huffman碼表建立單元?jiǎng)?chuàng)建的huffman碼表對(duì)輸入的待壓縮碼流數(shù)據(jù)進(jìn)行編碼,得到編碼后的碼流;然后編碼輸出單元從高位到地位,依次按位串行輸出碼流的編碼結(jié)果。
在本實(shí)施例中,結(jié)合狀態(tài)轉(zhuǎn)換圖進(jìn)行進(jìn)一步描述。
如圖1所示,一種用于vlsi設(shè)計(jì)的huffman編碼系統(tǒng)的實(shí)現(xiàn)方法的狀態(tài)轉(zhuǎn)換圖,主要狀態(tài)包括:狀態(tài)s0~狀態(tài)s18。
采用一段式mealy型狀態(tài)機(jī)結(jié)構(gòu),編碼過程在狀態(tài)跳轉(zhuǎn)中完成,編碼過程中的大量運(yùn)算都采用遞歸結(jié)構(gòu),為數(shù)據(jù)實(shí)現(xiàn)高速實(shí)時(shí)處理做了充分準(zhǔn)備,復(fù)用寄存器資源減少寄存器和存儲(chǔ)器使用個(gè)數(shù)。
狀態(tài)s0,初始化編碼系統(tǒng),清零頻數(shù)統(tǒng)計(jì),當(dāng)復(fù)位信號(hào)未使能且開始信號(hào)有效時(shí)啟動(dòng)編碼系統(tǒng),跳轉(zhuǎn)到s1狀態(tài)。
狀態(tài)s1,編碼系統(tǒng)開始運(yùn)行并對(duì)輸入的待壓縮數(shù)據(jù)進(jìn)行一遍掃描,將輸入的待壓縮數(shù)據(jù)送入輸入數(shù)據(jù)緩存單元;通過加法器對(duì)每一種字符出現(xiàn)的頻數(shù)進(jìn)行統(tǒng)計(jì),并將頻數(shù)統(tǒng)計(jì)結(jié)果送入碼字頻數(shù)緩存單元,將待壓縮數(shù)據(jù)保存入寄存器中。完成后跳轉(zhuǎn)到s2狀態(tài)。
狀態(tài)s2~s4,在設(shè)計(jì)編碼系統(tǒng)時(shí)根據(jù)編碼系統(tǒng)具體應(yīng)用的特點(diǎn),將頻數(shù)、識(shí)別、字符、編碼這四個(gè)變量轉(zhuǎn)換成二進(jìn)制表示,且新拼接的數(shù)據(jù)總位寬及其中各個(gè)變量的位寬可以視其具體編碼的數(shù)據(jù)特點(diǎn)和待壓縮數(shù)據(jù)量確定。按如圖2所示數(shù)據(jù)格式拼接生成變量(初始時(shí)識(shí)別位、編碼位均為零),若待壓縮數(shù)據(jù)中字符種類用n表示,則按新數(shù)據(jù)格式拼接成n個(gè)變量并存儲(chǔ)備份后跳轉(zhuǎn)到s5狀態(tài),其中備份的數(shù)據(jù)將用于狀態(tài)s11~s12中識(shí)別出葉子節(jié)點(diǎn)及其對(duì)應(yīng)的編碼。
狀態(tài)s5~s7,按“每次從數(shù)據(jù)隊(duì)列中取出值最小的兩個(gè)作為節(jié)點(diǎn)求和后再入隊(duì)并刪除找到的兩個(gè)值最小的,直到隊(duì)列里只剩兩個(gè)元素作為huffman樹中第一層的兩個(gè)節(jié)點(diǎn)”算法,遞歸生成2n-2個(gè)節(jié)點(diǎn)后跳轉(zhuǎn)到s8。
狀態(tài)s8~s10,對(duì)根節(jié)點(diǎn)編碼1(根節(jié)點(diǎn)編碼位用于狀態(tài)s13~s14中得到編碼長度)并初始化第一層的兩個(gè)節(jié)點(diǎn)的編碼(本系統(tǒng)實(shí)現(xiàn)方法中規(guī)定huffman樹中第0層是根節(jié)點(diǎn))后無條件跳轉(zhuǎn)到s9。在狀態(tài)s9中用第一層的節(jié)點(diǎn)匹配出下一層的節(jié)點(diǎn),從上到下逐層構(gòu)造huffman樹,并在構(gòu)造huffman樹的同時(shí)完成對(duì)所有節(jié)點(diǎn)的編碼,在逐層構(gòu)造huffman樹時(shí)通過s10狀態(tài)判斷下一次需要匹配建樹是左或右節(jié)點(diǎn)。構(gòu)造huffman樹完成后跳轉(zhuǎn)到s11。
狀態(tài)s11~s12,用狀態(tài)s2~s4狀態(tài)中備份的數(shù)據(jù),從huffman樹的所有節(jié)點(diǎn)中識(shí)別出n個(gè)葉子節(jié)點(diǎn)及其對(duì)應(yīng)的編碼后跳轉(zhuǎn)到狀態(tài)s13。
狀態(tài)s13~s14,去掉每個(gè)葉子節(jié)點(diǎn)所對(duì)應(yīng)編碼中的根節(jié)點(diǎn)編碼位并得到每個(gè)葉子節(jié)點(diǎn)的編碼長度后跳轉(zhuǎn)到狀態(tài)s15。
狀態(tài)s15~s17,輸出編碼后的結(jié)果,先按位輸出每個(gè)元素的編碼,然后按位輸出數(shù)據(jù)序列對(duì)應(yīng)的huffman編碼序列,全部輸出結(jié)束后跳轉(zhuǎn)到狀態(tài)s18.
狀態(tài)s18,輸出編碼結(jié)束標(biāo)志位后跳轉(zhuǎn)到狀態(tài)s0,等待下一次編碼任務(wù)。
在本實(shí)施例中,huffman編碼系統(tǒng)如圖3所示;結(jié)合圖4~5,描述huffman編碼實(shí)現(xiàn)系統(tǒng)對(duì)一段串行數(shù)據(jù)序列進(jìn)行編碼。本實(shí)施例采用的方案是對(duì)對(duì)一段串行數(shù)據(jù)序列進(jìn)行huffman編碼器的仿真驗(yàn)證,通過觀察輸出各元素編碼和編碼后的數(shù)據(jù)序列檢驗(yàn)huffman編碼器設(shè)計(jì)的正確性。通過統(tǒng)計(jì)total_cycles的時(shí)鐘周期個(gè)數(shù)檢驗(yàn)編碼性能,即時(shí)鐘周期數(shù)越少,性能越高。
本實(shí)施例設(shè)計(jì)如下:
(1)組成輸入串行數(shù)據(jù)序列的元素是[0~9]這10個(gè)阿拉伯?dāng)?shù)字,每個(gè)數(shù)字用其對(duì)應(yīng)的4位二進(jìn)制數(shù)表示,例如5對(duì)應(yīng)0101,9對(duì)應(yīng)1001。輸入數(shù)據(jù)序列長度為256。
(2)復(fù)位之后,當(dāng)start信號(hào)高有效后開始連續(xù)串行輸入256個(gè)元素,data_in數(shù)據(jù)寬度為4,輸入需要256個(gè)時(shí)鐘周期。
(3)code_start信號(hào)高有效后進(jìn)行huffman編碼,經(jīng)過編碼運(yùn)算后,code_done信號(hào)高有效表明整個(gè)編碼過程結(jié)束。
(4)輸出編碼后的結(jié)果,先輸出每個(gè)元素的編碼,然后輸出數(shù)據(jù)序列對(duì)應(yīng)的huffman編碼序列,電路時(shí)序圖4所示。
在本實(shí)施例中,在modelsim軟件上進(jìn)行仿真驗(yàn)證,仿真結(jié)果如圖5所示。code_start信號(hào)高有效后到code_done的total_cycles數(shù)為584個(gè),編碼結(jié)果開始按位串行輸出。
在本實(shí)施例中,編碼結(jié)果如圖6所示,按huffman編碼表檢驗(yàn)output_data串行輸出的數(shù)據(jù)即可驗(yàn)證。
以上所述僅為本發(fā)明的較佳實(shí)施例,凡依本發(fā)明申請(qǐng)專利范圍所做的均等變化與修飾,皆應(yīng)屬本發(fā)明的涵蓋范圍。