LDPC譯碼器的FPGA實現

應用筆記 算法

V0.0 2015/3/17編程

LDPC譯碼器的FPGA實現緩存

 

概述模塊化

 

本文將介紹LDPC譯碼器的FPGA實現,譯碼器設計對應CCSDS131x1o1s文檔中提到的適用於深空通訊任務的LDPC編碼。本文檔將簡述Verilog代碼的基本結構和信號說明。 性能

修訂歷史學習

如下表格展現了本文檔的修訂過程 編碼

日期spa

版本號設計

修訂內容3d

2015/03/16

V1.0

初始版本,ISim仿真基本正確

 

簡介

 

本文中FPGA實現特指經過Verilog HDL實現LDPC譯碼器功能,然而對於VHDL來講也似相似的的。Verilog HDL不像MATLAB代碼那樣有很強的通用性,或者說我暫時編不出通用性太好的代碼。所以,這裏的FPGA實現僅針對CCSDS文檔(06版)中1024信息位1/2碼率的適用於深空通訊LDPC碼,採用最小和算法下的實現。因爲在截位補零下最小和算法性能奇差,所以此處不作補零處理,即碼率實際爲0.4。

LDPC相關文檔包括《程序說明:LDPC編碼(CCSDS)算法概述》、《程序說明:LDPC譯碼算法概述》、《學習筆記:LDPC編譯碼基本原理》以及《CCSDS_LDPC_V1》(代碼),同時與本文檔同名的學習筆記將闡述編程過程和思路,都可做爲本文檔的參考。

譯碼器的輸入輸出至少應該包括如下信號

input clk;                //時鐘

input rst;                //復位信號,高有效

input decode_start;    //開始譯碼信號,持續高電平一個clock有效

output output_ready;    //開始輸出

output frame_error;    //輸出結果不知足校驗矩陣

output data_out;        //輸出譯碼後數據

output busy;            //譯碼模塊正在譯碼,此時不響應decode_start信號

對應應該有以下的狀態

parameter IDLE = 5'b00001;            //空閒狀態,等待譯碼

parameter VML_INIT = 5'b00010;        //初始化變量節點取值

parameter UML_UPDATE = 5'b00100;        //更新校驗節點,同時計算校驗方程

parameter VML_UPDATE = 5'b01000;        //更新變量節點

parameter DECODER_END = 5'b10000;    //輸出譯碼結果

下文將具體敘述程序結構和信號說明。

程序結構

 

 

圖 1 程序結構圖

 

頂層模塊爲decoder_top,如下具體闡述各個模塊和改進思路

圖 2 狀態機

 

這是decoder_top內惟一有意義的代碼,輸出5個狀態,輸入包括

decode_start

vmlram_addra

hrowram_addra

frame_error

MAX_ITER_NUM

這是狀態機跳轉的全部條件,第二、3個是可選擇的,能夠考慮替換掉,但這兩個是很很方便的。

 

圖 3 信道信息控制模塊

 

經過state和umlram_addrb控制嘗試inputram_addra對應輸出不一樣的信息。輸入umlram_addrb是必須的,由於須要控制在uml2vml中信道信息的輸出。

顯然這兩個模塊能夠合成一個,不該該直接將InputRam放在decoder_top之下。

圖 4 Vml寄存器寫控制

 

vmlram寫控制須要即控制vmlram_wea,dina,addra三路信號。針對不一樣階段,vml的輸入是不同的,該模塊起到了一個輸入選擇做用對inputram_douta,vmlram_updae_dina,decoded_data_check三個信號進行處理,同時根據state不一樣產生寫入地址。模塊設計較爲合理。

 

圖 5 vml2uml模塊

 

這個模塊還包括了hrowram、vml2uml_caculate和check_data三個部分。模塊完成了decoded_data的校驗和vmlram_doutb到變量節點的更新。輸出的hrowram_addra做爲了state和uml地址生成的控制(挺方便,是否合適,有無更好選擇?),hrowram_douta用於生成uml的寫地址。

圖 6 umlram_write_control模塊

 

