天天看點

【xilinx DDR3 初探2】黑金A7101 DDR3代碼解讀

這裡就沒有形成文檔,直接天馬行空的敲一點關鍵内容吧。

一,參考文檔

1.參考資料 

XILINX_DDR3_IP核使用教程,一共仿真,綜合,測試,應用,最終篇 5個,https://download.csdn.net/download/walkmen1990/10180050

2.官方文檔

ug586_7Series_MIS

3. 黑金A7101 開發闆 DDR3 例程 

4.增加一點說明 

【xilinx DDR3 初探2】黑金A7101 DDR3代碼解讀

在chapter4 LPDDR2 SDRAM Memory Interface Solution裡面有一句話

As shown in Figure 4-59, the maximum delay for a single write between the write data and 

the associated write command is two clock cycles. When issuing back-to-back write 

commands, there is no maximum delay between the write data and the associated 

back-to-back write command, as shown in Figure 4-61.

也就是backtoback的資料(連續多個資料的寫入)不必嚴格對齊,這句話在DDR3的描述裡面沒有出現,但是應該是一樣的

二、代碼解讀

2.1 端口解讀

2.1.1 test與burst檔案互動接口

module mem_burst

#(

        parameter MEM_DATA_BITS = 64,

        parameter ADDR_BITS = 24

)

(

    input   test,

        input rst,                                 

        input mem_clk,                              

        input rd_burst_req,                          

        input wr_burst_req,                          

        input[9:0] rd_burst_len,                     

        input[9:0] wr_burst_len,                     

        input[ADDR_BITS - 1:0] rd_burst_addr,        

        input[ADDR_BITS - 1:0] wr_burst_addr,        

        output rd_burst_data_valid,                  

        output wr_burst_data_req,                    

        output[MEM_DATA_BITS - 1:0] rd_burst_data,   

        input[MEM_DATA_BITS - 1:0] wr_burst_data,   

        output rd_burst_finish,                     

        output wr_burst_finish,                     

        output burst_finish,                        

......................

這裡有點亂,主要還是這樣

2.1.2 app分類信号

這裡将指令進行分類 

【xilinx DDR3 初探2】黑金A7101 DDR3代碼解讀

【位址系統信号】

app_cmd 

app_addr

app_cmd

app_rdy

app_en

【寫資料系統信号】

app_wdf_rdy

app_wdf_wren

app_wdf_data

app_wdf_end

【讀資料】這裡省了吧

2.2 流程解讀 

(1)men_test 裡面先拉高wr_burst_req信号 ,使進入MEM_WRITE狀态機

                                else if(wr_burst_req)

                                begin

                                        state <= MEM_WRITE;

(2)首先拉高app_en, 給位址,位址系統現行一步

//                                        app_addr_r <= {wr_burst_addr,3'd0};  

//                                        app_en_r <= 1'b1;                      //指令有效

(3)位址系統和資料系統在MEM_WRITE狀态機内分别累加

                        MEM_WRITE:

                        begin

//original                

//                                if(app_rdy)            //ddr使用者接口空閑

//                                begin

//                                        app_addr_r <= app_addr_r + 8;        //app的資料寬度256,ddr的資料寬度是32位, 位址需要加8    

//                                        if(wr_addr_cnt == wr_burst_len - 1)    //判斷是否發送了wr_burst_len的位址的寫指令

//                                        begin

//                                        //leo

【xilinx DDR3 初探2】黑金A7101 DDR3代碼解讀

riginal 3 

//                                                app_wdf_end_r <= 1'b0;

//                                                app_en_r <= 1'b0;                //指令無效

//                                        end

//                                        else

//                                        begin

//                                                wr_addr_cnt <= wr_addr_cnt + 1;

//                                        end

//                                end

//                                if(wr_burst_data_req)             //寫入ddr資料統計

//                                begin

//                                        if(wr_data_cnt == wr_burst_len - 1)    //等待buart長度的資料寫入到DDR IP的fifo裡

//                                        begin

//                                                state <= MEM_WRITE_WAIT;

//                                        end

//                                        else

//                                        begin

//                                                wr_data_cnt <= wr_data_cnt + 1;

//                                        end

//                                end

一般情況下,app_wdf_rdy拉低的頻率和時間比app_rdy要少很多,是以資料系統先寫完,進入MEM_WRITE_WAIT狀态

(4)進入MEM_WRITE_WAIT狀态,等待位址寫完

(5)進入WRITE_END狀态,寫完狀态,同時回報wr_burst_finish ( = state == WRITE_END )信号

(6)進入IDLE 等待

(7)men_test子產品接收wr_burst_finish後進入讀取資料狀态,開始讀資料過程,讀取過程和寫類似

這裡不贅述

2.3 關鍵信号解析

【xilinx DDR3 初探2】黑金A7101 DDR3代碼解讀
【xilinx DDR3 初探2】黑金A7101 DDR3代碼解讀

【wr_burst_req】 men_test産生寫資料請求

【wr_burst_data_req】

信号定義://assign wr_burst_data_req = (state == MEM_WRITE ) & app_wdf_rdy ;        // 寫ddr資料請求信号 original

信号功能:men_burst.v産生,狀态機MEN_WRITE期間拉高,回報給men_test.v men_test檢測這個信号為高就輸出需要寫入的資料;

這個信号可以作為fifo的讀使能,資料比這個信号慢一拍輸出

【app_wdf_wren_r】

信号定義:else if(app_wdf_rdy)

                app_wdf_wren_r <= wr_burst_data_req;      //寫DDR資料準備好

信号功能:

功能1,将wr_burst_data_req延時一拍;

功能2,将wr_burst_data_req中間的由于app_wdf_rdy拉低的部分進行重新拉高;

【app_wdf_en】

信号定義:assign app_wdf_wren = app_wdf_wren_r & app_wdf_rdy;

信号功能:app_wdf_en訓示資料有效信号

到這裡基本清晰了。紅色信号作為fifo讀取或者外部資料發生的請求信号

根據紅色信号【wr_burst_data_req】延一拍,平滑中間的0,再和 app_wdf_rdy與一遍,生成綠色的資料有效信号a【app_wdf_wren】

資料比紅色信号【wr_burst_data_req】慢一拍輸出,也就産生了綠色的【app_wdf_data】信号

即資料【app_wdf_data】和信号有效信号【app_wdf_wren】已經完成對齊功能;

SRIO 中 IOTx_tready 的用法可以參考這裡!

另外,位址系統的信号 和紅色信号一起拉高,也就是最開始的時候,位址信号比資料信号提前一個時鐘給DDR控制器

                                else if(wr_burst_req)

                                begin

                                        state <= MEM_WRITE;

                                        app_cmd_r <= 3'b000;                   //寫指令

                                        app_addr_r <= {wr_burst_addr,3'd0};  

                                        app_en_r <= 1'b1;                      //指令有效

------------------------------------------------------分割線------------------------------------------------------

這裡基本上主要子產品分析完了

寫位址指令和讀位址指令并沒有嚴格對齊,有點擔心這裡可能存在風險

可能存在的風險,下一章節進行分析

20200224

:O:O:o: o