FPGA:SDRAM控制器
盡管現代 FPGA 包含內部存儲器,但可用存儲器量始終比專(zhuān)用存儲芯片低幾個(gè)數量級。 因此,許多FPGA設計人員將某種類(lèi)型的存儲器附加到他們的FPGA中也就不足為奇了。 特別是,SDRAM因其高速和低成本而成為非常受歡迎的存儲器。 不幸的是,它們不像靜態(tài)存儲器那樣容易控制,因此經(jīng)常使用SDRAM控制器。
本文引用地址:http://dyxdggzs.com/article/202401/454693.htm對于我們的控制器,我們的目標是可能是最簡(jiǎn)單的SDRAM:美光MT48LC1M16A1 16Mb傳統SDRAM。 我們的測試系統包括 Xylo-E、Xylo-EM 和 Xylo-LM(具有 16Mb 至 256Mb SDRAM 的 Xilinx 或 Altera FPGA)。
我們將主題分為三個(gè)部分。 首先介紹用于 FPGA 的存儲器。 然后,我們將展示如何制作一個(gè)16Mb SDRAM控制器。 最后,介紹了先進(jìn)的DDR SDRAM。
SDRAM 1 - 從靜態(tài)到動(dòng)態(tài)
靜態(tài)記憶
假設我們想將一個(gè) 16Mb 的存儲器連接到 FPGA。
16Mb 表示內存可容納 16 萬(wàn)位(準確地說(shuō)是 16,777,216 位)。 現在,這些位很少單獨尋址,而是通常以 8 或 16 個(gè)數據包的形式進(jìn)行尋址(我們稱(chēng)之為單詞)。 因此,如果我們的 16Mb 內存被組織成 1M 字的 16 位,我們需要一個(gè) 20 位地址總線(xiàn)和一個(gè) 16 位數據總線(xiàn),以及一些寫(xiě)使能和讀使能信號。
真正的存儲器也會(huì )有一個(gè)CS(芯片選擇),如果存儲器是同步的,則有一個(gè)時(shí)鐘(為了清楚起見(jiàn),圖片中省略了這些時(shí)鐘)。
現在,如果這個(gè)存儲器是一個(gè)模塊(在FPGA內部),它看起來(lái)會(huì )有所不同(假設存在如此大的16Mb模塊......典型的塊狀結構要小得多)。
正如你所看到的,它仍然是一個(gè)內存塊,但有兩個(gè)地址總線(xiàn)。 這是因為現代 FPGA 中的模塊是雙端口的......這意味著(zhù)兩個(gè)代理可以同時(shí)訪(fǎng)問(wèn)內存。 通常,一個(gè)代理寫(xiě)入內存,而另一個(gè)代理讀取。 因此,內存為每個(gè)代理提供獨立的地址和數據總線(xiàn)。 上圖顯示了頂部的第一個(gè)(寫(xiě)入)代理和底部的第二個(gè)(讀?。┐?。 更高級的 blockram 允許每個(gè)代理同時(shí)讀取和寫(xiě)入,但上面顯示的架構是最常用的。 此外,blockram 通常是同步使用的,因此每個(gè)代理都必須提供一個(gè)時(shí)鐘(圖片中未顯示)。
到目前為止顯示的記憶是靜態(tài)的,這意味著(zhù)它們只需通過(guò)施加力量來(lái)保存其內容。 靜態(tài)存儲器可以看作是一長(cháng)串單詞(您只需提供一個(gè)地址并訪(fǎng)問(wèn)匹配的數據......無(wú)并發(fā)癥)。 權衡是,每比特的成本遠高于...
動(dòng)態(tài)記憶
我們將使用SDRAM,它是一個(gè)動(dòng)態(tài)內存(SDRAM中的“D”)。 在動(dòng)態(tài)記憶中,記憶不被視為單詞的長(cháng)線(xiàn)性數組,而是組織為單詞矩陣(行/列)。
上圖顯示行 12 位,列 8 位,和以前一樣總共 20 個(gè)地址位......容易。
有一個(gè)復雜因素:為了提高性能,內存被分成相等的塊,稱(chēng)為“bank”。 這是因為某些動(dòng)態(tài)內存操作速度很慢,因此擁有 bank 允許在等待另一個(gè) bank 的同時(shí)使用一個(gè) bank。
因此,如果我們的 16Mb SDRAM 有 2 個(gè)存儲區,則每個(gè)存儲區擁有 8Mb。
當訪(fǎng)問(wèn)SDRAM時(shí),FPGA必須選擇bank(1位)、行(現在只有11位)和列(8位),總共20位。 但這是一個(gè)兩步過(guò)程:首先是行+庫,然后是列:
FPGA 選擇一個(gè) bank 并激活其中一行。然后它等待幾個(gè)時(shí)鐘(等待行準備就緒)。
現在,該行處于活動(dòng)狀態(tài),FPGA只需提供列地址即可訪(fǎng)問(wèn)(讀取和/或寫(xiě)入)行中所需的任何數據。
一旦FPGA完成了對該行的處理,它必須在打開(kāi)新行之前關(guān)閉該行。
為了獲得最佳性能,用戶(hù)(=FPGA)希望避免過(guò)多地打開(kāi)和關(guān)閉行,而是在關(guān)閉行之前盡可能多地連續做工作,并在不同的bank中交錯操作,這樣就不會(huì )浪費時(shí)鐘周期。 大多數 SDRAM 實(shí)際上有 4 或 8 個(gè) bank,每個(gè) bank 都是獨立的,因此可以有自己的活動(dòng)行。
SDRAM 引腳
如果我們看一下SDRAM的引腳,就會(huì )發(fā)現有一些新來(lái)者。
地址和數據總線(xiàn)仍然存在,但地址總線(xiàn)只有 11 位(它用于提供要打開(kāi)的行,然后是列地址)。 BA 引腳指定 bank(由于我們的示例中只有 2 個(gè) bank,因此我們只需要一個(gè)引腳)。 WE、CAS 和 RAS 一起用作命令引腳,因此我們可以向 SDRAM 發(fā)送 8 個(gè)不同的命令(命令包括“打開(kāi)行”、“讀取”、“寫(xiě)入”和“關(guān)閉行”)。 還使用了其他一些引腳(但未在圖片中顯示),例如時(shí)鐘、芯片選擇、字節使能......
請注意,在動(dòng)態(tài)內存術(shù)語(yǔ)中,“打開(kāi)行”稱(chēng)為激活,“關(guān)閉行”稱(chēng)為預充電。
刷新
SDRAM 是動(dòng)態(tài)存儲器:它們的內容需要定期刷新,因為每個(gè)存儲器位值(0 或 1)都保存在一個(gè)微小的電容器中,其電荷會(huì )隨著(zhù)時(shí)間的推移而衰減。 但衰減率足夠低,只要定期讀取和重寫(xiě)(“刷新”),制造商保證不會(huì )丟失任何數據。
有兩種刷新機制可用。
FPGA向SDRAM發(fā)送“auto-refresh”命令。
只需確保定期完成(SDRAM數據表會(huì )告訴您最小刷新頻率)。FPGA“足夠頻繁”地訪(fǎng)問(wèn)每一行。
打開(kāi)一行會(huì )導致SDRAM中的“檢測放大器”獲得該行所有電容電荷的副本。 然后,當行關(guān)閉時(shí),先前檢測到的值被復制回電容器中,從而刷新過(guò)程中的數據。
為什么選擇內存控制器?
動(dòng)態(tài)記憶比靜態(tài)記憶更復雜......我們有行、列、庫和刷新周期需要處理。 但SDRAM因其高速和低每比特成本而引人注目。
因此,我們需要的是一種訪(fǎng)問(wèn) SDRAM 的方法,但要易于使用靜態(tài)內存。 這就是創(chuàng )建內存控制器的原因。 它們充當轉換層:一方面,它們?yōu)橛脩?hù)提供易于使用的存儲器接口,然后執行繁瑣的工作來(lái)驅動(dòng)真正的SDRAM信號。
SDRAM 2 - 一個(gè)簡(jiǎn)單的控制器
我們的SDRAM控制器具有以下特點(diǎn):
易于使用:使SDRAM看起來(lái)像一個(gè)靜態(tài)存儲器(或盡可能接近)。
快速:如果提供連續地址,則在突發(fā)模式下使用 SDRAM。
簡(jiǎn)單:沒(méi)有調度,一次只有一家銀行處于活動(dòng)狀態(tài)。
功能強大:SDRAM 表現為簡(jiǎn)單的雙端口存儲器(即具有一個(gè)寫(xiě)入代理和一個(gè)讀取代理)。
控制器最不常見(jiàn)的功能可能是最后一個(gè)功能。 SDRAM 是單端口存儲器,但 FPGA 從訪(fǎng)問(wèn)雙端口存儲器(如塊式存儲器)中受益匪淺,因此我們認為這是一個(gè)不錯的功能。
控制器信號
以下是SDRAM控制器的簡(jiǎn)單視圖。
左邊的前三個(gè)信號由寫(xiě)入代理使用(“寫(xiě)入請求”,然后是“寫(xiě)入地址”和“寫(xiě)入數據”)。 然后是閱讀代理的三個(gè)信號。 在右側,控制器驅動(dòng)SDRAM信號。 為了正確看待問(wèn)題,這里是使用我們的SDRAM控制器的典型FPGA系統的視圖。
現在,我們的控制器使SDRAM顯示為雙端口存儲器。 但是SDRAM實(shí)際上是一個(gè)單端口存儲器,所以我們的控制器必須玩一個(gè)技巧。 如果我們的控制器同時(shí)收到兩個(gè)請求,它要么必須停止一個(gè)代理,要么記錄他們的請求并在以后執行它們。 我們的控制器選擇了第一種策略。 因此,我們添加了“授予”信號:代理可以隨時(shí)斷言請求,但控制器有權授予或不授予請求。 如果請求被拒絕,請繼續詢(xún)問(wèn),它最終會(huì )被批準。
SDRAM 的最后一個(gè)復雜因素是,從讀取請求返回的數據會(huì )延遲(在 SDRAM 數據表中稱(chēng)為 CAS 延遲)。 控制器還可能增加一些延遲時(shí)鐘。 因此,即使控制器可能會(huì )立即授予讀取請求,匹配的數據也只能在固定數量的時(shí)鐘后可用。 為方便起見(jiàn),我們添加了一個(gè)“數據有效”信號,該信號在數據真正可用時(shí)被斷言。
狀態(tài)機
我們的SDRAM控制器的核心是狀態(tài)機。 控制器等待請求(讀取或寫(xiě)入),打開(kāi)匹配的庫/行,發(fā)出讀取或寫(xiě)入命令(只要活動(dòng)代理在活動(dòng)行中請求這些命令),最后關(guān)閉該行。
使用此方案,一次只有一家銀行處于活動(dòng)狀態(tài)。 先進(jìn)的SDRAM控制器將允許多個(gè)bank同時(shí)處于活動(dòng)狀態(tài),但我們決定保持簡(jiǎn)單。
現在,打開(kāi)和關(guān)閉行需要時(shí)間。 例如,我們的SDRAM數據表提供了以下數字:
tRCD = 20ns(激活讀/寫(xiě))
tRP = 21ns(預充電至激活狀態(tài))
因此,如果我們以 100MHz 的頻率運行 SDRAM,時(shí)鐘周期為 10ns,我們需要在狀態(tài)機中添加一些空時(shí)鐘周期(稱(chēng)為 NOP)。
此外,如果讀取代理無(wú)法保證定期打開(kāi)每一行,則需要刷新周期。
狀態(tài)機現在看起來(lái)有點(diǎn)復雜。
最后,可能需要調整 NOP 循環(huán)次數。 例如,在 100MHz 且 tRP = 21ns 時(shí),我們實(shí)際上需要在預充電后進(jìn)行兩個(gè) NOP 周期(在下一次激活之前給我們 30ns)。
初始化
SDRAM具有一些可編程設置(如CAS延遲),因此需要在上電后初始化“MODE”寄存器。 為此,使用“l(fā)oad mode”命令。 SDRAM 初始化可以添加到控制器中,也可以在控制器運行之前添加到單獨的步驟中。
代碼
我們控制器的核心如下所示。
為了獲得最佳的IO時(shí)序,所有SDRAM控制信號都經(jīng)過(guò)注冊,這樣就不會(huì )有組合邏輯信號進(jìn)入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
完整的演示代碼可在此處獲得。 它是功能性的,但由于這是教育性的,我們通過(guò)刪除非必要功能來(lái)使其盡可能簡(jiǎn)單。 檢查代碼中的注釋?zhuān)私庀拗坪鸵蟆?/p>
使用示例
SDRAM 通常用于視頻卡,因為存儲圖形需要大量?jì)却妗?它的工作原理是這樣的:計算機的 CPU 將圖形數據發(fā)送到視頻卡。 該卡使用SDRAM來(lái)存儲數據,卡中的控制器定期讀取存儲器以將數據發(fā)送到顯示器。 在此過(guò)程中,數據(在 SDRAM 中)會(huì )自動(dòng)刷新。
作為驗證過(guò)程的一部分,我們使用 Xylo-EM 板創(chuàng )建了這樣的基本系統。 SDRAM 控制器是雙端口的,這使得設計變得簡(jiǎn)單明了(PC/FX2 是寫(xiě)入代理,視頻控制器是讀取代理)。
SDRAM 3 - DDR
隨著(zhù)內存制造商試圖找到提高 SDRAM 速度的方法,DDR SDRAM 應運而生。 DDR 代表“雙倍數據速率”。
DDR SDRAM 的大腦類(lèi)似于常規(單數據速率)SDRAM(我們仍然有 bank 和行要打開(kāi))。 DDR SDRAM 的支路要快得多,具有更快的時(shí)鐘速度、更長(cháng)的突發(fā)周期,并且每個(gè)時(shí)鐘周期發(fā)送的每條數據線(xiàn)有兩個(gè)位(因此得名 DDR)。 這導致數據線(xiàn)上的時(shí)序非常緊張,并添加了一些功能來(lái)幫助可靠地傳輸數據。
評論