適應(yīng)多種時(shí)序的DMA控制器設(shè)計(jì)
dam_cnt表示在本次多block操作中,SD卡控制器從DMA存儲(chǔ)器中讀出數(shù)據(jù)的字節(jié)數(shù)(DMA讀模式)或?qū)懭?a class="contentlabel" href="http://www.ex-cimer.com/news/listbylabel/label/DMA">DMA存儲(chǔ)器中的數(shù)據(jù)字節(jié)數(shù)(DMA寫模式)。
顯然,在該圖像協(xié)處理器中,每個(gè)CMD18和CMD25完成之后,dam_in_cnt和dma_cnt都將與dma_num相等,且均為5 120。
2.2.1 multiple block write
如前所述,每次multiple block write要向卡寫入10個(gè)block數(shù)據(jù),即10x512=5 120字節(jié)。為了提高寫卡速度,基帶芯片首先向DMA存儲(chǔ)器中寫入1個(gè)block數(shù)據(jù),然后向SD卡發(fā)出CMD25(multi block write command)。當(dāng)SD卡控制器發(fā)出CMD25并接收到該命令的應(yīng)答信號(hào)后,立即向DMA控制器發(fā)出dma_req信號(hào),準(zhǔn)備從DMA存儲(chǔ)器中讀取數(shù)據(jù)。當(dāng)DMA控制器監(jiān)測(cè)到dma_req為1且dma_write為0后,將依次進(jìn)入狀態(tài)1、狀態(tài)2、狀態(tài)3、狀態(tài)4。在狀態(tài)4中,其會(huì)檢查基帶芯片的寫信號(hào)host_dma_wr是否有效,如無效,其將從DMA存儲(chǔ)器中讀取當(dāng)前地址的數(shù)據(jù),然后再將DMA存儲(chǔ)器的地址加1并進(jìn)入狀態(tài)5;如 host_dma_wr有效,則DMA控制器將等待一個(gè)時(shí)鐘周期,在下個(gè)時(shí)鐘的上升沿再去判斷host_dma_wr的極性,若其失效再讀DMA存儲(chǔ)器。也就是說基帶芯片對(duì)DMA存儲(chǔ)器的操作有更高優(yōu)先級(jí),利用這個(gè)辦法就可以使基帶芯片和SD卡控制器可以盡量并行工作以加快寫卡速度。在狀態(tài)5中,DMA讀狀態(tài)機(jī)做如狀態(tài)4的操作,這是因?yàn)閐ma_rdata的數(shù)據(jù)線寬度為32位,而dma_memory_data-out的數(shù)據(jù)線寬度是16位,所以必須要讀2次DMA存儲(chǔ)器再做一次DMA讀傳送。在狀態(tài)6中,DMA狀態(tài)機(jī)將向SD卡控制器發(fā)出dma_ack(數(shù)據(jù)使能信號(hào))和dma- rdata[31:0],隨后進(jìn)入狀態(tài)7。在狀態(tài)7中,DMA狀態(tài)機(jī)將做3個(gè)重要判斷,首先其判斷dma-cnt是否等于dma_num,如相等則意味著 SD卡控制器在本次多block操作中已經(jīng)讀取了全部5 120個(gè)字節(jié)數(shù)據(jù),狀態(tài)機(jī)將回到初始狀態(tài)以準(zhǔn)備下一次DMA操作;若不相等,則判斷dma_c-nt是否等于dma_in_cnt,若dma_cnt等于 dma_in_cnt,則意味著基帶芯片寫入DMA存儲(chǔ)器的所有數(shù)據(jù)均已被SD卡控制器讀出,DMA存儲(chǔ)器已經(jīng)為空,但數(shù)據(jù)量還沒有達(dá)到5 120字節(jié),DMA狀態(tài)機(jī)將進(jìn)入狀態(tài)8即等待狀態(tài),只有基帶芯片寫入新的數(shù)據(jù)后,SD卡控制器才能回到狀態(tài)4繼續(xù)讀取數(shù)據(jù),這個(gè)分支主要是應(yīng)用于SD卡控制器寫卡速度快于基帶芯片寫DMA存儲(chǔ)器的情況;若dma_cnt不等于dma_in_cnt,則DMA狀態(tài)機(jī)將檢查dma_req信號(hào)的極性,如其為 1,狀態(tài)機(jī)將轉(zhuǎn)至狀態(tài)4讀取下一個(gè)32位數(shù)據(jù),如為0則意味著此時(shí)SD卡控制器寫卡的速度要慢于DMA讀數(shù)據(jù)的速度,其前面通過DMA接口讀出的數(shù)據(jù)還沒有完全寫入SD卡,所以SD卡控制器將暫停從DMA存儲(chǔ)器中讀取數(shù)據(jù),DMA控制器的狀態(tài)機(jī)也將在狀態(tài)7處于等待狀態(tài),等待dma_req重新為1。當(dāng) dma_req再次為1后,狀態(tài)機(jī)將回到狀態(tài)4開始新的32位數(shù)據(jù)的DMA讀操作。最后,當(dāng)?shù)? 119和5 120個(gè)字節(jié)被從DMA存儲(chǔ)器讀出后,DMA狀態(tài)機(jī)將在狀態(tài)7中檢查到dma_cnt=dma_num,標(biāo)志至此,DMA狀態(tài)機(jī)完成了一次DMA讀操作的全過程。SD卡控制器將向基帶芯片發(fā)出中斷信號(hào),基帶芯片響應(yīng)該中斷后將啟動(dòng)下一個(gè)讀卡或?qū)懣ǖ拿?。其讀狀態(tài)流程圖如圖2所示。
2.2.2 multiple block read
在該圖像協(xié)處理器中每次multiple block read要從卡讀出10個(gè)block數(shù)據(jù)并將其全部寫入DMA存儲(chǔ)器當(dāng)中。當(dāng)處于初始狀態(tài)(狀態(tài)0)的DMA狀態(tài)機(jī)發(fā)現(xiàn)dma_req為1且 dma_write信號(hào)為1時(shí),即明確SD卡控制器將開始DMA寫操作,其將依次進(jìn)入狀態(tài)1、狀態(tài)2、狀態(tài)3、狀態(tài)4。在狀態(tài)1中,DMA狀態(tài)機(jī)會(huì)向SD 卡控制器發(fā)出dma_ack信號(hào),由于存儲(chǔ)器讀存在延時(shí),SD卡控制器將在此后的第二個(gè)時(shí)鐘上升沿(即DMA狀態(tài)機(jī)在狀態(tài)3時(shí))送出dma_wdata。 DMA控制器將dma_wdata暫存一個(gè)時(shí)鐘周期后,會(huì)在狀態(tài)4和狀態(tài)5中把此32位數(shù)據(jù)依次寫入DMA存儲(chǔ)器,dma_memory_addr也將在這兩個(gè)狀態(tài)分別加1。在狀態(tài)7中,DMA控制器也將做2個(gè)判斷,首先會(huì)判斷dma_cnt和dma_num是否相等,若相等說明本次 multipleblock read的全部5 120字節(jié)數(shù)據(jù)已經(jīng)寫入DMA存儲(chǔ)器中,DMA狀態(tài)機(jī)將回到狀態(tài)0等待下一次DMA操作指令;若不相等,則判斷dma_req是否為1,如果為1則意味著繼續(xù)做本次DMA寫操作,DMA狀態(tài)機(jī)也將回到狀態(tài)1,開始下一個(gè)32位數(shù)據(jù)的寫入;如果dma_req為0則說明SD卡控制器讀卡的速度較慢,暫時(shí)還沒有新的32位數(shù)據(jù)要寫入,DMA狀態(tài)機(jī)也將在狀態(tài)7處于等待狀態(tài),直至dma_req再次為1,狀態(tài)機(jī)才回
評(píng)論