本次設計其實是從《DDR2(2):Quartus DDR2 IP 官方例程仿真》開始,但是在這之前,需要掌握一些預備知識。
一、電路設計
這方面的知識我比較欠缺,可以看一下小梅哥寫的博客《【小梅哥FPGA進階學習之旅】基於Altera FPGA 的DDR2+千兆以太網電路設計》。其中比較重要的一點,而我之前總是疑惑的地方:雙 DDR2 的使用。
很多開發板都帶有雙 DDR2,一開始我以為就是有兩套 DDR2 的接口,不管是管腳還是 IP,都是兩套,這種想法是錯的!根據小梅哥的這篇博客,原來兩片 DDR2 的很多引腳在電路設計上都是合並的,因此在使用它們時,也是例化一個 IP 就行,在設置 IP 時根據實際情況選擇合適的參數即可。
從小梅哥的圖可以看到,很多信號合並了。例如兩片 DDR2, 一片DDR2的存儲容量為 1Gb,數據位寬為 16bit,兩片 DDR2 共用控制線和地址線,數據線並列組成了 32 位的 2Gb 存儲器。雙 DDR2 提升了存儲容量,最明顯的就是地址 ADDR 和數據 DQ 增大了。
二、內存分類
內存有很多種,常見的如下所示:
ROM ( Read Only Memory )是只讀存儲器,由於斷電信息不會丟失,所以 ROM 通常用來存儲那些不經常改變的信息。RAM ( Random Access Memory )是隨機存儲器,存儲單元的內容可按需隨意取出或存入,且存取的速度與存儲單元的位置無關,由於斷電信息會丟失,所以 RAM 通常用來存儲那些短時間使用的程序。按照存儲單元的工作原理,隨機存儲器又分為靜態隨機存儲器(StaticRAM,SRAM)和動態隨機存儲器( Dynamic RAM,DRAM)。
- SRAM:是利用觸發器的兩個穩態來表示信息 0 和 1,每個存儲單元由六個晶體管組成,不需要刷新;
- DRAM:是利用電容有無電荷來表示信息 0 和 1,每個存儲單元由一個晶體管和一個電容器組成,為防止電容漏電而導致讀取信息出錯,需要有規律地進行刷新;
由於 SRAM 不需要刷新,有更高的速率,所以它常常用於高速緩沖存儲器。由於 DRAM 每個存儲單元晶體管比較少,有更高的密度,所以它常常用於計算機中的內存。在計算機市場上 DRAM 又可以分為 SDRAM(Synchronous DRAM) 和 DDR SDRAM(Dual Data Rate SDRAM)。
三、SDRAM 和 DDR
SDRAM在之前的博客已經詳細記錄了,而 DDR 是在 SDRAM 內存基礎上發展而來的,DDR 在時鍾信號上升沿與下降沿各傳輸一次數據,這使得 DDR 的數據傳輸速度為傳統 SDRAM 的兩倍,如圖下所示:
DDR 與SDRAM 的不同主要體現在以下幾個方面:
1、時鍾
SDRAM 的讀寫采用的是單一的時鍾,DDR 的讀寫采用的是差分時鍾,即 CLK 和 CLK#。CLK# 能起到觸發時鍾校准的作用。由於數據是在 CLK 的上下沿觸發的,造成傳輸周期縮短了一半,因此必須要保證傳輸周期的穩定以確保數據的正確性,這就要求對 CLK 的上下沿間距要有精確的控制。但由於溫度、電阻性能的改變等原因,CLK上下沿間距可能發生變化,此時與其反相的 CLK# 就起到了糾正的作用,CLK 上升沿快下降沿慢,CLK# 則是上升沿慢下降沿快。
2、數據選取脈沖(|DQS)
DQS 是 DDR SDRAM 中的重要信號,其功能主要是用來在一個時鍾周期內准確地區分每個傳輸周期,並使數據得以准確接收,每一塊 DDR SDRAM 芯片都有一個雙向的 DQS 信號線。
3、寫入延遲
SDRAM 的寫入延遲是 0,而 DDR 的寫入延遲不再是 0 了,DDR在發出寫入命令后,DQS 與寫入數據要等待一段時間才會送達。這個周期被稱為 DQS 相對於寫入命令的延遲時間( tDQSS )。之所以會有這樣的延遲,這是因為同步,畢竟在一個時鍾周期內進行兩次傳送需要很高的控制精度,它必須要等接收方做好充分的准備才行。
4、突發長度
在 DDR 中,突發長度只有 2、4、8 三種選擇,沒有了突發長度 1 和全頁式突發。之所以去掉突發長度 1 主要是因為 DDR 預讀取位數是 2,L_BANK 一次就存取兩倍於芯片位寬的數據,所以芯片至少也要進行兩次傳輸才可以,否則內部多出來的數據很難被處理。之所以去掉全頁式突發主要是因為PC內存中很難用得上。
5、延遲鎖定回路(DLL )
DDR 有兩個時鍾,一個是外部的總線時鍾,一個是內部的工作時鍾,在理論上這兩個時鍾應該是同步的,但由於實際物理種種原因,所以導致這兩個時鍾並不同步,這就需要根據外部時鍾動態修正內部時鍾延遲來實現內部時鍾與外部時鍾的同步,為此專門設置了DLL,利用DLL可以使內部時鍾與外部時鍾保持同步。
另外,小梅哥補充了一些:
四、DDR和DDR2
DDR2 全稱是 Double Data Rate 2 SDRAM,翻譯成中文是第二代雙倍數據速率同步動態隨機存取存儲器。它也屬於 SDRAM 家族的存儲器產品,提供了相較於 DDR 更高的運行效能與更低的電壓,是 DDR SDRAM 的后繼者,DDR2 和 DDR 一樣,也是在時鍾信號上升沿與下降沿各傳輸一次數據,但是最大的區別在於DDR2內存可進行 4bit 預讀取。這就意味着 DDR2 擁有兩倍於 DDR 的預讀系統命令數據的能力,因此 DDR2 具有兩倍於DDR的完整的數據傳輸能力,如圖所示:
DDR2與DDR的不同主要體現在以下幾個方面
1、片內驅動調校( OCD, Off Chip Driver )
OCD 的主要用意在於調整 I/O 接口端的電壓,來補償上拉與下拉電阻值。目的是讓 DQS 與 DQ 數據信號之間的偏差降低到最小。
2、片內終結( ODT, On Die Termination)
所謂的終結,就是讓信號被電路的終端被吸收掉,而不會在電路上形成反射,造成對后面信號的影響。.
3、前置CAS (Post CAS)
為了解決 DDR 內存中指令沖突而設計的功能,它允許 CAS 信號緊隨 RAS 發送,相對於以往的DDR等於將CAS前置了,這樣地址線可以立刻空出來,便於后面的行有效命令發出,避免造成命令沖突而被迫延后的情況發生。
知道了DDR2的基本概念,下面我們再來看下鋯石開發板的DDR2芯片。以 Micron Technology (鎂光科技)公司生產的 MT47H64M16HR-25E DDR2 芯片為例,此芯片的容量為 1Gb,內部結構如圖所示:
從該圖中可以看出,DDR2 存儲單元陣列部分可以說和 DDR、SDRAM基本相同,唯一不同的就是 I/O 輸出和輸入緩沖區部分了。這部分內容主要包含了差分選取脈沖( DQS )、延遲鎖定回路(DLL)和片內終結(ODT )等電路,這和我們前面介紹的是一致的。由於 UDM 和 LDM 只連接到寫操作上,所以 DDR2 是支持寫入數據屏蔽,並不支持讀出數據屏蔽。
另外,小梅哥補充了一些:
五、突發長度的區別
- SDR SDRAM 的突發長度為1、2、4、8、page
- DDR SDRAM 的突發長度為2、4、8 (2bit預讀, 2起步)
- DDR2 SDRAM 的突發長度為4、8 (4bit預讀,4起步)
關於 2bit 預讀、4bit 預讀的概念,另外搜索吧,這里不說了。
六、端口信號
簡單解釋如下所示:
.mem_odt (mem_odt ), //DDR2片上終結信號 .mem_cs_n (mem_cs_n ), //DDR2片選信號 .mem_cke (mem_cke ), //DDR2時鍾使能信號 .mem_addr (mem_addr ), //DDR2地址總線 .mem_ba (mem_ba ), //DDR2BANK信號 .mem_ras_n (mem_ras_n ), //DDR2行地址選擇信號 .mem_cas_n (mem_cas_n ), //DDR2列地址選擇信號 .mem_we_n (mem_we_n ), //DDR2寫使能信號 .mem_dm (mem_dm ), //DDR2數據掩膜信號 .mem_clk (mem_clk ), //DDR2時鍾信號 .mem_clk_n (mem_clk_n ), //DDR2時鍾反相信號 .mem_dq (mem_dq ), //DDR2數據總線 .mem_dqs (mem_dqs ), //DDR2數據源同步信號
小梅哥給出了具體解釋:
懂了一些基本知識后,就可以進行 DDR2 的開發了,下篇見。
參考資料:
1、鋯石科技FPGA教程
2、小梅哥《DDR2簡明教程》