基於FPGA 的SDRAM控制器

来源:https://www.cnblogs.com/13tree/archive/2023/09/23/17724514.html
-Advertisement-
Play Games

SDRAM基本信息 儲存能力計算 4X16X4=256(Mbit),註意不是MByte SDRAM控制 sdram包含兩個部分:sdram_ctrl、fifo_ctrl。 sdram_ctrl:其頂層為SDRAM的控制模塊內部實例化了5個模塊,有初始化、自刷新、寫和讀模塊,還有一個仲裁模塊對這四個不 ...


SDRAM基本信息

儲存能力計算

  • 4X16X4=256(Mbit),註意不是MByte

SDRAM控制

sdram包含兩個部分:sdram_ctrl、fifo_ctrl。

  • sdram_ctrl:其頂層為SDRAM的控制模塊內部實例化了5個模塊,有初始化、自刷新、寫和讀模塊,還有一個仲裁模塊對這四個不同操作進行分配;
  • fifo_ctrl:其頂層為SDRAM的數據輸入輸出,內部實例化了兩個用於連接SDRAM輸入和輸出端的FIFO,以及控製程序

sdram_ctrl模塊內部例化了四個模塊

初始化模塊sdram_init

  • SDRAM在上電後首先需要執行初始化操作,才可執行其他操作。

  • 配置寄存器模式

  • 潛伏期為三個周期

  • 突髮長度為頁突發

  • 突發類型為順序類型

  • 寫模式為頁突發寫模式

  • 信號操作:

    1. 正常載入時鐘信號:設置CKE時鐘使能為高電平CKE = 1
    2. 等待Vdd和CLK信號穩定:等待T= 200us
    3. 進行預充電操作,對所有L-Bank進行預充電:cmd = PRECHARGE,A10 = 1
    4. 等待預充電操作:cmd = NOP,TRP =20ns
    5. 自動刷新命令:cmd = AUTO REFRESH
    6. 等待自動刷新:cmd = NOP,TRFC = 70ns
    7. 重覆多次自動刷新操作:重覆8次
    8. 配置模式寄存器:cmd = LOAD MODE REGISTER,address= ,A10 = ,bank = 0
    9. 等待配置模式寄存器完成,TMRD = 30ns
  • 總體採用狀態機來設計,分為以下幾個狀態:

    1. 初始化
    2. 預充電
    3. 預充電等待
    4. 自動刷新
    5. 自動刷新等待
    6. 配置模式寄存器
    7. 配置模式寄存器等待
    8. 初始化完成
  • 為了防止亞穩態的產生,狀態機編碼均使用格雷碼

  • 跳轉條件使用計數器進行計數完成判斷

    • cnt_clk,等待狀態的計數器
    • cnt_clk_rst,負責等待計數器的清零操作
  • 另外為了跳轉操作代碼簡潔,聲明組合邏輯的信號完成各個狀態的跳轉

    • trp_end
    • trc_end
    • tmrd_end
  • 由於自動刷新信號需要重覆進行,因此使用計數器完成自動刷新操作計數

    • cnt_init_aref,計數自動刷新操作的重覆個數
  • 最終按照各個狀態完成輸出信號的幅值,註意使用的為時序邏輯,因此輸出相比狀態跳轉延遲一拍

