基於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 微服務框架,幫助我們輕鬆構建和管理微服務應用。 本框架不僅支持 Consul 服務註 ...
  • 先看一下效果吧: 如果不會寫動畫或者懶得寫動畫,就直接交給Blend來做吧; 其實Blend操作起來很簡單,有點類似於在操作PS,我們只需要設置關鍵幀,滑鼠點來點去就可以了,Blend會自動幫我們生成我們想要的動畫效果. 第一步:要創建一個空的WPF項目 第二步:右鍵我們的項目,在最下方有一個,在B ...
  • Prism:框架介紹與安裝 什麼是Prism? Prism是一個用於在 WPF、Xamarin Form、Uno 平臺和 WinUI 中構建鬆散耦合、可維護和可測試的 XAML 應用程式框架 Github https://github.com/PrismLibrary/Prism NuGet htt ...
  • 在WPF中,屏幕上的所有內容,都是通過畫筆(Brush)畫上去的。如按鈕的背景色,邊框,文本框的前景和形狀填充。藉助畫筆,可以繪製頁面上的所有UI對象。不同畫筆具有不同類型的輸出( 如:某些畫筆使用純色繪製區域,其他畫筆使用漸變、圖案、圖像或繪圖)。 ...
  • 前言 嗨,大家好!推薦一個基於 .NET 8 的高併發微服務電商系統,涵蓋了商品、訂單、會員、服務、財務等50多種實用功能。 項目不僅使用了 .NET 8 的最新特性,還集成了AutoFac、DotLiquid、HangFire、Nlog、Jwt、LayUIAdmin、SqlSugar、MySQL、 ...
  • 本文主要介紹攝像頭(相機)如何採集數據,用於類似攝像頭本地顯示軟體,以及流媒體數據傳輸場景如傳屏、視訊會議等。 攝像頭採集有多種方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),網上一些文章以及 ...
  • 前言 Seal-Report 是一款.NET 開源報表工具,擁有 1.4K Star。它提供了一個完整的框架,使用 C# 編寫,最新的版本採用的是 .NET 8.0 。 它能夠高效地從各種資料庫或 NoSQL 數據源生成日常報表,並支持執行複雜的報表任務。 其簡單易用的安裝過程和直觀的設計界面,我們 ...
  • 背景需求: 系統需要對接到XXX官方的API,但因此官方對接以及管理都十分嚴格。而本人部門的系統中包含諸多子系統,系統間為了穩定,程式間多數固定Token+特殊驗證進行調用,且後期還要提供給其他兄弟部門系統共同調用。 原則上:每套系統都必須單獨接入到官方,但官方的接入複雜,還要官方指定機構認證的證書 ...
  • 本文介紹下電腦設備關機的情況下如何通過網路喚醒設備,之前電源S狀態 電腦Power電源狀態- 唐宋元明清2188 - 博客園 (cnblogs.com) 有介紹過遠程喚醒設備,後面這倆天瞭解多了點所以單獨加個隨筆 設備關機的情況下,使用網路喚醒的前提條件: 1. 被喚醒設備需要支持這WakeOnL ...
  • 前言 大家好,推薦一個.NET 8.0 為核心,結合前端 Vue 框架,實現了前後端完全分離的設計理念。它不僅提供了強大的基礎功能支持,如許可權管理、代碼生成器等,還通過採用主流技術和最佳實踐,顯著降低了開發難度,加快了項目交付速度。 如果你需要一個高效的開發解決方案,本框架能幫助大家輕鬆應對挑戰,實 ...