前言
SDRAM控制器里面包含5個主要的模塊,分別是PLL模塊,異步FIFO 寫模塊,異步FIFO讀模塊,SDRAM接口控制模塊,SDRAM指令執行模塊。
其中異步FIFO模塊解讀參考:05-SDRAM控制器的設計——異步FIFO的調用;
http://m.xsypw.cn/d/6468023.html
SDRAM接口控制模塊解讀參考:03-SDRAM控制器的設計——control_interface.v代碼解析;
http://m.xsypw.cn/d/6458523.html
SDRAM指令執行模塊解讀參考:04-SDRAM控制器的設計——command.v代碼解析
http://m.xsypw.cn/d/6466276.html
PLL時鐘模塊
SDRAM控制器模塊里面的PLL將27MHz時鐘倍頻出2個100MHz時鐘,其中一個100MHz時鐘給SDRAM里面的模塊使用;另外一個100MHz時鐘相移-109.8°以后輸出給SDRAM器件。(相移-109.8°是這個SDRAM器件在DE10-Standard開發板上的時序約束經驗值)
PLL參數設置如下:
關于Sdram_Control.v模塊時鐘分布請參考下圖的藍色走線:
其實也可以直接從FPGA 的50MHz時鐘經過PLL得到100M時鐘傳遞給工程里其他模塊工作,這里設置27M是為了讓大家看看FIFO跨時鐘域的一個工作情況。
數據路徑控制
SDRAM的數據口是一個inout接口,要做成三態門控制,控制電路代碼如下:
從command.v傳過來的oe信號為高時,將數據送到DQ端口,此為SDRAM的寫入操作;當oe信號為低時,DQ輸入為高阻,三態門截止,DQ端口的數據送出給讀fifo模塊進行緩存,此為SDRAM的讀操作。(關于oe信號的控制請參考04-SDRAM控制器的設計——command.v代碼解析)
自動且連續的讀寫操作
接下來是設置完成連續讀寫(64個數據)以及進行突發中斷的操作。
command.v模塊里面已經設置突發長度為整頁(整頁可讀寫數據量為1024),所以每次讀寫64個數據后需要提前中斷突發操作。根據IS42R16320D手冊可知下發突發中斷命令或者預充電命令可提前結束突發操作。
該案例選擇預充電命令來結束突發操作。參考前面的章節可知預充電命令是RAS_N, CAS_N,WE_N組合為010。
為了拉出相關信號查看其波形,先要暫時把這些信號輸出,不然這些信號會被Quartus在綜合操作時優化掉。
從波形圖可以看到,確實在每次讀或者寫64個數據后,都會跟著出現一個預充電命令來結束全頁突發操作。
如果上面總體的圖縮小看不清,可以參考下面放大的圖:
可能大家會疑惑為什么不直接寫256個數據,然后讀256個數據?這里設置64個數據長度是為了讓大家看到多次讀和寫是如何進行的。
如果想設置256個數據也是可以的,這時就把自動讀設計成寫完256個數據后自動進行。
此時的波形圖如圖所示(一次性寫完256個數據,一次性讀完256個數據):
指令的產生
讀過程通過Pre_RD和mRD信號的組合標志出連續讀的起始時間,通過Read信號標志出連續讀的過程。
寫過程通過Pre_WR和mWR信號的組合標志出連續寫的起始時間,通過Write信號標志出連續寫的過程。
當FIFO讀模塊中的數據量低于一次需要讀取的數據量時,mRD置1;直到連續讀完成時,mRD才會清零。即mRD保持為0或1的狀態都會持續多個周期,因此我們無法通過電平狀態來判斷是否產生開始讀信號Read,所以這里采取用寄存器保存mRD的前一狀態,并與當前狀態進行比較,當前一狀態為0,當前狀態為1,即產生上升沿時,開始讀信號Read信號置1。寫信號同理。
提前一個時鐘送出異步FIFO寫模塊的讀出使能信號是因為寫數據沒有延遲,寫命令發出的當拍要準備好數據,所以讀使能信號提前一拍給出。
寫入地址和讀出地址
256個數據寫入節奏是這樣的:
當KEY1被按下,觸發了counter產生數據0~255,這個數據同步傳遞給異步FIFO寫模塊進行緩存。當系統檢測到write_side_fifo_rusedw1值大于64時,異步FIFO寫模塊的讀出端口會把FIFO里面的數據讀出,傳遞給SDRAM器件進行儲存。FIFO一次讀出64個數據。總共會讀出4次。
從top文件傳遞過來的地址0開始寫SDRAM,一次寫64個數據,寫第二筆64個數據時初始地址是0+64,寫第三筆64個數據時初始地址是64+64=128,寫第四筆64個數據時初始地址是128+64=192。
256個數據讀出節奏是這樣的:
異步FIFO讀模塊從離開初始化狀態且離開復位狀態且檢測到read_side_fifo_wusedw1小于64時開始讀取SDRAM器件的數據。
其復位狀態的離開主要看KEY0信號和wr_latch信號:
第一筆64個數據(0~63)是等異步FIFO寫模塊已經完成256個字節的緩存操作(其中的192個數據已寫入到SDRAM器件了)以后讀出。此時讀SDRAM的地址送出是0。
第二筆64個數據(64~127)是等異步FIFO讀模塊讀出第一個數據0的下一個時鐘節拍讀出,因為此時read_side_fifo_wusedw1的值64-1等于63又小于64。此時讀SDRAM的地址送出是64。
第三筆64個數據(128~191)是等到異步FIFO讀模塊數據又只剩63個數據時讀出,此時地址送出是128。
第四筆64個數據(192~255)同樣是等到異步FIFO讀模塊數據又只剩63個數據時讀出,此時地址送出是192。
無論是SDRAM寫操作還是讀操作,在讀寫完256個數據后又會從地址0開始重復讀寫:
拿SDRAM讀操作來說,當讀完256個數據還繼續觸發讀操作時抓取波形圖可以看到:
可能讀者會有疑惑,當異步FIFO寫模塊第四次累計了64個數據時,為什么沒有馬上寫入SDRAM器件,而是先從SDRAM器件里面讀出64個數據緩存到異步FIFO讀模塊,等這64個數據讀完以后再繼續往SDRAM里面寫最后的64個數據(192~255)。這里是因為if語句存在優先級,電路是先判斷有沒有讀指令,當有讀命令時就先處理讀操作。當異步FIFO寫模塊寫入了第四個64個數據后,異步FIFO讀模塊就離開了復位狀態,系統會自動發送讀命令,此時就開始SDRAM器件數據的讀取操作。
PS:
本文的Signaltap波形圖文件對應:~sdramcontroloutput_filesSdram_Control.stp
-
fifo
+關注
關注
3文章
392瀏覽量
44055 -
代碼
+關注
關注
30文章
4856瀏覽量
69434 -
SDRAM控制器
+關注
關注
0文章
29瀏覽量
8229
原文標題:07-SDRAM控制器的設計——Sdram_Control.v代碼解析
文章出處:【微信號:友晶FPGA,微信公眾號:友晶FPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
【開源騷客】《輕松設計SDRAM控制器》第九講—解密讀寫FIFO
多路讀寫的SDRAM接口設計
【每周FPGA案例】至簡設計系列- SDRAM讀寫控制器
具有時間隱藏特性的數據塊讀寫SDRAM控制器
基于FPGA的高速SDRAM控制器的視頻應用
NiosII的奇幻漂流-Chap09-SDRAM-v1.0
SDRAM控制器的設計

FPGA讀寫SDRAM的實例和SDRAM的相關文章及一些SDRAM控制器設計論文

如何使用FPGA設計SDRAM控制器

評論