這裡就沒有形成文檔,直接天馬行空的敲一點關鍵内容吧。
一,參考文檔
1.參考資料
XILINX_DDR3_IP核使用教程,一共仿真,綜合,測試,應用,最終篇 5個,https://download.csdn.net/download/walkmen1990/10180050
2.官方文檔
ug586_7Series_MIS
3. 黑金A7101 開發闆 DDR3 例程
4.增加一點說明
在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分類信号
這裡将指令進行分類
【位址系統信号】
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
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 關鍵信号解析
【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