<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          FPGA:SDRAM控制器

          作者: 時(shí)間:2024-01-11 來(lái)源:EEPW編譯 收藏

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

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

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

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

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

          靜態(tài)記憶

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

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

          真正的存儲(chǔ)器也會(huì)有一個(gè)CS(芯片選擇),如果存儲(chǔ)器是同步的,則有一個(gè)時(shí)鐘(為了清楚起見(jiàn),圖片中省略了這些時(shí)鐘)。

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

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

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

          動(dòng)態(tài)記憶

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

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

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

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

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

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

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

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

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

          SDRAM 引腳

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

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

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

          刷新

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

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

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

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

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

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

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

          SDRAM 2 - 一個(gè)簡(jiǎn)單的控制器

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

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

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

          • 簡(jiǎn)單:沒(méi)有調(diào)度,一次只有一家銀行處于活動(dòng)狀態(tài)。

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

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

          控制器信號(hào)

          以下是SDRAM控制器的簡(jiǎn)單視圖。

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

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

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

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

          我們的SDRAM控制器的核心是狀態(tài)機(jī)。 控制器等待請(qǐng)求(讀取或?qū)懭耄?,打開(kāi)匹配的庫(kù)/行,發(fā)出讀取或?qū)懭朊睿ㄖ灰顒?dòng)代理在活動(dòng)行中請(qǐng)求這些命令),最后關(guān)閉該行。

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

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

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

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

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

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

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

          初始化

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

          代碼

          我們控制器的核心如下所示。
          為了獲得最佳的IO時(shí)序,所有SDRAM控制信號(hào)都經(jīng)過(guò)注冊(cè),這樣就不會(huì)有組合邏輯信號(hào)進(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 通常用于視頻卡,因?yàn)榇鎯?chǔ)圖形需要大量?jī)?nèi)存。 它的工作原理是這樣的:計(jì)算機(jī)的 CPU 將圖形數(shù)據(jù)發(fā)送到視頻卡。 該卡使用SDRAM來(lái)存儲(chǔ)數(shù)據(jù),卡中的控制器定期讀取存儲(chǔ)器以將數(shù)據(jù)發(fā)送到顯示器。 在此過(guò)程中,數(shù)據(jù)(在 SDRAM 中)會(huì)自動(dòng)刷新。

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

          SDRAM 3 - DDR

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

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



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

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();