一種基于DDR高速圖像緩存的實(shí)現(xiàn)
DDR的存儲(chǔ)單元[2]按照塊(BANK)、行(ROW)、列(Column)地址分布,支持最大猝發(fā)操作為8個(gè)存儲(chǔ)單元,每次切換塊、行地址必須首先進(jìn)行充電狀態(tài)(Precharge)來(lái)關(guān)閉當(dāng)前操作的塊、行中的存儲(chǔ)單元,并且在進(jìn)行新的操作時(shí)首先要激活操作單元所在的塊和行,控制器在工作空閑狀態(tài)下發(fā)出激活命令(ACTIVE)進(jìn)入激活狀態(tài),在此狀態(tài)下等候應(yīng)用層發(fā)送的控制命令以進(jìn)行數(shù)據(jù)操作。
由以上分析可知:由于存在猝發(fā)長(zhǎng)度限制及塊和行地址切換等控制時(shí)間開(kāi)銷(xiāo),DDR的隨機(jī)操作的數(shù)據(jù)吞吐量實(shí)際上是有限的,不適合高速圖像緩存這種應(yīng)用環(huán)境,必須設(shè)計(jì)一種新的猝發(fā)模式來(lái)提高數(shù)據(jù)吞吐量。本文結(jié)合DDR充電以及圖像緩存的特點(diǎn),提出并實(shí)現(xiàn)了一種一次操作DDR一行、一行1 024個(gè)存儲(chǔ)單元的猝發(fā)模式,由于DDR只支持2、4、8長(zhǎng)度的猝發(fā)模式,設(shè)計(jì)中采用了猝發(fā)長(zhǎng)度為4的連續(xù)猝發(fā)方式,核心思想是在一次猝發(fā)正在進(jìn)行的時(shí)候又發(fā)起操作命令從而使得該次猝發(fā)后連續(xù)進(jìn)行下一次猝發(fā)。實(shí)現(xiàn)了一次連續(xù)操作2KB數(shù)據(jù)的高吞吐量操作。如圖2狀態(tài)機(jī)所示,當(dāng)一行操作完后則進(jìn)入空閑狀態(tài),然后再進(jìn)行自動(dòng)刷新和充電的操作。這種猝發(fā)模式一次猝發(fā)只需要一次充電操作,而猝發(fā)長(zhǎng)度為8的猝發(fā)模式完成2KB的數(shù)據(jù)傳輸共需要進(jìn)行125次充電操作,而一次充電操作需要幾個(gè)時(shí)鐘周期開(kāi)銷(xiāo),相比較而言,大大節(jié)省了控制開(kāi)銷(xiāo),提高了數(shù)據(jù)吞吐量。
1.2 應(yīng)用層控制模塊
本設(shè)計(jì)將DDR作為FIFO的容量擴(kuò)展來(lái)實(shí)現(xiàn)高速緩存,這需要內(nèi)部產(chǎn)生地址邏輯。在應(yīng)用層控制模塊中,負(fù)責(zé)接收用戶(hù)接口模塊送過(guò)來(lái)的命令信號(hào),并對(duì)命令進(jìn)行譯碼。判斷當(dāng)前命令與上次命令一樣的時(shí)候地址繼續(xù)累加產(chǎn)生,當(dāng)前命令與上次命令不同時(shí)則地址復(fù)位,重新從DDR的零地址開(kāi)始操作,這樣符合FIFO的工作特點(diǎn)。模塊產(chǎn)生DDR的地址信號(hào)和物理層的控制信號(hào),并根據(jù)地址邏輯產(chǎn)生DDR狀態(tài)信號(hào)反饋到用戶(hù)層接口。
1.3 用戶(hù)層接口模塊
用戶(hù)層接口模塊[3]負(fù)責(zé)接收圖像輸入數(shù)據(jù),并提供簡(jiǎn)易用戶(hù)接口,屏蔽了內(nèi)部控制的復(fù)雜性,在用戶(hù)看來(lái)對(duì)該DDR的操作實(shí)際上就是對(duì)FIFO的操作,判斷DDR內(nèi)部產(chǎn)生的DDR狀態(tài)信號(hào),發(fā)出緩存或者數(shù)據(jù)讀出命令。
用戶(hù)接口層模塊方框圖如圖3所示。當(dāng)用戶(hù)發(fā)出緩存命令時(shí),內(nèi)部狀態(tài)機(jī)自動(dòng)監(jiān)測(cè)圖像幀的開(kāi)始位置并將一幀中的幾行數(shù)據(jù)寫(xiě)入“輸入FIFO”,當(dāng)此FIFO達(dá)到一次猝發(fā)操作數(shù)據(jù)量2KB時(shí),狀態(tài)機(jī)發(fā)出DDR寫(xiě)命令到下一層,并一次性讀完輸入FIFO的數(shù)據(jù)。圖像數(shù)據(jù)連續(xù)向“輸入FIFO”輸入,狀態(tài)機(jī)不間斷地檢測(cè)“輸入FIFO”的編程狀態(tài)信號(hào)并發(fā)出DDR寫(xiě)命令。由于圖像數(shù)據(jù)存在行場(chǎng)消隱期以及DDR的行猝發(fā)寫(xiě)操作效率高,因此在一定的像素時(shí)鐘條件下不會(huì)出現(xiàn)數(shù)據(jù)堵塞情況。
當(dāng)用戶(hù)發(fā)出讀出命令時(shí),狀態(tài)機(jī)自動(dòng)檢測(cè)“輸入FIFO”的狀態(tài),在可編程空信號(hào)有效時(shí)一次性向“輸出FIFO”輸入2KB數(shù)據(jù),此時(shí)“輸出FIFO”輸出數(shù)據(jù)有效信號(hào)以提示用戶(hù)可以進(jìn)行數(shù)據(jù)讀取。用戶(hù)從DDR讀出數(shù)據(jù)操作實(shí)際上就是對(duì)FIFO的讀操作,因此用戶(hù)只需要提供讀FIFO使能信號(hào)以及讀FIFO時(shí)鐘就可以將DDR內(nèi)部的數(shù)據(jù)依次讀出。當(dāng)用戶(hù)快要將FIFO的數(shù)據(jù)讀空的時(shí)候,狀態(tài)機(jī)發(fā)出讀命令從DDR存儲(chǔ)器中一次性讀出2KB數(shù)據(jù)存入“輸出FIFO”中,由于DDR讀的峰值速度高達(dá)400MB/s(100MHz×2B×2),而用戶(hù)接口讀速率一般不超過(guò)這個(gè)值,因此不會(huì)出現(xiàn)數(shù)據(jù)堵塞情況。
該模塊完成了用戶(hù)接口、圖像輸入、控制器三個(gè)時(shí)鐘域的設(shè)計(jì),極大地簡(jiǎn)化了用戶(hù)接口的操作。良好的功能模塊化劃分,使得用戶(hù)只需按照具體要求對(duì)圖像輸入接口進(jìn)行簡(jiǎn)單修改便可實(shí)現(xiàn)對(duì)于任何數(shù)據(jù)源的緩存,拓寬了該緩存技術(shù)的應(yīng)用范圍。
1.4 時(shí)鐘管理單元模塊
本設(shè)計(jì)DDR控制器時(shí)鐘頻率[4]為100MHz,在各模塊中時(shí)鐘相位可以不同。因此時(shí)鐘管理模塊對(duì)時(shí)鐘輸入信號(hào)進(jìn)行90°、180°、270°等相移,設(shè)計(jì)中可以采用FPGA的數(shù)字時(shí)鐘管理單元(DCM)。該模塊產(chǎn)生復(fù)位信號(hào),當(dāng)上電復(fù)位該模塊自動(dòng)檢測(cè)復(fù)位信號(hào),并延遲200μs產(chǎn)生控制器所需要的復(fù)位信號(hào)。
2 性能測(cè)試
使用VHDL語(yǔ)言[5]在ISE7.1i軟件環(huán)境下完成整個(gè)模塊的設(shè)計(jì),綜合后共占14%的芯片Slice資源,最高時(shí)鐘頻率可達(dá)156.5MHz。在基于Xilinx的VirtexIIpro硬件平臺(tái)上加載測(cè)試,硬件平臺(tái)中使用的DDR為Micron公司的MT46V32M16芯片,晶振為100MHz。
為測(cè)試該設(shè)計(jì)的最高平均緩存速度,采用邏輯分析儀采集控制器內(nèi)部工作時(shí)的數(shù)據(jù)傳輸狀態(tài)。發(fā)現(xiàn)一行數(shù)據(jù)的猝發(fā)共需要512個(gè)時(shí)鐘周期,而刷新、充電、狀態(tài)等待等時(shí)鐘開(kāi)銷(xiāo)只需要不到50個(gè)時(shí)鐘周期,因此,實(shí)際平均數(shù)據(jù)吞吐量為理論峰值速率400MB/s×512/(512+50)≈360MB/s。
為測(cè)試該圖像緩存的數(shù)據(jù)記錄的完整性,向該模塊輸入模擬產(chǎn)生的相機(jī)數(shù)據(jù)。8位灰度圖像大小為512×512,圖4為從DDR器件中讀出的緩存圖像。
本文設(shè)計(jì)并實(shí)現(xiàn)了一種基于DDR的高速圖像緩存。創(chuàng)新地采用了行猝發(fā)操作以提高數(shù)據(jù)吞吐量。在100MHz的時(shí)鐘條件下實(shí)現(xiàn)峰值傳輸速率400MB/s、最大平均傳輸速率360MB/s的圖像緩存。在提高時(shí)鐘頻率的情況下數(shù)據(jù)傳輸率還有上升空間。同時(shí)用戶(hù)可根據(jù)需求對(duì)輸入接口進(jìn)行修改以應(yīng)用于特殊要求的數(shù)據(jù)緩存,應(yīng)用廣泛。
評(píng)論