提出一種便于用戶操作并能快速運用到產品的DDR2控制器IP核的FPGA實現,使用戶不需要了解DDR2的原理和操作方式的情況下,依然可以通過IP核控制DDR2。簡單介紹了DDR2的特點和操作原理,并對DDR2控制器的IP核進行了模塊化的劃分,分析了每個模塊的功能。強調了用戶接口功能的完善,并介紹了IP核的操作流程,使每個用戶都能輕松的使用該IP核。
1 引言
DDR2作為主流的內存具有存取速度快、存儲量大、成本較低等特點,因此被廣泛地運用到計算機、汽車導航系統、高清數字電視、數碼相機等電子行業的各大領域當中。隨著科技的發展,FPGA的技術也在不斷進步,FPGA的性能、穩定性、容量等指標已經有了很大的提高。鑒于FPGA的發展和DDR2高性能的表現,越來越多的研發人員會通過FPGA直接對DDR2進行控制,這時他們必須對DDR2的工作原理有深入的了解,但這樣就很可能加大了研發周期,直接影響了公司的經濟效益。因此設計一款開發人員完全不需要了解DDR2工作原理的DDR2控制器IP核是非常具有實際意義的。
本文提出了一款方便用戶使用的DDR2控制器方案。用戶不需要了解DDR2的工作原理,只用控制有限的幾個用戶接口就可以對DDR2進行操作,在產品開發時可以大大縮短開發周期。
2 DDR2的特點
DDR2是基于JEDEC(Joint Electronic Device Engineering Council)標準的外部存儲設備,并且DDR2還有著低功耗,高密度和高頻率等特點。與DDR相比DDR2具有如下特點:
1)相同的核心的頻率的情況下,DDR2的工作頻率是DDR的兩倍。
2)ODT(on.Die Termination)片內終結器:為了防止信號反射問題,DDR2中集成了ODT。ODT能夠吸收線路終端的信號的影響,而且能使得信號質量更高和數據傳輸更快。
3)OCD(Off-Chip Driver)離線驅動調整:通過調整輸出驅動的上拉/下拉電阻值,使得充、放電動作的電壓誤差減到最小,調整DQS和DQS#的波形交叉點,平衡參考時鐘的上升沿和下降沿波形,從而保證內部輸出驅動的穩定。
4)前置CAS(Posted Column Address Strobe)前置列地址選通:通過將CAS信號插到RAS(Row Address Strobe)信號的后一個時鐘周期,避免命令和CAS信號的沖突,提高命令總線和數據總線的速度。
3 DDR2的操作原理
對DDR2的操作是一個復雜又繁瑣的過程,它的主要操作如下:
1)初始化:DDR2的工作方式是由內部和外部寄存器所控制的,因此在上電時先需要對DDR2的寄存器進行配置,即初始化。通過初始化可以對DLL,Burst Length(突發長度),Burst type(突發類型),CAS Latency(CAS延時),CL latency(CL延時),ODT,OCD,等的配置。
2)行激活和列選址:在DDR2內部存儲就好是被分成幾個表格一樣,L-BANK表示有幾張表格,而在每一張表格中首先確定它的行,再確定列來選取所存放的地方。根據DDR2的特征,對DDR2的地址選擇分為兩步:第一步行激活:片選CS#拉低,通過BAO、BA1(BA2)來選擇L-BANK,把行選通RAS#拉低,通過地址線輸入行地址。第二步列選通:在行激活的下個周期,列選通CAS#拉低,通過地址線輸入列地址。如果是在同一行進行操作時,就可以省略行激活。
3)讀/寫指令的發布:當列選址完成后,經過AL的延時就可以發出讀/寫命令對DDR2進行操作了,再經過CL個周期(從讀操作的命令發出到第一個數據的延時)的延時第一
個讀數據輸出或者是經過CL-1個周期(寫操作命令的延時比讀操作命令的延時少一個周期)的延時輸入第一個數據。
4)預充電(Precharge):DDR2為動態儲存體,它的儲存體上的電容電壓會因為時間或干擾的情況下使電壓值變化,從而使數據產生變化。在對另一行進行操作時必須關閉原來的行,重新發送行/列地址,這時會對DDR2產生干擾,因此在重新換行時要對其電容進行有選擇的充電操作即進行預充電。
5)刷新(refresh):DDR2的儲存體是體積極小的電容,由于漏電的存在,電容中的電量會不斷的減小,而儲存體是根據電容電量的多少來判斷數據是1或者是0的,為了保證數據的可靠性,就需要定時對存儲體上的電容進行有選擇的充電,即刷新。
4 DDR2控制器IP核的架構思想
一方面DDR2具有動態存儲的特點,它需要在一定的時間和特殊的情況下進行充電,因此在數據傳輸的時候不能進行不間斷傳輸,而要對傳輸的數據量進行有效的實時控制。另一方面DDR2又具有高速的特點,在DDR2數據傳輸方面頻率很高,而在FPGA內部的控制方面又不需要達到這么高的頻率,因此在FPGA的內部就形成一個跨頻域的操作形式。基于上述兩方面的原因,在DDR2控制器的IP核上采用控制模塊和數據模塊分離的方式,再用時鐘模塊為兩個模塊輸入時鐘,最后加了用戶接口使用戶可以快速和方便的使用IP核。
5 DDR2控制器IP核中各模塊的功能
DDR2控制器是有四個模塊組成:時鐘模塊,控制模塊,數據鏈路模塊,用戶接口模塊。
5.1 時鐘模塊
時鐘模塊是由Xilinx的DCM 核構成,主要用來接收FPGA外部時鐘,然后通過分頻和倍頻產生用戶接口時鐘、數據鏈路模塊使用的時鐘、控制模塊使用的時鐘和DDR2的時鐘。它還有一個作用就是用復位信號對整個IP核進行全局復位。
5.2 控制模塊
控制模塊作為控制器的中樞,它主要負責對DDR2的初始化和命令的操作,因此控制模塊基本上是由初始化和命令控制兩部分組成。
初始化:在DDR2上電后經過20μs的穩定期,我們把時鐘使能信號CKE置高,等待400ns的時間后進行第一次的預充電,然后對外部寄存器和模式寄存器進行配置,緊接著執行第二次預充電和兩次刷新,再判斷DLL是否正確鎖定,配置OCD,最后等待初始化完成。如果初始化結束,我們就把信號initial_done置高表示初始化完成用戶可以對DDR2進行操作了。
命令控制:命令控制部分主要用作DDR2初始化后,產生控制信號和每個操作中的延時,并分析用戶命令對DDR2進行自動刷新、讀操作、寫操作、預充電等操作。當用戶寫入讀寫命令的時候,狀態機(圖3)可以自動的進行判斷初始化是否完成、行激活、列尋址、預充電、自動刷新、讀寫命令發布等操作。
5.3 讀/寫數據鏈路模塊
DDR2是一個高速的,并且是時鐘上、下沿都采樣數據的芯片,因此對于數據鏈路模塊的時序要求非常嚴格。為了能夠嚴格控制時序問題,采用了Xilinx的SPARTAN6的特殊原語模塊IIDDR和ODDR對數據進行處理。在數據鏈路模塊中采用讀數據鏈路和寫數據的鏈路獨立的方式,這樣使讀/寫數據完全獨立,使用戶更容易對數據進行控制。
5.4 用戶接口模塊
用戶接口模塊作為和用戶直接連接的模塊,它功能的強大與否直接影響用戶對IP核控制的難易度。為了使用戶很容易把控制器的IP核運用到工程項目中,整個模塊中包含了READ
FIFO、WRITE FIFO、COMMAND FIFO、命令子模塊、用戶數據鏈路子模塊,用戶控制模塊子模塊。READ FIFO、WRITE FIFO、 COMMAND FIFO 使用戶可以的控制命令和數據連續的輸入和輸出。命令子模塊可以翻譯用戶輸入的命令,用戶只需要發送讀或寫命令、命令要操作的首地址和總共讀/寫多少個數據,命令子模塊就可以根據情況發送命令控制給用戶控制子模塊。用戶控制子模塊再以狀態機的形式控制COMMAND FIFO、WRITE FIFO、READ FIFO對與用戶接口模塊相連的主控制模塊和數據鏈路模塊進行控制,對DDR2進行讀/寫等操作。
6 如何控制IP核對DDR2進行操作
這個設計的DDR2控制器IP核不需要用戶了解DDR2的工作特性就能很好的操作IP核對DDR2進行讀寫等操作,如圖4所示。
1)首先通過INITIAL_DONE初始化完成信號判斷DDR2是否初始化完成,初始化完成INITIAL_DONE置1,否則為0。
2)開始操作時把開始信號START置1,通過WRITE_BUSY和READ_BUSY信號來判斷是否可進行命令的發送。WRITE_BUSY信號為2位寬,WRITE_BUSY[1]表示命令信號,為1時表示忙,0時表示不忙可以發送命令。WRITE_BUSY[0]表示數據信號,為1時表示忙不能發送數據,0時可以發送數據。READ_BUSY信號與WRITE_BUSY信號有著相同的功能,并且只有在READ_BUSY[1]和WRITE_BUSY[1]信號都為0時才能發送命令,也就是命令不能同時進行。當WRITE_BUSY=01和READ_BUSY=01時,CMD=000為寫操作。
3)當WRITE_BUSY[1:0]信號為10時可以在時鐘的上升沿時對WRITE_DATA輸入數據,并且可以通過對WRITE_MASK相應的位賦1來屏蔽不想要的數據或者是避免當數據不夠而寫入0的情況。
4)當寫入結束時WRITE_BUSY=01時可以把START信號置0,結束寫入。
7 結語
為了驗證此DDR2控制器IP核的實用性,我們通過Xilinx公司的xc6slx45t器件以及美光的MT47H12816XX-3DDR2模型做了仿真,并在Xilinx的sp601開發板進行了實驗。通過測試代碼往DDR2中寫入132個128位的數據(如圖5),并從DDR2中讀取寫入的數據(如圖6)。通過實驗證明了即使用戶不很清楚DDR2的工作原理,也可以很方便的通過本文設計的DDR2控制器IP核對DDR2進行讀寫操作。
評論
查看更多