基於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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...