摘 要: 介紹并用VHDL語言實(shí)現(xiàn)了卷積編碼和維特比譯碼。根據(jù)編碼器特征設(shè)計(jì)了一種具有針對(duì)性的簡潔的維特比譯碼器結(jié)構(gòu),并通過ModelSim平臺(tái)驗(yàn)證了該設(shè)計(jì)的正確性。
關(guān)鍵詞: VHDL卷積碼; 維特比譯碼; ModelSim
卷積碼自1955年由愛里斯(Elias)提出以來,因其良好的糾錯(cuò)能力,已經(jīng)在現(xiàn)代通信系統(tǒng)中得到了廣泛應(yīng)用,比如,電力系統(tǒng)通信、衛(wèi)星通信、移動(dòng)通信等。Viterbi譯碼是1967年維特比(Viterbi)基于Viterbi算法提出的,這種譯碼算法是基于碼的網(wǎng)格(trellis)圖基礎(chǔ)之上的一種最大似然譯碼算法,是一種最佳的概率譯碼算法[1]。本設(shè)計(jì)是在認(rèn)真研究了卷積編碼和維特比譯碼原理以后,用VHDL語言實(shí)現(xiàn)了(2,1,2)卷積編碼,并根據(jù)這種編碼特性簡化了相應(yīng)的維特比譯碼器結(jié)構(gòu)。
1 卷積編碼
卷積碼是一種有限記憶系統(tǒng),它與分組碼類似,也是先將信息序列分隔成長度為k的一個(gè)個(gè)分組;不同的是,某一時(shí)刻的編碼輸出不僅取決于本時(shí)刻的分組,而且取決于本時(shí)刻以前的L個(gè)分組[2],稱L+1為約束長度。一般情況下卷積碼寫成(n,k,L)的形式,其中:n表示編碼器有n位編碼輸出,k表示編碼器有k位輸入。如果用R表示卷積編碼的效率,則R=k/n。
圖1是(n,k,L)卷積編碼器的一般結(jié)構(gòu)圖[2]。從該圖可以看出,串行信號(hào)可由串/并轉(zhuǎn)換器轉(zhuǎn)換成L個(gè)分組,并按位存儲(chǔ)到k-1個(gè)存儲(chǔ)器中,存儲(chǔ)器中的每一個(gè)單元與線性組合器的連線表示該單元數(shù)據(jù)參與了線性組合計(jì)算,但實(shí)際中是否參與取決于線性組合系數(shù)。在二進(jìn)制系統(tǒng)中,該系數(shù)為“0”和“1”,當(dāng)系數(shù)為“0”時(shí),表示該單元數(shù)據(jù)沒參與線性組合計(jì)算;當(dāng)系數(shù)為“1”時(shí),表示該單元數(shù)據(jù)參與了線性組合計(jì)算。并/串轉(zhuǎn)換器可將線性組合器計(jì)算得到的并行結(jié)果轉(zhuǎn)化成串行輸出。
圖1示意的是卷積編碼器的一般結(jié)構(gòu),實(shí)際應(yīng)用時(shí)可根據(jù)需求進(jìn)行相應(yīng)改變。例如圖2是(2,1,2)碼的編碼器,由于只有一位輸入,串/并轉(zhuǎn)換器自然不存在,線性組合器就是兩個(gè)模2加法器,存儲(chǔ)單元由兩個(gè)移位寄存器組成,其生成多項(xiàng)式矩陣可表示為:G(D)=[1+D+D2,1+D2]。
圖3是圖2所示卷積碼的狀態(tài)轉(zhuǎn)移圖,根據(jù)這個(gè)狀態(tài)轉(zhuǎn)移圖用VHDL語言實(shí)現(xiàn)卷積編碼。圖3中S0、S1、S2、S3表示該卷積碼的4個(gè)不同狀態(tài),編程時(shí)用狀態(tài)機(jī)完成狀態(tài)之間的跳變和編碼輸出?!?/p>
部分程序如下:
……
if(clk1=′1′) then
state <=next_state;
……
else
state <=state;
……
case state is
when "00" =>
if(datain = ′0′) then
next_state <= "00";
enc_out <= "00";
else
next_state <= "10";
enc_out <= "11";
end if;
when "01" =>
……
其中,clk1為編碼時(shí)鐘(另一時(shí)鐘是碼輸入時(shí)鐘,為clk1的2倍頻),state為本次編碼狀態(tài),并根據(jù)它的值和數(shù)據(jù)輸入(datain)的值給出卷積碼的下一個(gè)狀態(tài)值(next_state)和編碼輸出值(enc_out)。如此往復(fù)循環(huán)下去,便可得到卷積碼。
2 維特比譯碼
維特比譯碼算法是一種最大似然譯碼算法。根據(jù)維特比譯碼算法的譯碼步驟,譯碼算法的實(shí)現(xiàn)一般包括:加比選模塊、度量查找表、狀態(tài)變量存儲(chǔ)器等模塊,如圖4所示。本設(shè)計(jì)根據(jù)該卷積碼的特性,找到一種簡便的改進(jìn)譯碼方法。
通過圖3可知,到達(dá)每一狀態(tài)的輸入碼均相同。例如,無論是由S0轉(zhuǎn)變成S1還是由S2轉(zhuǎn)變成S1,雖然編碼輸出段不一樣,但是碼輸入都是‘1’,其他狀態(tài)之間的轉(zhuǎn)變也是如此。因而,通過這個(gè)特征可以去掉該卷積碼的維特比譯碼實(shí)現(xiàn)時(shí)的度量查找表和路徑存儲(chǔ)器等模塊,只保留加比選模塊即可,如圖5所示,從而簡化了維特比譯碼算法的實(shí)現(xiàn)。再結(jié)合該卷積碼的狀態(tài)轉(zhuǎn)移圖,畫出相應(yīng)籬笆圖,如圖6所示。
在這個(gè)譯碼器結(jié)構(gòu)中,“加”是指計(jì)算在該時(shí)刻實(shí)際編碼輸入與圖3中狀態(tài)轉(zhuǎn)移編碼輸出之間的漢明距,“比”是指比較出上述漢明距最小距離,“選”是指通過“比”的結(jié)果選擇一位最佳碼字輸出。按照這一結(jié)構(gòu),在本時(shí)刻即可得到一位最佳輸出碼字,例如,在L=0時(shí)刻時(shí),實(shí)際編碼輸入若為“01”或“10”,則可以通過判斷L=1時(shí)刻的實(shí)際編碼輸入來選擇一位最佳碼字輸出。本設(shè)計(jì)運(yùn)用VHDL語言編程實(shí)現(xiàn)這一譯碼過程時(shí),采用了兩個(gè)時(shí)鐘,在一個(gè)clk周期內(nèi)將16 bit卷積碼輸入到譯碼器內(nèi),然后再由其8倍頻時(shí)鐘clk1完成“加”、“比”、“選”、譯碼輸出等動(dòng)作。由于信號(hào)只能采用阻塞賦值,因而,“加”與“比”、“選”分別在兩個(gè)clk1時(shí)鐘周期內(nèi)完成,并且“加”先于后兩者1個(gè)時(shí)鐘周期。
3 仿真結(jié)果
3.1 卷積編碼仿真結(jié)果
依據(jù)“卷積編碼”單元分析,運(yùn)用VHDL語言在ModelSim下實(shí)現(xiàn)的圖2編碼器仿真結(jié)果,如圖7所示,當(dāng)輸入碼分別為:10111000、11000000、01001000時(shí),對(duì)應(yīng)輸出碼序列:1110000110011100、1101011100000000、0011101111101100。
可以通過輸入碼和生成多項(xiàng)式矩陣來驗(yàn)證此卷積編碼是正確有效的。圖7中dataouta為編碼輸出端,clr為編碼器清零端,datain為串行碼輸入端,clk為碼輸入時(shí)鐘,clk1為編碼時(shí)鐘。
3.2 維特比譯碼仿真結(jié)果
依據(jù)“維特比譯碼”單元分析,運(yùn)用VHDL語言在ModelSim下實(shí)現(xiàn)的圖5譯碼器仿真結(jié)果如圖8所示,當(dāng)輸入碼分別為:1110000110011100、1101011100000000、0011101111101100時(shí),對(duì)應(yīng)輸出碼序列為:10111000、11000000、01001000。
圖8中c_out為譯碼輸出端,clr_viterbi_acs為譯碼器清零端,c_in為卷積碼并行輸入端,clk為譯碼處理時(shí)鐘,clk2為并行碼輸入時(shí)鐘。
本文利用VHDL語言在ModelSim平臺(tái)上實(shí)現(xiàn)與驗(yàn)證了(2,1,2)卷積編碼和維特比譯碼,并根據(jù)給出的編碼器的特征簡化了譯碼器結(jié)構(gòu),從而減小了用VHDL語言編程的復(fù)雜度,同時(shí)也提高了程序的健壯性。該設(shè)計(jì)可以為同類型采用卷積編碼和維特比譯碼的方案提供一定的幫助。
參考文獻(xiàn)
[1] 王新梅,肖國鎮(zhèn).糾錯(cuò)碼——原理與方法[M].西安:西安電子科技大學(xué)出版社,2001.
[2] 曹雪虹.信息論與編碼[M].北京:清華大學(xué)出版社,2004.