自動刷新模塊sdram_a_ref

  • SDRAM刷新有兩種操作方式:
    • 自刷新:用於休眠模式可以低功耗的保存數據
      • 操作:CKR信號為低電平時,寫入刷新指令,進入自刷新模式,當CKE信號拉高時,退出自刷新模式;
    • 自動刷新模式:由於SDRAM動態特性,使用電容來保存數據,因此需要不斷對電容進行充放電,以此保證數據不丟失。本文主要討論自動刷新。
  • 自動刷新操作需要不斷的迴圈操作,是一個周期操作,至少需要每64ms完成一次。
  • 自動刷新時間計算
    • 存儲體中電容的數據有效保存期上限是 64ms那麼使用的SDRAM的地址位寬為13位,共有2^13=8192行。
    • 那麼每行刷新的時間為:64ms/8192=64*1000000ns/8192=7812.5ns。
    • SDRAM的時鐘為100MHz,周期為10ns,那麼計數器最大值為:7812.5/10=781.25個。
    • 但是由於自動刷新操作和寫讀請求會產生衝突,會出現不會立即刷新的情況,因此需要保留一段時間,那麼設置計數器最大值為750個,要求在7500ns中完成其中一行的刷新。
  • 信號操作
    1. 預充電操作:cmd = PRECHARGE、A10 = 1、bank = 2'b11
    2. 預充電等待:cmd = NOP,TRP = 20ns
    3. 自動刷新:cmd = PRECHARGE
    4. 自動刷新等待:cmd = NOP,TRFC = 70ns
    5. 自動刷新重覆兩次
  • 初始化模塊為所有信號的首位,因此需要初始化信號拉高後在開始執行
    • init_end = 1時,模塊開始正常工作
  • 由於是一個周期信號,那麼需要一個計數器進行周期計數,並以此信號完成狀態機的啟動。
    • cnt_ref作為計數器,最大值經計算為750-1,並且達到最大值後清零繼續計數
  • 其餘信號需要在狀態機跳轉下進行操作:
    1. 初始
    2. 預充電
    3. 預充電等待
    4. 自動刷新
    5. 自動刷新等待
    6. 自動刷新結束
  • 另外自動刷新需要和仲裁模塊進行握手,當仲裁模塊同意進行刷新操作時,才可進行該操作
    • 當內部計數器cnt_ref達到最大值時,此時需要自動刷新,拉高自動刷洗請求信號aref_req = 1,仲裁模塊接受該信號,進行判斷若同意則拉高自動刷新使能信號,aref_en = 1。
    • 當自動刷新完成,拉高自動刷新結束信號,aref_end= 1,仲裁模塊接受該信號,拉低自動刷新使能信號,aref_en = 0;

寫操作模塊sdram_write

  • 本模塊使用的寫操作模式為:不自動進行預充電的頁突發寫模式
  • 信號操作
    1. 激活L-Bank特定行:
      1. cmd = ACTIVE
      2. address = 特定寫入行地址
      3. bank = 特定寫入bank地址
    2. 等待激活
      1. cmd = NOP
    3. 寫數據命令
      1. cmd = WRITE
      2. address = 特定寫入列地址
      3. DQ = 寫入第一個數據
    4. 寫入數據中
      1. cmd = NOP
      2. DQ = 開始寫入第二個數據,每隔一個周期寫入一個數據
    5. 突發終止命令
      1. cmd = BURST TERM
      2. DQ = 不寫入數據
    6. 預充電命令
      1. cmd = PRECHARGE
      2. A10 = 1
      3. bank = 2'b11
    7. 預充電等待
      1. cmd = NOP
      2. TRP = 20ns
  • 當初始化模塊完成初始化後才可以SDRAM才可以正常操作
    • init_end = 1,此時寫模塊才可以正常開始工作
  • sdram模塊的寫操作是由SDRAM上端的fifo模塊發起請求,經過sdram仲裁器同意後開始執行寫操作的
    • SDRAM仲裁器判斷可以寫入時拉高,wr_en = 1
  • 當寫數據操作執行完畢後狀態機跳轉至寫結束狀態時,通過組合邏輯賦值將寫結束信號拉高
    • wr_end = 1
  • 另外當FIFO請求向SDRAM寫入數據時,SDRAM並不能直接開始寫入,因此當真正開始寫入數據時需要一個提前一拍的響應信號告知fifo可以輸出數據
    • wr_ack = 1
    • 相比於寫數據的同步信號需要提前一拍,作為FIFO的讀出數據的讀請求信號
  • 其餘信號在狀態機下完成
    1. 初始狀態
    2. 激活命令
    3. 激活等待
    4. 寫命令
    5. 寫等待
    6. 預充電
    7. 預充電等待
    8. 寫結束
  • 寫入數據的信息由外部信號傳入,具體為輸入端的FIFO傳入
    • [23:0] wr_addr:寫入數據的地址,可以分割為:2bit bank地址、13bit 行地址、9bit 列地址
    • [15:0] wr_data,寫入數據
    • [9:0] wr_burst_len,寫入數據個數
  • 除了常規控制信號輸出外還有一個,控制SDRAM數據匯流排輸出使能信號,該信號和真正寫入sdram的數據同步。

