《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 其他 > 教程:SDRAM存儲控制器的設計與實現

教程:SDRAM存儲控制器的設計與實現

2022-10-24
來源:FPGA之旅
關鍵詞: 存儲控制器 SDRAM

  一. 簡介

  本例將介紹SDRAM的使用。SDRAM是一個存儲器件,存儲容量大,存儲速度比較快,速度可達100M,特別適合用來當做視頻或者音頻中的存儲器件。

  在采集到OV5640傳輸過來的圖像數據的時候,FPGA的片上資源是沒有那么大的存儲空間進行存儲的,必須通過外部的存儲器件進行存儲。恰好開發板上有一片SDRAM,所以用此來進行存儲,一般而言入門級的FPGA開發板上都是配置的SDRAM,中高級一點的是DDR2(alter開發板),DDR3(xilinx開發板)。

  所以本例將實現一個完善的SDRAM存儲控制器,供大家查看。

  二. SDRAM接口信號

  從下面框圖中可以看出,SDRAM接口信號可以分為四大類:控制信號,地址信號,數據輸入輸出信號,掩碼信號。下面將詳細介紹各個命令的作用。

  050.JPG

  以上就是SDRAM的全部接口信號了,并沒有特別復雜。

  下圖是SDRAM的所有命令,在對SDRAM進行操作的時候,需要使用到。

049.JPG

  然后在。v文件中先將其定義出來,方便后續使用

048.JPG

  三.  SDRAM上電初始化

  上電后,沒有任何時序上的操作,只需要延時100us(手冊上要求最小為100us),使輸入輸出電平達到穩定,即可,在此期間,發送的命令最好為NOP。

  這里初始化包括了初始化和加載模式寄存器,我認為初始化,就是加載模式寄存器。

 ?。?)模式寄存器

  模式寄存器的定義如下,通過地址線給出,每位都有其具體的含義。

  0-2 bit:定義突發長度,每給一個讀/寫命令后,輸出/輸入的數據大小

  4-6bit :定義潛伏期,發出讀命令后,延時多少個周期給讀數據,僅對讀操作有效

  10-12bit: 保留,始終置高即可

  其余位始終保持為0即可。模式寄存器的內容就這么多。

047.JPG

  (2)初始化

  下圖是初始化的過程,按照圖示要求依次發送對應的命令即可,命令與命令之間的間隔時間手冊上都有說明,取的時候,可以適當取大。模式寄存器的A信號被分成了兩部分A10和其他,可以看到A10在PRECHARGE階段有特殊作用,一般為1,對所有的bank都進行預充電。

  在模式寄存器中A10也是為1的,所以在整個初始化過程中,A可以直接賦值為模式寄存器的值。

046.JPG

  實現過程如下,也是非常簡潔的,編寫好初始化模塊看,可以直接仿真,這里多虧了大佬寫的sdram模型(就是一個。v文件),不用上板,可以直接仿真看代碼編寫是否正確。

  045.JPG

  仿真輸出如下,可以看到和時序圖中,命令發送過程是一樣,同時也可以看到,模式寄存器配置的具體參數,非常方便,初始化模塊就順利的編寫完成了。

 044.JPG

  四. 刷新模塊

  由于sdram的特殊結構,sdram在使用的過程中,需要每隔一段時間,對所有的存儲區域進行一次刷新操作(充電),否則內部存儲的數據會丟失,這將會成為后面設計的一大難點。

  根據手冊得知每64ms需要完成8192次刷新操作,也就是下面的時序圖需要在64ms內運行8192次,平均下來7us就要進行一次,這個時間需要記住非常重要。

  同樣也是根據手冊給出的時序圖進行編寫代碼,一共需要發送三個命令

043.JPG

  代碼實現如下,也是非常容易實現的。

042.JPG

  從圖中可以看出,每隔7090ns進行一次刷新,滿足要求。

  041.JPG

  至此,初始化和刷新模塊編寫完成,這兩部分只需要按照手冊上給出的時序圖來編寫代碼即可,比較容易即可完成,后面的讀寫模塊會復雜一些。

  五. 寫模塊

  讀模塊的時序圖如下,截取的是沒有auto precharge操作的,也就是在數據寫完后,需要手動發送一個precharge命令。同樣可以讓sdram自動完成這個操作,只需要在發送write命令的時候,將A10拉高即可,這樣在發送完數據后,就可以直接結束了,不用發送precharge命令。本次介紹的是需要發送precharge命令。

  設計時需要清楚以下兩個問題

  發送過程中,需要切換行地址或者bank的時候,應該怎樣操作

  發送過程中,突然來了刷新請求時,該如何處理

  040.JPG

  先對第一個問題進行說明一下,在sdram中,行地址和bank是發送ACTIVE命令時指定的,發送write命令時,就可以指定列地址了,如下BL=1。也就是說切換行地址或bank時需要重新發送ACTIVE命令。ps:寫操作是沒有潛伏期的。

