Altera DDR2控制器使用IP的方式實現,一般很少自己寫控制器代碼。
ddr22 ddr22_inst ( .aux_full_rate_clk (mem_aux_full_rate_clk), .aux_half_rate_clk (mem_aux_half_rate_clk), .global_reset_n (global_reset_n), .local_address (mem_local_addr), .local_be (mem_local_be), .local_burstbegin (local_burstbegin_sig), .local_init_done (), .local_rdata (mem_local_rdata), .local_rdata_valid (mem_local_rdata_valid), .local_read_req (mem_local_read_req), .local_ready (mem_local_ready), .local_refresh_ack (), .local_size (mem_local_size), .local_wdata (mem_local_wdata), .local_write_req (mem_local_write_req), .mem_addr (mem_addr[12 : 0]), .mem_ba (mem_ba), .mem_cas_n (mem_cas_n), .mem_cke (mem_cke), .mem_clk (mem_clk), .mem_clk_n (mem_clk_n), .mem_cs_n (cs_n), .mem_dm (mem_dm[1 : 0]), .mem_dq (mem_dq), .mem_dqs (mem_dqs[1 : 0]), .mem_odt (mem_odt), .mem_ras_n (mem_ras_n), .mem_we_n (mem_we_n), .phy_clk (phy_clk), .pll_ref_clk (clock_source), .reset_phy_clk_n (reset_phy_clk_n), .reset_request_n (), .soft_reset_n (tie_high) );
以mem開頭的一堆信號,是直接導出為頂層引腳,去連接PCB板上的DDR2芯片的。
以local開頭的一堆信號,是ddr2控制器導出給用戶的接口信號,用戶要向ddr2存儲器中寫入數據或者從ddr2中讀出數據,只需要操作local接口即可。
local信號,可以分為以下幾組:
控制組
local_init_done:DDR2控制器初始化完成標志信號,DDR2控制器上電需要經過一系列的初始化操作,包括DDR2芯片的初始化和DDR接口的時序校准,整個過程耗時較長。待該信號拉高之后,local接口上才能進行讀寫操作。
local_refresh_ack:ddr2控制器對ddr2芯片執行刷新操作后的應答信號,一般用戶讀寫時,不用關心該信號。
用戶寫接口
local_address :用戶希望將數據寫入到的DDR2存儲器的地址,該地址為DDR2芯片片選、行地址、bank地址、列地址的組合,{CS、ROW、BA、COL}。
local_be:寫入時候的字節使能,例如對於DDR2是16位硬件接口,則用戶數據接口為32位,為4個字節,所以local_be的位寬為4,每一位對應一個字節,如果寫入時候用戶端32位的數據中有一個字節不希望被寫入,則對應的be位設置為0即可。
local_size:用戶接口的突發長度,指定每次用戶發起一次寫入請求會寫入多個數據。該長度最大值在DDR IP的配置界面可以配置,如下圖所示。注意該值是控制器的最大突發長度設定值,不等於DDR2芯片支持的最大突發長度,DDR2芯片最大只支持8個長度。
local_burstbegin:用戶接口的突發啟動信號,該信號每一個高脈沖會啟動一次突發傳輸,每次傳輸長度為local_size指定的長度
local_ready:ddr控制器就緒標志信號,該信號有效則表明當前數據被成功寫入了ddr2控制器中,為0則表示ddr控制器無法接受當前操作,用戶需要保持當前地址、數據和控制信號不變直到ready信號再次拉高
local_wdata:用戶需要寫如到ddr中的數據,位寬為ddr芯片數據線位寬的2倍
local_write_req::寫數據請求信號為1則local_wdata端口上的數據允許被寫入ddr控制器,(具體能否成功寫入,還得看local_ready的狀態)
local_address:用戶希望從DDR2存儲器讀取數據的地址,該地址為DDR2芯片片選、行地址、bank地址、列地址的組合,{CS、ROW、BA、COL}。
local_be:讀出時候的字節使能,例如對於DDR2是16位硬件接口,則用戶數據接口為32位,為4個字節,所以local_be的位寬為4,每一位對應一個字節,如果讀出時候用戶端32位的數據中有一個字節不希望被讀出,則對應的be位設置為0即可。
local_burstbegin:用戶接口的突發啟動信號,該信號每一個高脈沖會啟動一次突發傳輸,每次傳輸長度為local_size指定的長度
local_rdata:讀取到的數據內容,位寬為ddr芯片數據線位寬的2倍
local_rdata_valid:讀取數據有效標志信號,當該信號有效時,表明local_rdata上的數據是讀到的有效內容
local_read_req:讀請求信號
local_size:用戶接口的突發長度,指定每次用戶發起一次讀取請求會讀出多少個數據。該長度最大值在DDR IP的配置界面可以配置,如下圖所示。注意該值是控制器的最大突發長度設定值,不等於DDR2芯片支持的最大突發長度,DDR2芯片最大只支持8個長度。