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

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

輸入數(shù)據(jù)為1-50共50個(gè)數(shù)據(jù),以vld_in信號(hào)表征輸入數(shù)據(jù)有效。
2.2狀態(tài)機(jī)設(shè)計(jì)
2.2.1獨(dú)熱碼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)長(zhǎng)度的數(shù)量就跳到S5
localparam S5_RD_DONE = 6'b100000; //讀完成狀態(tài),跳回IDLE
2.2.2狀態(tài)機(jī)流程圖

2.2.3三段式狀態(tài)機(jī)
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
代碼很簡(jiǎn)單,對(duì)應(yīng)流程圖跳轉(zhuǎn),此處不再啰嗦 。
2.3app接口設(shè)計(jì)
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é)果
因?yàn)镈DR仿真,需要用到ddr3_model和其他文件,單開一篇來講解。
這里只看仿真結(jié)果。
輸入:

輸出:

輸入數(shù)據(jù): 1-50;
輸出數(shù)據(jù): 1-50;
DDR讀寫測(cè)試成功!
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1660文章
22428瀏覽量
636998 -
DDR3
+關(guān)注
關(guān)注
2文章
288瀏覽量
44179 -
Xilinx
+關(guān)注
關(guān)注
73文章
2201瀏覽量
131279
發(fā)布評(píng)論請(qǐng)先 登錄
MAX17000:DDR2和DDR3內(nèi)存電源管理解決方案的卓越之選
MAX17000A:DDR2和DDR3內(nèi)存電源管理的理想之選
TI SN74SSQEA32882:DDR3/DDR3L注冊(cè)式DIMM的理想時(shí)鐘驅(qū)動(dòng)器
探索SN74SSQEB32882:DDR3內(nèi)存的高效時(shí)鐘驅(qū)動(dòng)解決方案
Texas Instruments TS3DDR3812:DDR3應(yīng)用的理想12通道開關(guān)解決方案
HummingBird EV Kit - DDR3 引腳不匹配是怎么回事?
DDR3 SDRAM參考設(shè)計(jì)手冊(cè)
基于FPGA的DDR控制器設(shè)計(jì)
FPGA搭建DDR控制模塊
用FPGA實(shí)現(xiàn)DDR控制模塊介紹
AD設(shè)計(jì)DDR3時(shí)等長(zhǎng)設(shè)計(jì)技巧
AD設(shè)計(jì)DDR3時(shí)等長(zhǎng)設(shè)計(jì)技巧
在Vivado調(diào)用MIG產(chǎn)生DDR3的問題解析
DDR3 SDRAM配置教程
Xilinx FPGA平臺(tái)DDR3設(shè)計(jì)保姆式教程(四)
評(píng)論