039.JPG

  手冊中也給出了這部分的時序圖,如下。需要注意的一點是,它這是使能了auto precharge,所以數據發送完成后,沒有發送precharge命令,就發送了ACTIVE命令來切換行地址或bank了。沒有使能的情況下,需要加上precharge地址,然后再延時tRCD,發送ACTIVE命令,這點需要注意。

038.JPG

  第二個問題,當刷新請求來時,這個時候當然是要暫停發送數據,需要保存已經發送數據的個數,以及當前發送的地址和bank。然后在刷新結束后,繼續發送數據。

  模塊框圖和狀態機如下。在write_data_en使能的情況下,外部輸入數據進來,其余時刻輸入的數據無效,相當于一個握手信號。sdram模式寄存器配置的是突發長度為1,所以這里單次寫突發長度是沒有大小限制的。

  sdram_write

  (

  input               sdram_clk,

  input               rst_n,

  input               sdram_write_req,            //寫請求

  output              sdram_write_ack,            //寫響應

  input               sdram_write_pause,          //寫暫停信號,轉去刷新操作

  output  reg         sdram_write_pause_ack,      //寫暫停響應,成功暫停

  input[24:0]         write_addr,                 //寫入地址

  input[15:0]         write_data,                 //寫入數據      {bank[1:0s],row[12:0],clo[9:0]}

  input[9:0]          write_burst_length,         //單次寫突發長度    //可以為sdram大小

  output              write_data_en,              //寫入數據有效輸出

  //sdram接口

  output[3:0]         sdram_write_cmd,

  output[12:0]        sdram_write_addr,

  output[1:0]         sdram_write_ba,

  output[15:0]        sdram_write_data

  );

  localparam      S_IDEL                  =   'd0;        //空閑態

  localparam      S_ACTIVE                =   'd1;        //激活態

  localparam      S_WRITE                 =   'd2;        //寫數據

  localparam      S_PAUSE                 =   'd3;        //寫暫停

  localparam      S_ALTERNATE             =   'd4;        //換行換bank緩存

  localparam      S_PRECHARGE             =   'd5;        //寫結束后或切換行列地址,發送precharge命令

  localparam      S_END                   =   'd6;        //寫結束

  always@(*)

  begin

  case(state)

  S_IDEL:

  if( sdram_write_req == 1'b1 )

  next_state <= S_ACTIVE;

  else

  next_state <= S_IDEL;

  S_ACTIVE:

  if( sdram_write_pause == 1'b1 )     //寫暫停信號,轉去刷新操作

  next_state <= S_PAUSE;

  else if( time_cnt == `tRCD )

  next_state <= S_WRITE;

  else

  next_state <= S_ACTIVE;

  S_WRITE:

  if( sdram_write_pause == 1'b1 )     //寫暫停信號,轉去刷新操作

  next_state <= S_PAUSE;

  else if( alternating_bank_row_en == 1'b1)

  next_state <= S_PRECHARGE;

  else if( write_burst_length_cnt == write_burst_length )

  next_state <= S_PRECHARGE;

  else

  next_state <= S_WRITE;

  S_PAUSE:

  if( sdram_write_pause == 1'b0 )     //刷新操作結束

  next_state <= S_ACTIVE;

  else

  next_state <= S_PAUSE;

  S_ALTERNATE:

  if( time_cnt == `tRCD)

  next_state <= S_ACTIVE;

  else

  next_state <= S_ALTERNATE;

  S_PRECHARGE:

  if( time_cnt == `tRP + `tWR)

  if( write_burst_length_cnt >= write_burst_length)

  next_state <= S_END;

  else

  next_state <= S_ALTERNATE;

  else

  next_state <= S_PRECHARGE;

  S_END:

  next_state <= S_IDEL;

  default :  next_state <= S_IDEL;

  endcase

  end

  最后通過仿真,確認實現正確,第一幅圖是寫過程進行刷新操作,第二幅圖是,寫過程切換行地址

037.JPG

  六. 讀模塊

  讀模塊過程的編寫和寫模塊是一模一樣的,不過需要注意的是讀模塊有潛伏期,命令發送和數據輸出相差CL個時鐘周期,讀數據的時候,需要將這個延時加入其中,可以看到接口信號和寫模塊是一樣。不過對數據進行采樣的時候,需要使用輸入到sdram中的時鐘,這需要注意。

  036.JPG

  sdram_read

  (

  input               sdram_clk,

  input               rst_n,

  input               sdram_read_req,            //讀請求

  output              sdram_read_ack,            //讀響應

  input               sdram_read_pause,          //讀暫停信號,轉去刷新操作

  output  reg         sdram_read_pause_ack,      //讀暫停響應,成功暫停

  input[24:0]         read_addr,                 //讀入地址

  output[15:0]        read_data,                 //讀出數據      {bank[1:0s],row[12:0],clo[9:0]}

  input[9:0]          read_burst_length,         //單次讀突發長度    //可以為sdram大小

  output              read_data_en,              //讀數據有效輸出

  //sdram接口

  output[3:0]         sdram_read_cmd,

  output[12:0]        sdram_read_addr,

  output[1:0]         sdram_read_ba,

  input[15:0]        sdram_read_data

 ?。?;

  通過仿真輸出,確定突發讀期間,換行以及刷新完全正確

 035.JPG

  至此SDRAM模塊的編寫就完成了,頂層框圖如下,至于在外部如何進行封裝,那就看不同的需求了。

  SDRAM_TOP(

  input                       sys_clk,                    //sdram的系統時鐘 100M

  input                       rst_n,                      //異步復位信號

  //讀接口

  input                       read_req,

  output                      read_ack,

  input[24:0]                 read_addr,

  input[9:0]                  read_burst_length,

  output[15:0]                read_data,

  output                      read_data_en,

  //寫接口

  input                       write_req,

  output                      write_ack,

  input[24:0]                 write_addr,

  input[9:0]                  write_burst_length,

  input[15:0]                 write_data,

  output                      write_data_en,

  //sdram接口

  output                      sdram_clk,         //sdram clock

  output                      sdram_cke,         //sdram clock enable

  output                      sdram_cs_n,        //sdram chip select

  output                      sdram_we_n,        //sdram write enable

  output                      sdram_cas_n,       //sdram column address strobe

  output                      sdram_ras_n,       //sdram row address strobe

  output[1:0]                 sdram_dqm,         //sdram data enable

  output[1:0]                 sdram_ba,          //sdram bank address

  output[12:0]                sdram_addr,        //sdram address

  inout[15:0]                 sdram_dq           //sdram data

 ?。?;

  結束



更多信息可以來這里獲取==>>電子技術應用-AET<<

mmexport1621241704608.jpg

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          一区二区三区导航| 一区二区在线观看视频| a91a精品视频在线观看| 久久久噜噜噜久久人人看| 91久久精品一区| 久久三级视频| 国产日韩欧美不卡在线| 欧美另类变人与禽xxxxx| 亚洲肉体裸体xxxx137| 欧美日本在线| 久久久精品tv| 欧美国产日韩a欧美在线观看| 亚洲国产精品成人va在线观看| 亚洲自拍都市欧美小说| 一区二区三区欧美在线| 最新国产乱人伦偷精品免费网站| 一区视频在线看| 国产亚洲欧美日韩精品| 欧美成人精品1314www| 亚洲裸体视频| 狠狠色综合色综合网络| 亚洲欧洲一级| 国产欧美日韩在线播放| 亚洲毛片网站| 一片黄亚洲嫩模| 欧美一级在线视频| 一本综合精品| 精品av久久707| 欧美日韩大片| 国内精品久久久久久久影视蜜臀| 在线日韩av片| 欧美**字幕| 国产精品久久久久久久久免费| 午夜久久久久久久久久一区二区| 国产婷婷一区二区| 久久全球大尺度高清视频| 午夜免费日韩视频| 亚洲在线日韩| 亚洲理伦电影| 国产精品sm| 国产欧美综合一区二区三区| 欧美日韩一区二区三区高清| 99国产精品久久久久久久久久| 国产精品视频导航| 日韩一二三在线视频播| 亚洲国产日韩欧美一区二区三区| 国产精品jizz在线观看美国| 国内精品久久久久影院色| 欧美日韩免费| 欧美另类综合| 亚洲精品网址在线观看| 美女任你摸久久| 亚洲福利在线观看| 国产一级揄自揄精品视频| 久久综合网色—综合色88| 老司机精品福利视频| 在线精品在线| 欧美精品日韩| 亚洲欧美日本日韩| 欧美一区二区三区久久精品茉莉花| 国产精品高潮视频| 国产有码在线一区二区视频| 欧美精品亚洲| 欧美在线视频一区二区| 国产精品日日摸夜夜添夜夜av| 在线精品亚洲| 欧美日韩在线三级| 欧美国产日韩一二三区| 国产精品视频男人的天堂| 久久精品国产96久久久香蕉| 国产欧美日韩在线播放| 欧美日韩免费高清一区色橹橹| 亚洲电影免费观看高清完整版在线| 在线欧美一区| 在线观看亚洲视频啊啊啊啊| 亚洲乱码日产精品bd| 欧美亚洲成人网| 欧美成人午夜激情| 美女任你摸久久| 国产欧美日韩一区二区三区| 国产亚洲欧美一级| 亚洲一区二区三区免费视频| 久久精品夜色噜噜亚洲a∨| 伊人成年综合电影网| 欧美第十八页| 老司机67194精品线观看| 日韩视频中文字幕| 欧美日韩国产在线看| 国产精品久久7| 久久久久中文| 久久av一区二区| 国产精品影音先锋| 欧美午夜精品久久久久久超碰| 国产精品女主播| 欧美高清成人| 国产欧美日韩亚洲一区二区三区| 久久久久国内| 亚洲欧美在线一区二区| 在线免费观看成人网| 欧美精选一区| 午夜亚洲一区| 亚洲黄色免费| 国产精品毛片| 欧美人与性动交a欧美精品| 久久嫩草精品久久久精品一| 亚洲精品国精品久久99热| 欧美在线一区二区| 久久午夜激情| 欧美午夜精品久久久| 亚洲婷婷综合久久一本伊一区| 正在播放日韩| 国产精品最新自拍| 久久先锋影音av| 国产尤物精品| 一区在线免费| 久久动漫亚洲| 欧美日韩另类综合| 国产精品视频第一区| 伊人久久久大香线蕉综合直播| 一本色道**综合亚洲精品蜜桃冫| 免费观看久久久4p| 欧美大片一区二区三区| 久久精品亚洲国产奇米99| 国产欧美日韩另类视频免费观看| 日韩午夜av| 欧美视频一二三区| 欧美日韩在线第一页| 国产麻豆日韩| 国产亚洲精品久久久久动| 国产视频一区欧美| 欧美电影免费观看大全| 欧美视频官网| 亚洲深夜影院| 99re66热这里只有精品3直播| 欧美日韩精品免费| 国产欧美日韩精品丝袜高跟鞋| 久久青草欧美一区二区三区| 另类酷文…触手系列精品集v1小说| 久久精品亚洲| 国产日韩欧美在线| 91久久精品国产91久久| 久久精品视频99| 久久综合久久综合九色| 亚洲女性喷水在线观看一区| 亚洲乱码国产乱码精品精天堂| 欧美777四色影视在线| 国产欧美日韩在线观看| 欧美激情网站在线观看| 欧美午夜激情小视频| 亚洲一区尤物| 欧美极品在线播放| 尤物网精品视频| 久久久久久黄| 欧美96在线丨欧| 国产日韩免费| 国产视频久久久久| 欧美日韩一区在线观看| 国产精品高精视频免费| 国产一区二区在线观看免费播放| 亚洲国产成人精品女人久久久| 亚洲私人影吧| 亚洲欧美综合网| 亚洲福利久久| 先锋a资源在线看亚洲| 欧美激情综合色综合啪啪| 亚洲狼人精品一区二区三区| 欧美成人亚洲成人日韩成人| 欧美日韩国产免费观看| 美女999久久久精品视频| 亚洲高清毛片| 国产精品美女久久| 国产午夜精品久久久| 欧美日韩aaaaa| 亚洲免费av观看| 亚洲国产1区| 欧美日韩在线直播| 在线观看国产成人av片| 欧美日韩在线不卡| 国产综合在线看| 日韩一级免费| 亚洲视频福利| 久久久久国产一区二区三区| 欧美性猛交一区二区三区精品| 国产精品户外野外| 国产一区美女| 欧美区二区三区| 亚洲国产精品第一区二区| 国产精品日韩精品欧美精品| 亚洲在线观看免费视频| 樱桃成人精品视频在线播放| 夜夜嗨av一区二区三区网站四季av| 国产日韩在线看片| 亚洲国产精品一区制服丝袜| 美女91精品| 欧美日韩三级在线| 久久成人一区| 欧美性生交xxxxx久久久| 欧美区亚洲区| 久久精品免费电影| 国产亚洲视频在线| 永久91嫩草亚洲精品人人| 国产精品三级久久久久久电影| 欧美激情aⅴ一区二区三区| 国产精品久久久久7777婷婷| 麻豆91精品91久久久的内涵| 欧美国产第二页| 国产精品乱看| 国产精品一级久久久| 亚洲综合日韩在线| 黄色日韩精品| 亚洲高清中文字幕| 国产精品久久一区二区三区| 欧美日韩亚洲一区二区| 亚洲精品在线视频| 国产精品久久久一区麻豆最新章节| 亚洲激情六月丁香| 久久久久久久波多野高潮日日| 久久久久久一区二区三区| 国产女主播一区| 国产精品jvid在线观看蜜臀| 亚洲欧美国产另类| 欧美成人伊人久久综合网| 国产香蕉久久精品综合网| 91久久精品一区二区别| 欧美黄色影院| 亚洲欧美日韩在线| 亚洲一区二区三区高清| 亚洲精品欧美日韩专区| 久久手机精品视频| 牛牛国产精品| 性欧美精品高清| 午夜精品免费在线| 亚洲系列中文字幕| 国产日韩欧美综合| 亚洲欧美精品| 在线观看视频亚洲| 欧美a级一区| 欧美日韩中文在线观看| 欧美日韩亚洲视频一区| 精品电影一区| 一区二区三区免费在线观看| a91a精品视频在线观看| 精品成人一区二区三区| 久久久高清一区二区三区| 亚洲精选大片| 国产精品亚洲а∨天堂免在线| 国产亚洲精久久久久久| 久久免费的精品国产v∧| 亚洲小少妇裸体bbw| 亚洲免费观看视频| 欧美日韩美女一区二区| 久久一区二区三区四区五区| 欧美一区影院| 欧美午夜在线| 日韩视频在线一区| 黄色一区二区三区| 狠狠色2019综合网| 欧美精品在线一区二区| 久久精品久久99精品久久| 亚洲欧美日韩一区二区在线| 国产精品日本精品| 国产亚洲视频在线| 国产精品少妇自拍| 亚洲一区精品在线| 欧美黄色大片网站| 亚洲国产综合在线看不卡| 欧美黄网免费在线观看| 国产乱肥老妇国产一区二| 国产欧美在线视频| 久久亚洲高清| 欧美日韩亚洲一区| 久久久999成人| 狠狠狠色丁香婷婷综合激情| 欧美一区深夜视频| 一本大道av伊人久久综合| 欧美va亚洲va国产综合| 国产精品一级| 欧美视频三区在线播放| 久久精品国产99精品国产亚洲性色| 亚洲理论在线| 国产女人aaa级久久久级| 一区二区视频在线观看| 精品二区视频| 亚洲一区二区网站| 国产精品大片免费观看| 欧美日韩综合一区| 国产精品美女主播| 国产欧美一区二区精品仙草咪| 99精品国产一区二区青青牛奶| 男人天堂欧美日韩| 亚洲欧洲一区二区在线观看| 国产精品一区二区在线观看| 国产精品毛片一区二区三区| 日韩午夜电影| 一区二区三区国产| 久久久999精品免费| 国产精品劲爆视频| 亚洲黄色高清| 亚洲视频一区二区| 午夜精品视频| 国精品一区二区| 欧美伦理91| 国产一区二区激情| 国产精品一卡二| 久久久亚洲精品一区二区三区| 亚洲精品一区在线观看| 亚洲精选国产| 久久综合久久综合这里只有精品| 国产精品一区二区黑丝| 国产精品一区久久久久| 国产视频一区欧美| 国模 一区 二区 三区| 欧美日韩直播| 免费短视频成人日韩| 亚洲婷婷综合色高清在线| 亚洲综合国产精品| 欧美欧美天天天天操| 久久久久一区二区| 欧美日韩免费视频| 国产精品色午夜在线观看| 欧美日韩在线综合| 久久精品综合| 亚洲五月六月| 欧美国产精品专区| 亚洲一区二区3| 国产亚洲电影| 欧美国产日韩一区二区三区| 六月丁香综合|