今天我們來(lái)講的是SDRAM的架構以及設計,這也是小墨第一次接觸架構,也談不上給大家講,就是把我理解的當做一個(gè)筆記分享給大家,我也試著(zhù)做了一個(gè)SDRAM 的架構word文檔,在文章的后面,喜歡的朋友可以下載下來(lái)看一下,有什么錯誤也請積極指正,畢竟我也是沒(méi)有老師教,也是自己摸索的,難免有些不合理的地方。 一、SDRAM 工作部分 1、上電初始化 ![]() 我們先來(lái)看第一部分,上電初始化。上電初始化我們知道,上電之后我們需要等待200us的穩定期,這段時(shí)間我們可以用一個(gè)定時(shí)器來(lái)計數,這沒(méi)什么問(wèn)題,然后進(jìn)入的是預充電部分,這個(gè)時(shí)候,預充電的時(shí)候,sdram_cmd模塊會(huì )檢測此時(shí)的初始化狀態(tài)機的狀態(tài),若處于預充電狀態(tài),那么sdram_cmd模塊向SDRAM發(fā)命令,具體命令sdram的datasheet里面有,發(fā)的是一個(gè)precharge,即預充電,發(fā)完命令之后,需要等待一段時(shí)間,來(lái)確保這個(gè)命令被SDRAM捕獲,這等待的時(shí)間,特權老師用的方式我覺(jué)得很好 ![]() 用一個(gè)宏定義,當計數器計數到相應的時(shí)間后,預充電完成參數置位 即end_trp 置位,下面的用法也是一樣,即當初始化狀態(tài)機進(jìn)入預充電狀態(tài)i_pre時(shí),計數器開(kāi)啟,開(kāi)始計數,計數完成,也就是預充電結束的時(shí)候,計數器復位,這個(gè)復位的控制,可以用case語(yǔ)句來(lái)檢測初始化狀態(tài)機的狀態(tài),在相應的狀態(tài)給予相應的復位與置位 接下來(lái)是8個(gè)自刷新,操作和預充電一樣 到了模式寄存器的配置階段,我們需要選定L_bank,以及SDRAM工作模式的配置,當sdram_cmd模塊檢測到初始化狀態(tài)機到達模式寄存器配置階段時(shí),我們的給SDRAM的sdram_bank端口賦相應的值,并且設置地址總線(xiàn) ![]() 當初始化結束的時(shí)候,標志位init_done置位,告訴工作狀態(tài)機,初始化狀態(tài)機已經(jīng)結束,進(jìn)入工作狀態(tài)。下面是我用word做的上電初始化的狀態(tài)轉移圖 ![]() ![]() 2、自刷新 初始化結束之后,SDRAM為了防止數據丟失,要進(jìn)行自刷新,上一篇文章已經(jīng)講過(guò)了,刷新2^12行需要64ms,也就是每15us刷新一行,也就是我們需要每15us發(fā)送一次自刷新請求給SDRAM工作狀態(tài)機,狀態(tài)機一旦檢測到自刷新請求信號,就告訴sdram工作模塊,然后工作模塊就向SDRAM發(fā)送自刷新命令,即CMD_A_PEF ![]() 下面是自刷新的狀態(tài)轉移圖 ![]() 3、讀寫(xiě)狀態(tài) 初始化結束以后,SDRAM就處于工作狀態(tài),每15us進(jìn)行一次自刷新,這個(gè)時(shí)候,如果想要讀或寫(xiě)數據的話(huà),即向工作狀態(tài)機sdram_work_FSM發(fā)送讀寫(xiě)請求,如果是讀請求,那么工作狀態(tài)機進(jìn)入行有效狀態(tài),也即激活狀態(tài)w_active,此時(shí),sdram_cmd模塊會(huì )發(fā)送行有效命令,即CMD_ACTIVEA 同時(shí),我們需要將我們的12位行地址送給我們的sdram地址總線(xiàn)sdram_addr,然后便是一個(gè)等待時(shí)間段,TRCD,這個(gè)時(shí)間段里我們是不需要做什么工作的,只需等待TRCD結束 TRCD結束的時(shí)候,工作狀態(tài)機進(jìn)入讀狀態(tài),此時(shí),我們需要發(fā)送列地址選中我們的存儲單元,并告訴sdram_cmd模塊發(fā)送讀命令,這個(gè)過(guò)程是讀命令和列地址同時(shí)發(fā)送的。我們知道,讀命令發(fā)出之后,會(huì )進(jìn)入潛伏期TCL。 這個(gè)狀態(tài)我們也不需要做什么,因為我們在模式寄存器配置階段已經(jīng)將各種參數配置好了,包括什么潛伏期長(cháng),突發(fā)讀寫(xiě)長(cháng)度之類(lèi)的,等到潛伏期結束之后,SDRAM會(huì )自動(dòng)進(jìn)行讀數據,而且讀的數據長(cháng)度會(huì )跟我們之前設置的一樣長(cháng),這個(gè)讀數據的狀態(tài)需要時(shí)間,即我們的工作狀態(tài)機工作在w_rd狀態(tài),等待8個(gè)時(shí)鐘周期之后,所有的數據都已經(jīng)被送到數據總線(xiàn)。 這個(gè)時(shí)候我們需要等一會(huì ),因為我們在發(fā)送讀命令的時(shí)候,A10是置1的,也就是說(shuō),每次讀寫(xiě)完之后要自動(dòng)進(jìn)行預充電,從而才可以打開(kāi)新的工作行,這時(shí),我們的工作狀態(tài)機即進(jìn)入了w_rwait狀態(tài),等到預充電結束,才完成一次讀操作,返回初始狀態(tài),等待下一個(gè)請求的到來(lái) ![]() 下面是讀寫(xiě)狀態(tài)轉移圖,由于寫(xiě)狀態(tài)只是沒(méi)有潛伏期,寫(xiě)完之后有一個(gè)寫(xiě)回延時(shí),其他地方與讀狀態(tài)相同,我就不再介紹了 ![]() ![]() 二、模擬信號產(chǎn)生部分 我們先來(lái)想一下我們的要想測試我們的SDRAM控制器是否正確,都需要什么測試參數吧 1、 首先我們需要發(fā)送讀寫(xiě)地址對吧,但是我們需要有一個(gè)間隔,即每隔一段時(shí)間發(fā)送一次寫(xiě)地址,為什么呢?因為我們之前在模式寄存器配置的時(shí)候,定義了突發(fā)讀寫(xiě)的長(cháng)度為8,也就是我們發(fā)送一個(gè)地址,那么sdram會(huì )在連續的8個(gè)地址中連續寫(xiě)8次數,我們如果要再發(fā)送地址,需要等到這8次地址寫(xiě)完之后再發(fā)送下一個(gè)地址這個(gè)延時(shí)大概為640ns,也就是計數器為什么要計到3f的原因,下一個(gè)地址的發(fā)送就需要比之前的地址大8了,比如第一次我發(fā)送的是0地址,那,隔一段時(shí)間之后,我就需要發(fā)送8地址了。 讀地址也一樣,當寫(xiě)地址寫(xiě)滿(mǎn)了之后,讓地址清零,從零地址讀起即可 ![]() 還有再解釋一下,特權老師為什么定義22位的模擬地址,22位的模擬地址包括2位的L_BANK的地址,12位行地址和8位列地址。有人會(huì )問(wèn),為什么是行地址和列地址分開(kāi)呢,不是行列地址共用嗎?注意這里只是模擬地址,到時(shí)候我們給地址總線(xiàn)賦值的時(shí)候是分開(kāi)賦值的 2、然后我們需要產(chǎn)生遞增數據,每640ns產(chǎn)生8個(gè)數即可 ![]() 3、在發(fā)送遞增數據之前,我們需要發(fā)送寫(xiě)請求信號,這個(gè)寫(xiě)請求信號是要發(fā)送到我們接下來(lái)要講的FIFO里面,發(fā)送寫(xiě)請求之后,數據進(jìn)入FIFO,注意,這里的寫(xiě)請求是發(fā)送給FIFO的,不是發(fā)送到SDRAM的,SDRAM的寫(xiě)請求是由FIFO發(fā)出去的 ![]() 有人會(huì )問(wèn),寫(xiě)請求有了,是不是還該有讀請求,要知道,我們的數據是先寫(xiě)到FIFO里面,再有SDRAM對FIFO進(jìn)行讀操作,將寫(xiě)進(jìn)FIFO的數據再送到SDRAM,而我們從SDRAM中讀回的數據,同樣要寫(xiě)到FIFO里面,然后我們再從FIFO里面讀。是不是有人會(huì )問(wèn),這不是多此一舉嗎?其實(shí)不然,要知道我們的SDRAM是工作在100M的時(shí)鐘頻率下,而且是有相位偏移的,對我們FPGA來(lái)說(shuō)是一個(gè)異步時(shí)鐘,如果我們不采用FIFO的形式,那很容易發(fā)生亞穩態(tài)問(wèn)題,導致系統不穩定 三、數據緩存部分 1、寫(xiě)FIFO ![]() 我來(lái)解釋一下,寫(xiě)入時(shí)鐘,也就是我們FPGA的時(shí)鐘,50MHZ,在這個(gè)時(shí)鐘頻率下,我們需要給FIFO發(fā)送寫(xiě)請求和遞增數據,wrusedw反映了我寫(xiě)入FIFO的占用量,當sdram工作狀態(tài)機檢測到寫(xiě)請求之后(FIFO發(fā)出的寫(xiě)請求),會(huì )產(chǎn)生一個(gè)響應,告訴FIFO要讀數據了,這個(gè)響應作為FIFO的讀信號,在100MHZ的時(shí)鐘頻率下,將我們寫(xiě)入的數據讀走,送到SDRAM數據總線(xiàn)上 2、讀FIFO ![]() 讀FIFO跟寫(xiě)FIFO相反,寫(xiě)FIFO時(shí)鐘為100MHZ,在這個(gè)時(shí)鐘頻率下,我們將從SDRAM中讀回的數據寫(xiě)到FIFO里面,注意這里我們還用了wrusedw,來(lái)反應寫(xiě)FIFO的占用量,也就是我們從SDRAM里讀了多少數據,然后在50MHZ的時(shí)鐘下,將從SDRAM讀回的數據采集下來(lái),送到顯示模塊來(lái)驗證是否是遞增數據,這個(gè)顯示模塊我們用數碼管來(lái)顯示,比較方便,為了觀(guān)察清楚,我們可以在數碼管顯示模塊,每隔1S種發(fā)送一次讀FIFO請求,這樣在數碼管上,會(huì )每隔1秒鐘顯示一個(gè)遞增的數據了 大體上就是這么多了,整個(gè)SDRAM的工作過(guò)程就介紹完了,還有些細節沒(méi)講到的,大家可以自行消化,有不懂的可以給我留言,或者加我QQ微信,歡迎交流 下一篇文章我們講時(shí)序,真正在板子上讓它跑起來(lái)才是王道,下面附上我做的一個(gè)word,還請各位大神指正~ 以后小墨同學(xué)的文章將北京至芯科技官方技術(shù)論壇同時(shí)更新,至芯科技的官方技術(shù)論壇也有很多的資料供大家下載,里面也有小墨的專(zhuān)題板塊,希望廣大網(wǎng)友和愛(ài)好者的大力支持~ http://www.fpgaw.com/ 小墨同學(xué)《零基礎學(xué)FPGA》學(xué)習專(zhuān)版 一個(gè)大三學(xué)生學(xué)習之路的真實(shí)記錄 http://www.fpgaw.com/thread-78527-1-1.html 下面是至芯科技官方網(wǎng)站,夏宇聞教授和那里的老師都超好的~有意愿接受FPGA培訓的可以找工作人員咨詢(xún) http://www.zxopen.com/ 以后小墨同學(xué)的教程會(huì )跟這款開(kāi)發(fā)板配套,想跟小墨同學(xué)一起學(xué)習,一起進(jìn)步的的可以考慮一下購買(mǎi)一塊開(kāi)發(fā)板,畢竟學(xué)習要舍得投資嘛,下面是開(kāi)發(fā)板淘寶鏈接 http://item.taobao.com/item.htm?spm=a230r.1.14.13.NZBxw3&id=42366952129&ns=1&abbucket=13#detail |