|
例說FPGA連載42:DDR控制器集成與讀寫測試之DDR2 IP核接口時序 特權同學,版權所有 配套例程和更多資料下載鏈接: http://pan.baidu.com/s/1c0nf6Qc
用戶邏輯和DDR2 IP核之間的接口并不是什么新發明的特殊接口,不過是Avalon-MM總線而已。有人說這個美眉(Memory-Map)會不會太慢了,關鍵時刻耽誤事?非也,MM總線的burst模式也可以流水線式連續傳輸數據,絲毫不遜色于ST(stream)傳輸方式。 這里我們可以簡單了解一下帶“local_*”的Avalon-MM總線burst模式傳輸協議的使用方法。 可以比較簡單山寨的理解前面已經給出的帶“local_*”的Avalon-MM信號接口: ● local_size為burst讀寫的最大數據數量。通常IP核內部有FIFO用于支持這樣的連續數據讀寫,在Megafunction中設定好的最大數據數量是Avl_size的上限值。 ● local_be為byte enable信號,用于使能或說是屏蔽讀寫數據的各個高低字節。 ● local_ready為總線當前狀態指示。這里高電平表示ready,此時的local_read_req和local_write_req能夠被鎖存。 ● local_burstbegin為突發傳輸起始標志位。它不受local_ready的影響,在發起一次讀或寫操作的第一個時鐘周期,只需保持一個時鐘周期的local_burstbegin為高電平狀態,并且不用管此時的local_ready狀態如何。 ● local_addr為讀寫共用的總線地址,位寬由DDR2的存儲總量和總線上讀寫數據的位寬來決定。如1Gbit的DDR2,外部芯片的數據位寬為16bit,Avalon-MM讀寫的數據位寬64bit,那么它的地址不是以16bit位寬來計算的,而是以64bit位寬來計算的,即16M(24位)。 ● local_read_req為讀請求,配合地址local_addr和突發傳輸起始標志位local_burstbegin發起一次burst讀操作。在local_burstbegin拉高后,只需要確保在同一個時鐘周期或其后第一次local_ready有效的時鐘周期拉高一次local_read_req信號即可。 ● local_rdata_valid為讀出數據的有效標志位。IP核在收到burst讀請求(local_read_req)后的若干個時鐘周期開始連續送出數據(數據可能分多次連續送出),該信號和讀出數據配合,高電平表示當前讀出數據有效。 ● local_rdata為讀出數據。和local_rdata_valid配合送給用戶邏輯。 ● local_write_req為寫請求信號。若發起一次n個數據寫入的burst傳輸,第一個傳輸時鐘周期首先拉高local_burstbegin以及local_write_req,且local_write_req必須保持到n個數據寫入完成。只有在local_ready有效時,當前的local_write_req、local_addr和local_wdata才是有效的。 ● local_wdata為寫入數據。 接著我們再用幾張時序圖來解析前面的接口。 ① 如圖4.14所示,正常4個數據的burst讀操作。默認情況下,local_addr為讀出的首個數據對應的地址,隨后將讀出遞增地址的數據。
圖4.14 四個數據讀取操作時序 ② 如圖4.15所示,遇到local_ready拉低的讀操作,必須保持local_read_req、local_size和local_addr到local_ready拉高為止。
圖4.15 讀忙時的四個數據讀取時序 ③ 如圖4.16所示,正常4個數據的burst寫操作。默認情況下,local_addr設定的是寫入的首個數據對應的地址,隨后每次寫入數據后地址自動遞增。
圖4.16 四個數據寫取操作時序 ④ 如圖4.17所示,遇到local_ready拉低的4個數據的burst寫操作。Local_ready拉高時,local_write_req、local_addr和local_wdata所對應的地址和數據才是有效的。
圖4.17 寫忙時的四個數據寫時序 |