a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > FPGA:SDRAM控制器

FPGA:SDRAM控制器

作者: 時間:2024-01-11 來源:EEPW編譯 收藏

盡管現代 包含內部存儲器,但可用存儲器量始終比專用存儲芯片低幾個數量級。 因此,許多設計人員將某種類型的存儲器附加到他們的中也就不足為奇了。 特別是,SDRAM因其高速和低成本而成為非常受歡迎的存儲器。 不幸的是,它們不像靜態存儲器那樣容易控制,因此經常使用

本文引用地址:http://www.j9360.com/article/202401/454693.htm

對于我們的控制器,我們的目標是可能是最簡單的SDRAM:美光MT48LC1M16A1 16Mb傳統SDRAM。 我們的測試系統包括 Xylo-E、Xylo-EM 和 Xylo-LM(具有 16Mb 至 256Mb SDRAM 的 Xilinx 或 Altera FPGA)。

我們將主題分為三個部分。 首先介紹用于 FPGA 的存儲器。 然后,我們將展示如何制作一個16Mb 。 最后,介紹了先進的DDR SDRAM。

SDRAM 1 - 從靜態到動態

靜態記憶

假設我們想將一個 16Mb 的存儲器連接到 FPGA。

16Mb 表示內存可容納 16 萬位(準確地說是 16,777,216 位)。 現在,這些位很少單獨尋址,而是通常以 8 或 16 個數據包的形式進行尋址(我們稱之為單詞)。 因此,如果我們的 16Mb 內存被組織成 1M 字的 16 位,我們需要一個 20 位地址總線和一個 16 位數據總線,以及一些寫使能和讀使能信號。

真正的存儲器也會有一個CS(芯片選擇),如果存儲器是同步的,則有一個時鐘(為了清楚起見,圖片中省略了這些時鐘)。

現在,如果這個存儲器是一個模塊(在FPGA內部),它看起來會有所不同(假設存在如此大的16Mb模塊......典型的塊狀結構要小得多)。

正如你所看到的,它仍然是一個內存塊,但有兩個地址總線。 這是因為現代 FPGA 中的模塊是雙端口的......這意味著兩個代理可以同時訪問內存。 通常,一個代理寫入內存,而另一個代理讀取。 因此,內存為每個代理提供獨立的地址和數據總線。 上圖顯示了頂部的第一個(寫入)代理和底部的第二個(讀取)代理。 更高級的 blockram 允許每個代理同時讀取和寫入,但上面顯示的架構是最常用的。 此外,blockram 通常是同步使用的,因此每個代理都必須提供一個時鐘(圖片中未顯示)。

到目前為止顯示的記憶是靜態的,這意味著它們只需通過施加力量來保存其內容。 靜態存儲器可以看作是一長串單詞(您只需提供一個地址并訪問匹配的數據......無并發癥)。 權衡是,每比特的成本遠高于...

動態記憶

我們將使用SDRAM,它是一個動態內存(SDRAM中的“D”)。 在動態記憶中,記憶不被視為單詞的長線性數組,而是組織為單詞矩陣(行/列)。

上圖顯示行 12 位,列 8 位,和以前一樣總共 20 個地址位......容易。

有一個復雜因素:為了提高性能,內存被分成相等的塊,稱為“bank”。 這是因為某些動態內存操作速度很慢,因此擁有 bank 允許在等待另一個 bank 的同時使用一個 bank。

因此,如果我們的 16Mb SDRAM 有 2 個存儲區,則每個存儲區擁有 8Mb。

當訪問SDRAM時,FPGA必須選擇bank(1位)、行(現在只有11位)和列(8位),總共20位。 但這是一個兩步過程:首先是行+庫,然后是列:

  • FPGA 選擇一個 bank 并激活其中一行。然后它等待幾個時鐘(等待行準備就緒)。

  • 現在,該行處于活動狀態,FPGA只需提供列地址即可訪問(讀取和/或寫入)行中所需的任何數據。

  • 一旦FPGA完成了對該行的處理,它必須在打開新行之前關閉該行。

為了獲得最佳性能,用戶(=FPGA)希望避免過多地打開和關閉行,而是在關閉行之前盡可能多地連續做工作,并在不同的bank中交錯操作,這樣就不會浪費時鐘周期。 大多數 SDRAM 實際上有 4 或 8 個 bank,每個 bank 都是獨立的,因此可以有自己的活動行。