讀操作模塊 sdram_read

  • SDRAM數據讀方式為:不帶自動預充電的頁突發讀模式
  • 信號操作
    1. 激活L-Bank的特定行
      1. cmd = ACTIVe
      2. address = Row
      3. bank = 2‘b11
    2. 等待激活
      1. CMD = NOP
      2. TRCD =
    3. 讀命令
      1. CMD = READ
      2. address = column
    4. 讀出數據
      1. cmd = NOP
      2. 潛伏期設置為3,因此在寫入讀命令後的間隔3個周期,會有讀數據的輸出
    5. 突發終止
      1. cmd = BURST TERM
  • 讀數據操作需要在初始化操作完成後進行
    • 當init_end = 1 時,sdram_read進入正常工作模式
  • sdram讀數據操作是由外部信號發起的,具體而言是SDRAM下端FIFO發出的讀請求信號,並且該信號需要經過仲裁器判斷後生效,仲裁器拉高讀使能信號
    • rd_en = 1,讀模塊開始進行讀操作
  • 當sdram_read讀操作完成後,狀態機進入結束狀態,使用組合邏輯同步拉高讀結束信號
    • rd_end = 1
  • 由於數據需要存入下端FIFO模塊因此需要輸出一個讀模塊工作響應信號,並且需要與數據同步,作為FIFO輸入的寫請求信號
    • rd_ack = 1,需要和輸出數據同步
  • 其餘信號在狀態機下完成
    1. 空閑狀態
    2. 激活
    3. 激活等待
    4. 讀命令
    5. 潛伏期
    6. 讀數據
    7. 預充電
    8. 預充電等待
    9. 讀結束
  • 並且為了儘可能的滿足建立時間,SDRAM真正的驅動信號相比SDRAM的控制信號有-75°的相移,因此為了將SDRAM的輸入數據納入本時鐘域,需要對SDRAM的輸出數據進行打拍操作,因此看起來並不會有一拍的延遲,因為SDRAM的輸出本身就是提前了一些。
    • 75°相移更多的是時序上的考量,本質上是犧牲了保持時間換取建立時間的冗餘
  • 最終SDRAM讀出的數據和其同步信號輸出至下端的FIFO
    • rd_sdram_data
    • rd_ack

仲裁模塊 sdram_arbit

  • SDRAM共有四種操作模式,且有著明確的執行 優先順序要求,其中初始化最高,次之自動刷新,最後是寫讀操作。在實際使用中不免會遇到多個模塊同時需要執行或者當前執行過程中有新的請求需要執行這兩種情況,此時就需要仲裁器來保證SDRAM收到的請求正常被執行。
  • 同時優先順序的判斷在狀態跳轉條件處體現,以及在各個操作模塊的使能信號判斷條件處體現

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、案例:猜數字 設置一個1-10之間的隨機數,然後輸入進行猜數字,猜的大了怎麼樣、猜的小了怎麼樣、猜對了怎麼樣 知識點:設置隨機數 、if判斷 、while迴圈 寫題思路: 1.設置彈框提出問題 2.定義一個隨機數0-10的數組 3.if 判斷 取值的範圍,在其範圍內反饋的結果 4.while迴圈 ...
  • 搭建後臺管理系統模板 2.1項目初始化 今天來帶大家從0開始搭建一個vue3版本的後臺管理系統。一個項目要有統一的規範,需要使用eslint+stylelint+prettier來對我們的代碼質量做檢測和修複,需要使用husky來做commit攔截,需要使用commitlint來統一提交規範,需要使 ...
  • Uber公司技術棧介紹 Uber(Uber Technologies,Inc.)中文譯作“優步”,是一家美國矽谷的科技公司。Uber在2009年,由加利福尼亞大學洛杉磯分校輟學生特拉維斯·卡蘭尼克和好友加勒特·坎普(Garrett Camp)創立。因旗下同名打車APP而名聲大噪。Uber已經進入中國 ...
  • 1. 定義通用返回結果類 ​ 定義ResultVO類,作返回給前端的對象結構,主要有4個欄位 code : 錯誤碼 data : 內容 message : 消息 description : 具體描述 import lombok.Data; import java.io.Serializable; / ...
  • 接上篇,當我們創建了很多類,比如 圖書館里的藏書,分社會科學類,藝術類、生活類、農業類、工業類等,而工業類又分為輕工業、重工業、信息工業,然後再細分。當分的越來越細時,程式就會越來越大。如何管理,便成了程式開發過程中一個重要的環節。於是可以按照圖書館分類管理的思想,對程式代碼進行管理。 將一個應用程 ...
  • Ribbon 簡介 Ribbon 是 Netfix 客戶端的負載均衡器,可對 HTTP 和 TCP 客戶端的行為進行控制。為 Ribbon 配置服務提供者地址後,Ribbon 就可以基於某種負載均衡演算法自動幫助服務消費者去請求。Ribbon 預設提供了很多負載均衡演算法,例如輪詢、隨機等,也可以為 R ...
  • 編譯nw-node版本的插件 下載nwjs對應版本的nodejs 原始源碼目錄 yh@yh:~/addon$ tree . ├── addon.cc ├── binding.gyp ├── CppLib │ ├── mynumber.cpp │ └── mynumber.h ├── myobject ...
  • 歡迎訪問我的GitHub 這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos 本篇概覽 欣宸正在為接下新的Java雲原生實戰系列原創做準備,既然是實戰,少不了一套雲原生環境,以下內容是必不可少的: linux操作系統 kuberne ...
