<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          關(guān) 閉

          新聞中心

          EEPW首頁 > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > SDRAM通用控制器的FPGA模塊化設(shè)計(jì)

          SDRAM通用控制器的FPGA模塊化設(shè)計(jì)

          ——
          作者:天津大學(xué)精密儀器與光電子工程學(xué)院生物醫(yī)學(xué)工程系 李剛 李智 時(shí)間:2007-09-10 來源:中電網(wǎng) 收藏
          引言

                
          同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器(),在同一個(gè)CPU時(shí)鐘周期內(nèi)即可完成數(shù)據(jù)的訪問和刷新,其數(shù)據(jù)傳輸速度遠(yuǎn)遠(yuǎn)大于傳統(tǒng)的數(shù)據(jù)存儲(chǔ)器(DRAM),被廣泛的應(yīng)用于高速數(shù)據(jù)傳輸系統(tǒng)中?;?a class="contentlabel" href="http://www.ex-cimer.com/news/listbylabel/label/FPGA">FPGA控制器,以其可靠性高、可移植性強(qiáng)、易于集成的特點(diǎn),已逐漸取代了以往的專用控制器芯片而成為主流解決方案。然而,復(fù)雜的控制邏輯和要求嚴(yán)格的時(shí)序,成為開發(fā)過程中困擾設(shè)計(jì)人員主要因素,進(jìn)而降低了開發(fā)速度,而且大多數(shù)的基于的SDRAM控制器都是針對(duì)特定的SDRAM芯片進(jìn)行設(shè)計(jì),無法實(shí)現(xiàn)控制器的通用性。本文介紹一種通用SDRAM控制器的模塊化解決方案。

                 SDRAM控制邏輯復(fù)雜,命令種類多樣,需要周期性刷新操作、行列管理的等多重操作。

                 SDRAM首先要進(jìn)行初始化操作。在上電后等待100ns, 至少執(zhí)行1條空操作,然后對(duì)所有頁執(zhí)行預(yù)充電操作,接著向各頁發(fā)出兩條刷新操作指令,最后執(zhí)行SDRAM工作模式的設(shè)定LMR命令用來配置SDRAM工作模式寄存器。SDRAM工作寄存器可以根據(jù)具體應(yīng)用的需要進(jìn)行設(shè)置。

                 初始后的SDRAM在得到了RAS、CAS、WE的值后開始執(zhí)行相應(yīng)的命令。在對(duì)SDRAM進(jìn)行讀、寫過程中,必須要先進(jìn)行頁激活A(yù)CT操作,保證存儲(chǔ)單元是打開的,以便從中讀取地址或者寫入地址,然后通過預(yù)充電PHC命令實(shí)現(xiàn)來關(guān)閉存儲(chǔ)單元。在進(jìn)行寫操作時(shí),內(nèi)部的列地址和數(shù)據(jù)都會(huì)被寄存,而進(jìn)行讀操作時(shí),內(nèi)部地址被寄存,數(shù)據(jù)的存儲(chǔ)則發(fā)生在CAS延遲時(shí)間(通常為1~3個(gè)時(shí)鐘周期)后。最后,操作終止:當(dāng)SDRAM順次的進(jìn)行讀、寫操作后,當(dāng)?shù)竭_(dá)到突發(fā)長(zhǎng)度或者突發(fā)終止指令BT出現(xiàn)時(shí),SDRAM將終止其操作。

                 模塊化的SDRAM控制器設(shè)計(jì)

                
          在SDRAM控制器的FPGA實(shí)現(xiàn)方案中,采用了:FPGA的自底向上的模塊化設(shè)計(jì)思想,首先分析頂層模塊的功能,再將其功能分類細(xì)化,分配到不同的子模塊去實(shí)現(xiàn),然后自底向上的先逐步完成各個(gè)子模塊的設(shè)計(jì),最后將子模塊相互連接生成頂層模塊。經(jīng)過分析,SDRAM控制器應(yīng)實(shí)現(xiàn)的功能有:為SDRAM提供刷新控制以保持SDRAM中的數(shù)據(jù);對(duì)主機(jī)的命令進(jìn)行仲裁,將下一步要執(zhí)行的命令翻譯成可與SDRAM連接的信號(hào);為SDRAM的讀、寫生成數(shù)據(jù)路徑。因此,根據(jù)SDRAM的指令操作特點(diǎn)將SDRAM控制器劃分為接口控制模塊、命令生成模塊和數(shù)據(jù)路徑模塊三個(gè)主要模塊(圖1)。

          SDRM控制器的FPGA模塊化設(shè)計(jì)

                 下面,對(duì)其接口信號(hào)進(jìn)行介紹,需要注意的是,為了實(shí)現(xiàn)該控制器的通用性,ADDR、DATAIN、DATAOUT、DQ、DOM信號(hào)設(shè)計(jì)成可根據(jù)SDRAM的容量改變的形式。

                 與主機(jī)接口信號(hào):CLK(系統(tǒng)時(shí)鐘);RESET(系統(tǒng)復(fù)位);CMD[2:0](譯碼指令);CMDACK(指令應(yīng)答信號(hào));ADDR[ASIZE-1:0】(地址線);DATAIN/DATAOU[DSIZE-1:0](輸入、輸出數(shù)據(jù)總線);DM[(DSIZE/8)-1:0】(數(shù)據(jù)掩碼)。

                 與SDRAM接口信號(hào):SA(地址線);BA(頁地址);CS-N(片選信號(hào));CKE(時(shí)鐘使能信號(hào));RAS、CAS、WE(命令控制信號(hào));DQM[(DSIZE/8)-1:0](SDRAM數(shù)據(jù)掩碼);DQ[DSIZE-1:0】(雙向數(shù)據(jù)線)。

              各個(gè)模塊的設(shè)計(jì)與實(shí)現(xiàn)

                 接口控制模塊

                
          接口控制模塊主要實(shí)現(xiàn)的功能是將CMD[2:0]翻譯成接口指令和對(duì)刷新計(jì)數(shù)器的控制指令。接口模塊在工作過程中首先通過要通過狀態(tài)機(jī)來完成對(duì)CMD[2:0]的翻譯。在VHDL程序中聲明一個(gè)用戶自定義類型states,根據(jù)CMD[2:0】輸入來決定狀態(tài)的轉(zhuǎn)移,完成對(duì)CMD[2:0】的解碼,部分代碼如下:
                  

                 另外,SDRAM需要周期性刷新操作以保持?jǐn)?shù)據(jù)。在模塊的程序設(shè)計(jì)中,刷新周期的控制通過一個(gè)計(jì)數(shù)器來完成,到達(dá)規(guī)定的計(jì)數(shù)周期數(shù)時(shí),接口模塊通過REF_REQ信號(hào)向SDRAM發(fā)出刷新請(qǐng)求。直到SDRAM完成刷新操作,發(fā)出REF_AcK刷新應(yīng)答信號(hào),計(jì)數(shù)器才重新賦值,開始下一次的計(jì)數(shù)。

                 命令生成模塊

                
          命令生成模塊實(shí)現(xiàn)對(duì)輸入的SDRAM指令請(qǐng)求進(jìn)行仲裁判斷的功能,并將仲裁后要執(zhí)行的指令解碼成sDRAM需要的RAS、CAS等信號(hào),從而實(shí)現(xiàn)指令對(duì)SDRAM的控制。仲裁機(jī)制是SDRAM控制器設(shè)計(jì)不可或缺的一個(gè)環(huán)節(jié)。仲裁機(jī)制實(shí)現(xiàn)要遵循如下規(guī)則:

                

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();