SDRAM 引腳

如果我們看一下SDRAM的引腳,就會發現有一些新來者。

地址和數據總線仍然存在,但地址總線只有 11 位(它用于提供要打開的行,然后是列地址)。 BA 引腳指定 bank(由于我們的示例中只有 2 個 bank,因此我們只需要一個引腳)。 WE、CAS 和 RAS 一起用作命令引腳,因此我們可以向 SDRAM 發送 8 個不同的命令(命令包括“打開行”、“讀取”、“寫入”和“關閉行”)。 還使用了其他一些引腳(但未在圖片中顯示),例如時鐘、芯片選擇、字節使能......

請注意,在動態內存術語中,“打開行”稱為激活,“關閉行”稱為預充電。

刷新

SDRAM 是動態存儲器:它們的內容需要定期刷新,因為每個存儲器位值(0 或 1)都保存在一個微小的電容器中,其電荷會隨著時間的推移而衰減。 但衰減率足夠低,只要定期讀取和重寫(“刷新”),制造商保證不會丟失任何數據。

有兩種刷新機制可用。

  • FPGA向SDRAM發送“auto-refresh”命令。
    只需確保定期完成(SDRAM數據表會告訴您最小刷新頻率)。

  • FPGA“足夠頻繁”地訪問每一行。
    打開一行會導致SDRAM中的“檢測放大器”獲得該行所有電容電荷的副本。 然后,當行關閉時,先前檢測到的值被復制回電容器中,從而刷新過程中的數據。

為什么選擇內存控制器?

動態記憶比靜態記憶更復雜......我們有行、列、庫和刷新周期需要處理。 但SDRAM因其高速和低每比特成本而引人注目。

因此,我們需要的是一種訪問 SDRAM 的方法,但要易于使用靜態內存。 這就是創建內存控制器的原因。 它們充當轉換層:一方面,它們為用戶提供易于使用的存儲器接口,然后執行繁瑣的工作來驅動真正的SDRAM信號。

SDRAM 2 - 一個簡單的控制器

我們的具有以下特點:

  • 易于使用:使SDRAM看起來像一個靜態存儲器(或盡可能接近)。

  • 快速:如果提供連續地址,則在突發模式下使用 SDRAM。

  • 簡單:沒有調度,一次只有一家銀行處于活動狀態。

  • 功能強大:SDRAM 表現為簡單的雙端口存儲器(即具有一個寫入代理和一個讀取代理)。

控制器最不常見的功能可能是最后一個功能。 SDRAM 是單端口存儲器,但 FPGA 從訪問雙端口存儲器(如塊式存儲器)中受益匪淺,因此我們認為這是一個不錯的功能。

控制器信號

以下是SDRAM控制器的簡單視圖。

左邊的前三個信號由寫入代理使用(“寫入請求”,然后是“寫入地址”和“寫入數據”)。 然后是閱讀代理的三個信號。 在右側,控制器驅動SDRAM信號。 為了正確看待問題,這里是使用我們的SDRAM控制器的典型FPGA系統的視圖。

現在,我們的控制器使SDRAM顯示為雙端口存儲器。 但是SDRAM實際上是一個單端口存儲器,所以我們的控制器必須玩一個技巧。 如果我們的控制器同時收到兩個請求,它要么必須停止一個代理,要么記錄他們的請求并在以后執行它們。 我們的控制器選擇了第一種策略。 因此,我們添加了“授予”信號:代理可以隨時斷言請求,但控制器有權授予或不授予請求。 如果請求被拒絕,請繼續詢問,它最終會被批準。

SDRAM 的最后一個復雜因素是,從讀取請求返回的數據會延遲(在 SDRAM 數據表中稱為 CAS 延遲)。 控制器還可能增加一些延遲時鐘。 因此,即使控制器可能會立即授予讀取請求,匹配的數據也只能在固定數量的時鐘后可用。 為方便起見,我們添加了一個“數據有效”信號,該信號在數據真正可用時被斷言。

狀態機

我們的SDRAM控制器的核心是狀態機。 控制器等待請求(讀取或寫入),打開匹配的庫/行,發出讀取或寫入命令(只要活動代理在活動行中請求這些命令),最后關閉該行。

使用此方案,一次只有一家銀行處于活動狀態。 先進的SDRAM控制器將允許多個bank同時處于活動狀態,但我們決定保持簡單。