umlram_write_control模塊控制產生uml寫地址,爲何沒有寫數據,由於vml2uml模塊的輸出直接鏈接到ram上面去了。寫地址和使能經過hrowram_addra和hrowram_douta控制產生。

圖 7 uml2vml模塊

變量節點更新模塊技術按vml更新值即vmlram_update_dina和decoded_data_check.

 

信號說明

 

Decoder_top頂層控制模塊

 

表格 1 decoder_top模塊信號說明

信號

類型

功能

clk

input

時鐘

rst

input

復位信號,高有效

decode_start

input

開始譯碼信號,持續高電平一個clock有效

optput_ready

output

開始輸出

frame_error

output

輸出結果不知足校驗矩陣

data_out

output

輸出譯碼後數據

busy

output,reg    

    譯碼模塊正在譯碼,此時不響應decode_start信號

state

reg[4:0]

狀態寄存器

MAX_ITER_NUM

reg[7:0]

最大迭代次數

vmlram_update_dina

wire[7:0]

vml更新過程當中的數據輸入

decoded_data_check

wire

待校驗的譯碼結果

inputram_addra

wire[11:0]

被譯碼數據地址控制

inputram_douta

wire[7:0]

被譯碼數據輸出

hrowram_addra

wire[12:0]

行列地址轉化ROM地址

hrowram_douta

wire[12:0]

做爲vml_addrb的輸入

vmlram_addra

wire[12:0]

變量存儲器寫地址

vmlram_dina

wire[8:0]

變量存儲器寫輸入

vmlram_doutb

wire[7:0]

變量存儲器寫輸出

decoded_data

wire

也存在變量存儲器的譯碼結果

vmlram_wea

wire

變量存儲器寫使能

umlram_addra

wire[12:0]

校驗存儲器寫地址

umlram_addrb

wire[12:0]

校驗存儲器讀地址

umlram_dina

wire[7:0]

校驗存儲器寫數據

umlram_doutb

wire[7:0]

校驗存儲器讀數據

umlram_wea

wire

校驗存儲器寫使能

 

Inputram_control:根據輸入產生inputram的地址控制

 

表格 2 inputram_control控制模塊信號說明

信號

類型

功能

clk

input

時鐘

rst

input

復位信號,高有效

umlram_addrb

input[12:0]

校驗存儲器讀地址

state

input[4:0]

狀態寄存器

inputram_addra

output[11:0],reg[11:0]

被譯碼數據地址控制

input_count

reg[2:0]

地址更新計數器

input_count_max

reg[2:0]

最大計數次數控制

input_init_addr

reg[11:0]

VML_INIT狀態下inputram_addra地址

input_update_addr

reg[11:0]

VML_UPDATA狀態下inputram_addra地址

 

Vmlram_write_control: vml寄存器寫控制,經過輸入inputram_douta, vmlram_update_dina等信息自動判斷輸出寫地址、寫使能和數據。

 

表格 3 vmlram_write_control模塊的信號說明

信號

類型

功能

clk

input

時鐘

rst

input

復位信號,高有效

inputram_douta

input[7:0]

VML下數據輸入

state

input[4:0]

狀態

vmlram_update_dina

input[7:0]

vml更新過程當中的數據輸入

decoded_data_check

input

待校驗的譯碼結果

vmlram_addra

output[12:0] ,reg[12:0]

vmlram_dina

output[8:0], reg[8:0]

vmlram_wea

output, reg

vmlram_init_addra

reg[12:0]

addr_update_count

reg[1:0]

VML_UPDATE下其實是要對地址作延遲的,這是控制延遲的寄存器

vmlram_update_addra

reg[12:0]

vmlram_init_addratemp

reg[12:0]

這個是開始數錯了時鐘週期,添加一個clk延時

vmlram_update_addratemp

reg[12:0]

這個是開始數錯了時鐘週期,添加一個clk延時

 

 

Vml2uml: 接收vml讀出的數據,處理後寫入uml中。同時完成校驗伴隨式的計算

