色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          FPGA:SDRAM控制器

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

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

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

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

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

          SDRAM 1 - 從靜態(tài)到動態(tài)

          靜態(tài)記憶

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

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

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

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

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

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

          動態(tài)記憶

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

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

          有一個復(fù)雜因素:為了提高性能,內(nèi)存被分成相等的塊,稱為“bank”。 這是因?yàn)槟承﹦討B(tài)內(nèi)存操作速度很慢,因此擁有 bank 允許在等待另一個 bank 的同時使用一個 bank。

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

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

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

          • 現(xiàn)在,該行處于活動狀態(tài),F(xiàn)PGA只需提供列地址即可訪問(讀取和/或?qū)懭耄┬兄兴璧娜魏螖?shù)據(jù)。

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

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

          SDRAM 引腳

          如果我們看一下SDRAM的引腳,就會發(fā)現(xiàn)有一些新來者。

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

          請注意,在動態(tài)內(nèi)存術(shù)語中,“打開行”稱為激活,“關(guān)閉行”稱為預(yù)充電。

          刷新

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

          有兩種刷新機(jī)制可用。

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

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

          為什么選擇內(nèi)存控制器?

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

          因此,我們需要的是一種訪問 SDRAM 的方法,但要易于使用靜態(tài)內(nèi)存。 這就是創(chuàng)建內(nèi)存控制器的原因。 它們充當(dāng)轉(zhuǎn)換層:一方面,它們?yōu)橛脩籼峁┮子谑褂玫拇鎯ζ鹘涌?,然后?zhí)行繁瑣的工作來驅(qū)動真正的SDRAM信號。

          SDRAM 2 - 一個簡單的控制器

          我們的具有以下特點(diǎn):

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

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

          • 簡單:沒有調(diào)度,一次只有一家銀行處于活動狀態(tài)。

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

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

          控制器信號

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

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

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

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

          狀態(tài)機(jī)

          我們的SDRAM控制器的核心是狀態(tài)機(jī)。 控制器等待請求(讀取或?qū)懭耄?,打開匹配的庫/行,發(fā)出讀取或?qū)懭朊睿ㄖ灰顒哟碓诨顒有兄姓埱筮@些命令),最后關(guān)閉該行。

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

          現(xiàn)在,打開和關(guān)閉行需要時間。 例如,我們的SDRAM數(shù)據(jù)表提供了以下數(shù)字:

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

          • tRP = 21ns(預(yù)充電至激活狀態(tài))

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

          狀態(tài)機(jī)現(xiàn)在看起來有點(diǎn)復(fù)雜。

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

          初始化

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

          代碼

          我們控制器的核心如下所示。
          為了獲得最佳的IO時序,所有SDRAM控制信號都經(jīng)過注冊,這樣就不會有組合邏輯信號進(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

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

          使用示例

          SDRAM 通常用于視頻卡,因?yàn)榇鎯D形需要大量內(nèi)存。 它的工作原理是這樣的:計(jì)算機(jī)的 CPU 將圖形數(shù)據(jù)發(fā)送到視頻卡。 該卡使用SDRAM來存儲數(shù)據(jù),卡中的控制器定期讀取存儲器以將數(shù)據(jù)發(fā)送到顯示器。 在此過程中,數(shù)據(jù)(在 SDRAM 中)會自動刷新。

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

          SDRAM 3 - DDR

          隨著內(nèi)存制造商試圖找到提高 SDRAM 速度的方法,DDR SDRAM 應(yīng)運(yùn)而生。 DDR 代表“雙倍數(shù)據(jù)速率”。

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



          關(guān)鍵詞: FPGA SDRAM控制器

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