現在,打開和關閉行需要時間。 例如,我們的SDRAM數據表提供了以下數字:

  • tRCD = 20ns(激活讀/寫)

  • tRP = 21ns(預充電至激活狀態)

因此,如果我們以 100MHz 的頻率運行 SDRAM,時鐘周期為 10ns,我們需要在狀態機中添加一些空時鐘周期(稱為 NOP)。
此外,如果讀取代理無法保證定期打開每一行,則需要刷新周期。

狀態機現在看起來有點復雜。

最后,可能需要調整 NOP 循環次數。 例如,在 100MHz 且 tRP = 21ns 時,我們實際上需要在預充電后進行兩個 NOP 周期(在下一次激活之前給我們 30ns)。

初始化

SDRAM具有一些可編程設置(如CAS延遲),因此需要在上電后初始化“MODE”寄存器。 為此,使用“load mode”命令。 SDRAM 初始化可以添加到控制器中,也可以在控制器運行之前添加到單獨的步驟中。

代碼

我們控制器的核心如下所示。
為了獲得最佳的IO時序,所有SDRAM控制信號都經過注冊,這樣就不會有組合邏輯信號進入FPGA之外。

always @(posedge clk)  // state machinecase(state)
    2'h0: begin
    	if(RdReq | WrReq) begin  // is there a read or write request?
    		SDRAM_CMD <= SDRAM_CMD_ACTIVE;  // if so, open
    		SDRAM_BA <= Addr[19];  // this bank
    		SDRAM_A <= Addr[18:8];  // this row
    		SDRAM_DQM <= 2'b11;
    		state <= 2'h1;    	end
    	else
    	begin
    		SDRAM_CMD <= SDRAM_CMD_NOP;  // otherwise stay idle
    		SDRAM_BA <= 0;
    		SDRAM_A <= 0;
    		SDRAM_DQM <= 2'b11;
    		state <= 2'h0;    	end
    end
    2'h1: begin
    	SDRAM_CMD <= ReadSelected ? SDRAM_CMD_READ : SDRAM_CMD_WRITE;
    	SDRAM_BA <= AddrR[19];
    	SDRAM_A[9:0] <= {2'b00, AddrR[7:0]};  // column
    	SDRAM_A[10] <= 1'b0;  // no auto-precharge
    	SDRAM_DQM <= 2'b00;
    	state <= MoreRequestsInSameBankAndRow ? 2'h1 : 2'h2;    end
    2'h2: begin
    	SDRAM_CMD <= SDRAM_CMD_PRECHARGE;  // close the row when we're done with it
    	SDRAM_BA <= 0;
    	SDRAM_A <= 11'b100_0000_0000;  // all banks precharge
    	SDRAM_DQM <= 2'b11;
    	state <= 2'h0;    endendcase

完整的演示代碼可在此處獲得。 它是功能性的,但由于這是教育性的,我們通過刪除非必要功能來使其盡可能簡單。 檢查代碼中的注釋,了解限制和要求。

使用示例

SDRAM 通常用于視頻卡,因為存儲圖形需要大量內存。 它的工作原理是這樣的:計算機的 CPU 將圖形數據發送到視頻卡。 該卡使用SDRAM來存儲數據,卡中的控制器定期讀取存儲器以將數據發送到顯示器。 在此過程中,數據(在 SDRAM 中)會自動刷新。

作為驗證過程的一部分,我們使用 Xylo-EM 板創建了這樣的基本系統。 SDRAM 控制器是雙端口的,這使得設計變得簡單明了(PC/FX2 是寫入代理,視頻控制器是讀取代理)。

SDRAM 3 - DDR

隨著內存制造商試圖找到提高 SDRAM 速度的方法,DDR SDRAM 應運而生。 DDR 代表“雙倍數據速率”。

DDR SDRAM 的大腦類似于常規(單數據速率)SDRAM(我們仍然有 bank 和行要打開)。 DDR SDRAM 的支路要快得多,具有更快的時鐘速度、更長的突發周期,并且每個時鐘周期發送的每條數據線有兩個位(因此得名 DDR)。 這導致數據線上的時序非常緊張,并添加了一些功能來幫助可靠地傳輸數據。



關鍵詞: FPGA SDRAM控制器

評論


相關推薦

技術專區

關閉