實驗任務(wù):
將輸入數(shù)據(jù)(data_in)存入ddr,然后讀出,驗證輸入輸出數(shù)據(jù)是否相等。
一、前言
接上一篇(3)MIG的使用教程
MIG配置如下:
1. 系統(tǒng)時鐘sys_clk = 200Mhz
2. 系統(tǒng)復(fù)位sys_rst 低有效
3. 模式:4:1
4. 位寬: 16bit
注:由于選擇的DDR3的突然長度為8,所以mig的數(shù)據(jù)位寬=16*8=128bit,對應(yīng)到代碼即app_wdf_data[127:0] , app_rd_data[127:0]。
二、系統(tǒng)方案
2.1方案設(shè)計
實驗任務(wù):
將數(shù)據(jù)(data_in),存入ddr,然后讀出,驗證輸入輸出數(shù)據(jù)是否相等。
實驗?zāi)康模?/p>
初步掌握DDR讀寫設(shè)計。

為什么要先過FIFO再寫入DDR?
因為DDR接口對用戶而言并不是一直有效,只有等DDR“有效”時(app_rdy = 1 && app_wdf_rdy = 1),才能進行寫入。
2.1.1輸入接口時序圖

輸入數(shù)據(jù)為1-50共50個數(shù)據(jù),以vld_in信號表征輸入數(shù)據(jù)有效。
2.2狀態(tài)機設(shè)計
2.2.1獨熱碼localparam S0_IDLE = 6'b000001; //初始化狀態(tài),DDR初始化成功就跳轉(zhuǎn)S1
localparam S1_WAIT = 6'b000010; //等待狀態(tài),等FIFO緩存好數(shù)據(jù)就跳轉(zhuǎn)S2
localparam S2_WRITE = 6'b000100; //寫DDR狀態(tài),F(xiàn)IFO數(shù)據(jù)寫完就跳轉(zhuǎn)到S3
localparam S3_WR_DONE = 6'b001000; //寫完成狀態(tài),給出讀地址初始值就跳到S4
localparam S4_READ = 6'b010000; //讀DDR狀態(tài),讀到相應(yīng)長度的數(shù)量就跳到S5
localparam S5_RD_DONE = 6'b100000; //讀完成狀態(tài),跳回IDLE
2.2.2狀態(tài)機流程圖

2.2.3三段式狀態(tài)機
always @(posedge sys_clk or posedge sys_rst)begin
if(sys_rst == 1'b1)
current_state else
current_state end
always @(*)begin
case(current_state)
S0_IDLE :
if(init_calib_complete == 1'b1)
next_state else
next_state S1_WAIT :
if(eof == 1'b1)
next_state else
next_state S2_WRITE :
if(ififo_empty == 1'b1)
next_state else
next_state S3_WR_DONE :
next_state S4_READ :
if(cnt_read == cnt_length)
next_state else
next_state S5_RD_DONE :
next_state default :
next_state endcase
end
always @(posedge sys_clk or posedge sys_rst)begin
if(sys_rst == 1'b1)begin
cnt_length cnt_read cnt_write app_addr end
else case(current_state)
S0_IDLE : ;
S1_WAIT : ;
S2_WRITE:
if(app_rdy && app_wdf_rdy && app_en)begin
app_addr cnt_write end
else begin
app_addr cnt_write end
S3_WR_DONE :begin
cnt_length app_addr end
S4_READ :
if(app_rdy && app_en)begin
app_addr cnt_read end
else begin
app_addr cnt_read end
S5_RD_DONE :begin
cnt_length cnt_read cnt_write end
default : ;
endcase
end
代碼很簡單,對應(yīng)流程圖跳轉(zhuǎn),此處不再啰嗦 。
2.3app接口設(shè)計
assign app_wdf_mask = 16'b0; //掩碼置0,表示傳輸?shù)娜繛橛行?shù)據(jù)
assign ififo_rden = (current_state == S2_WRITE)&& app_rdy && app_wdf_rdy;
assign app_en = ((current_state == S2_WRITE)&&(ififo_vld)) || (current_state == S4_READ);
assign app_cmd = (current_state == S4_READ) ? 3'b001 : 3'b000;
assign app_wdf_wren = ififo_vld;
assign app_wdf_end = ififo_vld;
assign app_wdf_data = ififo_rdata;
三、仿真結(jié)果
因為DDR仿真,需要用到ddr3_model和其他文件,單開一篇來講解。
這里只看仿真結(jié)果。
輸入:

輸出:

輸入數(shù)據(jù): 1-50;
輸出數(shù)據(jù): 1-50;
DDR讀寫測試成功!
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1664文章
22523瀏覽量
639809 -
DDR3
+關(guān)注
關(guān)注
2文章
290瀏覽量
44287 -
Xilinx
+關(guān)注
關(guān)注
73文章
2208瀏覽量
132019
發(fā)布評論請先 登錄
解析SN74SSQEA32882:DDR3/DDR3L注冊時鐘驅(qū)動器的卓越之選
IDT 4MX0121V:DDR3/DDR4 NVDIMM的理想開關(guān)/多路復(fù)用器
高性價比智能音箱方案 RK3308 搭配 PSRAM 替代 DDR3
Xilinx FPGA平臺DDR3設(shè)計保姆式教程(四)
評論