Vml2uml包含了如下幾個模塊:

  • hrowram
  • vml2uml_caculate
  • check_data

 

信號

類型

功能

clk

input

時鐘

rst

input

復位信號,高有效

state

input[4:0]

狀態信息

decoded_data

input

 

vmlram_doutb

input[7:0]

 

hrowram_addra

output[12:0], reg[12:0]

 

hrowram_douta

output[12:0], wire[12:0]

 

umlram_dina

output[7:0]

 

frame_error

output

輸出幀錯誤指示

vmltempcount

reg[2:0]

計算是三個一更新仍是六個

 

Vml2uml_calculate.v 校驗節點更新的計算部份內容

信號

類型

功能

clk

input

時鐘

rst

input

復位信號,高有效

state

input[4:0]

狀態信息

vmltempcount

input[2:0]

計算是三個一更新仍是六個

vmlram_doutb

input[7:0]

vmlram輸出

umlram_dina

output[7:0],reg[7:0]

umlram輸入

vmlmark

reg

每組計算出符號

vmltemp

reg[47:0]

緩存6個clock的vmlram輸出

vmltempmark

reg[5:0]

緩存6個clock的vmlram輸出符號

vmlmin1

reg[7:0]

最小值計算

vmlmin2

reg[7:0]

次小值計算

vmlmin1temp

reg[7:0]

緩存最小值計算結果

vmlmin2temp

reg[7:0]

緩存次小值計算結果

vmltempcomp

reg[7:0]

取出用於比較的vml輸出(絕對值)

vmlMarkcomp

reg

緩存符號計算結果

vmltempmarkcomp

reg

取出用於比較的vml符號

vmlram_doutb_inv

wire[7:0]

負數取絕對值

check_data.v 計算是否知足校驗方程

信號

類型

功能

clk

input

時鐘

rst

input

復位信號,高有效

state

input[4:0]

狀態信息

vmltempcount

input[2:0]

計算是三個一更新仍是六個

decoded_data

input

待校驗數據

hrowram_addra

input[12:0]

校驗起始控制

frame_error

output, reg

幀錯誤指示

sum_mod2

reg

計算模二和

 

Umlram_write_control.v: uml寄存器寫控制

信號

類型

功能

clk

input

時鐘

rst

input

復位信號,高有效

hrowram_douta

input[12:0]

hrowram輸出,用於生成umlram地址

hrowram_addra

input[12:0]

hrowram地址,計數判斷

umlram_addra

output[12:0], reg[12:0]

生成的umlram地址

umlram_wea

output,reg

umlram使能信號

hrowram_douta_temp

reg[116:0]

存儲hrowram輸出,延時生成umlram地址

 

Uml2vml.v: 校驗節點到變量節點更新,同時生成譯碼後結果

信號

類型

功能

clk

input

時鐘

rst

input

復位信號,高有效

state

input[4:0]

umlram_doutb

input[7:0]

inputram_douta

input[7:0]

umlram_addrb

output[12:0]

vmlram_update_dina

output[7:0]

decoded_data_check

output

umltempcount

reg[2:0]

判斷uml延遲

umltemp

reg[47:0]

uml輸出緩存

umlsum

reg[10:0]

uml輸出求和

umlsumtemp

reg[10:0]

緩存求和結果

vmltempcount_max

reg[2:0]

控制此時幾個數據作一次操做

vmltempcount

reg[2:0]

控制此時幾個數據作一次操做

vmlram_update_dina

reg[7:0]

vml須要寫入的數據

umltempsub

reg[7:0]

作減法的uml取值

umltempsub_delay

reg[2:0]

uml取值延時控制

vmltempcount_maxtemp

reg[2:0]

uml取值延時控制

 

改進

 

模塊劃分是否合理?

功能實現是否足夠合適?

存儲器設計顯然不夠合理,都是8bit。

參考他人畢業論文的模塊化方法。

瞭解並行、部分並行的方法

完成輸入輸出部分模塊的設計。

完成整個硬件仿真平臺的思路構想。

參考

 

代碼

 

相關文章
相關標籤/搜索