
總體:大致下面幾個模塊。我們的卷積碼是(2,1,9),所以有256個狀態。首先是control模塊輸出所有控制信號,保證其他模塊有序譯碼。然后是bmg模塊,根據輸入的卷積碼CODE,判斷256個狀態512個分支的漢明距,即分支度量值,發送給acs.然后asc模塊從RAM里面的metricmemory里面取出前一級的256個狀態路徑度量值,與bmg送來的漢明距離,相加以后,進行比較,選擇路徑度量值較小的分支,最終得到256個狀態的路徑度量值,存儲到RAM,并且把256個狀態里面最小狀態傳給TBU回溯模塊。把256個狀態的幸存比特信息傳給MMU。MMU一次從ACS得到4個狀態的幸存比特信息,將其拼接成8個狀態,存入RAM中。然后當TB-EN使能信號有效,開始回溯時,TBU模塊給RAM發11位的地址,從RAM里面尋找當前狀態的幸存比特信息,RAM把信息傳給MMU,通過MMU傳給TB模塊。最后TB模塊輸出解碼。
testbench.v建立原始時鐘信號,時鐘周期是100ns,頻率10MHz。再建立復位信號,低有效。Active信號為1,開始工作。創建編碼器時鐘D_CLOCK。
最后設置輸入碼字X或者卷積碼code。T=DPERIOD=64*400ns。實例化編碼器,輸出卷積碼。實例化解碼器,輸出解碼。
DPERIOD =128*200=64*400,ACS模塊時鐘是clock1,2,周期是400.ACS模塊里面有四個并行加比選單元,一個周期完成四個狀態的加比選。然后迭代64次,才完成256個狀態加比選,所以需要64個clock2。
仿真結果:
1.帶有編碼器。輸入碼字X給卷積編碼器,編碼器輸出卷積碼CODE給解碼器,解碼器輸出DECODEOUT。如圖正確解碼。

下面兩圖是輸入碼字X,和解碼輸出碼字DecodeOut,我們可以直觀地看出兩者一致。


2.不帶編碼器。直接輸入卷積碼CODE給解碼器,解碼器輸出DECODEOUT。如圖正確解碼,下圖的輸入卷積碼是和上圖X輸入,在編碼器生成的卷積碼一致。有圖可見,波形一致,仿真正確。

3.維特比譯碼有一定的糾錯能力,下圖驗證。因為維特比會選擇一個路徑度量最小的狀態回溯,也即差錯最小。可以看到錯誤代碼中,lowestmetric不再為0,說明有差錯,差錯狀態的路徑度量值為10h.
correctcode代碼

errorcode代碼

仿真結果:
ACSPage<=111_111;Hold<= 0;Init <=0; TB_EN <= 0;CompareStart <= 0;
2.CLOCK周期為100ns

3.看出count為二分頻,最終Clock1,Clock2都為Clock的四分頻,T=400ns。
并且,Clock2超前Clock1,90度。Clock1=1100時,Clock2=1001。
因為有的信號操作需要其他信號保持一段時間。所以利用相位差90度,將有些信號在使用前設置好,防止沖突延遲。
例如ASC里面最小路徑產生模塊。其功能是找出256個狀態中路徑度量最小的狀態。它在Clock2下降沿更新最小狀態,最后在Clock1下降沿輸出。由于Clock2超前Clock1,剛好可以在更新完最后一個狀態與重新進行下次256個狀態的比較之間,輸出最小狀態。

一個碼字的輸入時間就是計數64個ACSSegment。一個碼字在4個并行ACS單元下迭代64次,才能完成256個狀態的路徑度量值比較。
Init信號標志著一個碼元處理的開始,在Clock1的上升沿,且ACSSegment=3F的時候為1,持續一個Clock1。
Hold信號標志著一個碼元處理的結束,在Clock1的上升沿,且ACSSegment=3EH的時候為1,持續一個Clock1.

5.ACSPage = 'h3E且ACSSegment = 'h3F時,TB_EN為1,TB單元使能,路徑開始回溯。

6.在Clock2的上升沿。comparecount計數到8以后并且ACSSegment = 6'h3F(init)。CompareStart <= 1,開始比較。對于前8個碼字不進行比較。幸存者來自“0”分支,上支路。

從全0狀態起始點開始討論。到9級及以后,每個狀態都有兩支路,才需要加比選。


ASCUNIT模塊分為三塊。一是四個并行的ASC單元,二是RAM Interface(RAM 接口模塊),三是Lowest Pick block(最小路徑選擇模塊)。
功能:ACS 單元從路徑度量存儲模單元中取出前一時刻幸存路徑的度量值, 然后與送入 ACS 單元的分支度量值累計相加進行比較,相加度量值較小的作為該狀態新的路徑度量值存入RAM里的MetricMemory以備下一時刻加比選使用。并產生幸存比特信息survivor 給MMU模塊。這個幸存信息表示在加比選操作中,表征該狀態是由前一時刻進入該狀態的哪條分支轉移而來的,當 survivor =0 時表示該狀態是由偶狀態(即上支路)轉移而來,當 survivor =1 時表示該狀態是由奇狀態(即下支路)轉移而來。
最后把256個狀態里面最小狀態傳給TBU回溯模塊。
仿真結果:




3.找到256個狀態最小狀態的功能。如圖,只有在前四個狀態八個分支輸入的Distance=16'b1000_0101_0110_0101; //2 0 1 1 1 2 1 1 ;其余情況漢明距離均為1.又因為初始存儲的路徑度量值為0.故其,路徑度量值最小的狀態為0對應的狀態,狀態號為3,和仿真一致。

4.和RAM接口模塊,存入和讀取路徑度量值。MMBlockSelect=0為A寫B讀。在下一個碼字輸入時,MMBlockSelect翻轉。例如,寫A讀B時,實現先讀取B中上一級的256個狀態路徑度量值,用于加比選,同時把加比選的結果存入A。然后下一狀態讀A寫B,交替操作,實現同時讀寫。
A,B都是64個32bit的存儲模塊。64*4*8
下圖仿真中,可以看到先是寫A讀B,在第一個碼字輸入時,取出的MMpathmetirc為0。然后第一個碼字結束后,全部存入256個狀態的路徑度量值在A中。在一個碼字來時,讀A,
MMpathmetirc先為64H0101010100010101,可以看到3-0狀態,路徑度量值為0111,和之前輸入一致。其余時刻均為64H0101010101010101(路徑度量值都是1)

output [`WD_FSM-1:0] MMWriteAddress; //6位,一次寫入4個狀態。64*4=256
MMReadAddress <= ACSSegment [`WD_FSM-2:0]; //低五位。0-31
MMWriteAddress = ACSSegment; //寫地址6bit 為什么讀地址是五位,寫地址是6位。
因為四個狀態,有8個分支,對應著前面8個狀態。所以需要讀出8個狀態的路徑度量值。
如當 ACSSegment為ABCDEF時,他對應的4個狀態是這樣,它對應的前八個狀態一定是BCDEF對應的8個狀態。前后狀態只有一位不同,相當于右移一位,輸入放最高位。所以只需要ACSSegment低五位,就可以讀出對應的前8個狀態路徑度量值。另一方面,讀地址5BIT,尋址32個,即32*8=256,實現256個狀態的讀取。32個,32*8=256個狀態。寫地址6BIT,尋址64個,一次寫4個狀態,64*4=256,完成256個狀態的存入。


以上8個.v文件下載(verilog程序):
維特比編碼譯碼器.zip
(1.49 MB, 下載次數: 87)
| 歡迎光臨 (http://m.raoushi.com/bbs/) | Powered by Discuz! X3.1 |