一周排行
    -Advertisement-
    Play Games
  • 一個自定義WPF窗體的解決方案,借鑒了呂毅老師的WPF製作高性能的透明背景的異形視窗一文,併在此基礎上增加了滑鼠穿透的功能。可以使得透明窗體的滑鼠事件穿透到下層,在下層窗體中響應。 ...
  • 在C#中使用RabbitMQ做個簡單的發送郵件小項目 前言 好久沒有做項目了,這次做一個發送郵件的小項目。發郵件是一個比較耗時的操作,之前在我的個人博客裡面回覆評論和友鏈申請是會通過發送郵件來通知對方的,不過當時只是簡單的進行了非同步操作。 那麼這次來使用RabbitMQ去統一發送郵件,我的想法是通過 ...
  • 當你使用Edge等瀏覽器或系統軟體播放媒體時,Windows控制中心就會出現相應的媒體信息以及控制播放的功能,如圖。 SMTC (SystemMediaTransportControls) 是一個Windows App SDK (舊為UWP) 中提供的一個API,用於與系統媒體交互。接入SMTC的好 ...
  • 最近在微軟商店,官方上架了新款Win11風格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,這款應用引入了前沿的Fluent Design UI設計,為用戶帶來全新的視覺體驗。 ...
  • 1.簡單使用實例 1.1 添加log4net.dll的引用。 在NuGet程式包中搜索log4net並添加,此次我所用版本為2.0.17。如下圖: 1.2 添加配置文件 右鍵項目,添加新建項,搜索選擇應用程式配置文件,命名為log4net.config,步驟如下圖: 1.2.1 log4net.co ...
  • 之前也分享過 Swashbuckle.AspNetCore 的使用,不過版本比較老了,本次演示用的示例版本為 .net core 8.0,從安裝使用開始,到根據命名空間分組顯示,十分的有用 ...
  • 在 Visual Studio 中,至少可以創建三種不同類型的類庫: 類庫(.NET Framework) 類庫(.NET 標準) 類庫 (.NET Core) 雖然第一種是我們多年來一直在使用的,但一直感到困惑的一個主要問題是何時使用 .NET Standard 和 .NET Core 類庫類型。 ...
  • WPF的按鈕提供了Template模板,可以通過修改Template模板中的內容對按鈕的樣式進行自定義。結合資源字典,可以將自定義資源在xaml視窗、自定義控制項或者整個App當中調用 ...
  • 實現了一個支持長短按得按鈕組件,單擊可以觸發Click事件,長按可以觸發LongPressed事件,長按鬆開時觸發LongClick事件。還可以和自定義外觀相結合,實現自定義的按鈕外形。 ...
  • 一、WTM是什麼 WalkingTec.Mvvm框架(簡稱WTM)最早開發與2013年,基於Asp.net MVC3 和 最早的Entity Framework, 當初主要是為瞭解決公司內部開發效率低,代碼風格不統一的問題。2017年9月,將代碼移植到了.Net Core上,併進行了深度優化和重構, ...