摘要:從介紹SD卡協議出發,分析了在初始化SD卡過程中命令發送的步驟以及進行語音數據存儲的狀態機設計,在不采用APB總線設計的條件下,運用Verilog語言通過模擬APB總線時序完成控制邏輯的設計,用Modelsim進行前仿,并利用Synplify和QuartusII完成綜合工作,并在Altera StratixII平臺上實現控制邏輯的FPGA驗證。
關鍵詞:SD卡;模擬APB總線;硬件初始化;FPGA驗證
中圖分類號:TP302.2文獻標識碼:A文章編號:1009-3044(2008)31-0990-02
Design and Implementation of the Control Logic for SD Card Initialization and Data Storaging
WANG Qing, LIU Xin-ning
(National Engineering Research Center for ASIC System, Southeast University, Nanjing 210096, China)
Abstract: Basing on introducing SD card specification,analyzing the commands sending process duringinitialization and the state-machine transform for storaging data.Control logic is carried out in Verilog language without using APB bus but by simulating APB clock cycles. Modelsim is used for front_simulation,and then Synplify and QuartusII are used to accomplish synthesis and integration.The result is validated on Altera StratixII platform.
Key words: SD card; APB Bus simulating; hardware initialization; FPGA Verification
1 引言
SD卡以其價格低廉,性能優異,存儲容量大等優點在存儲市場占有極大份額,目前在各個領域運用廣泛,很多移動嵌入式設備中均采用SD卡作為標準的存儲介質。在一般的使用過程中,SD卡的初始化以及數據存儲操作均通過APB總線來實現。在本文中,設計一控制邏輯,并采用模擬APB總線時序的方式來實現硬件啟動SD卡,這種設計使整個系統的架構更加簡單,性能更加優異。
2 控制邏輯系統結構
如圖1所示,本控制邏輯由純硬件實現,在上電之后即開始進行對SD卡進行初始化操作。在采集的語音數據達到一定的量(512bytes)之后,即開始進行數據的存儲操作。
2.1 系統結構的設計
在本設計中,控制邏輯的系統結構設計出于以下幾點考慮:
1) 語音數據經過編碼之后,在到達控制邏輯之前為4bit的ADPCM編碼格式,而APB總線為32bit,為了使APB總線的傳輸效率達到最高,故考慮在接收語音數據之前,將其擴展成32bit后再存儲至FIFO中;
2) FIFO大小的考慮:由于在進行數據存儲操作時,以BLOCK(512Bytes)為單位,考慮到安全性以及CMD命令發送失敗的情況,將控制邏輯中進行數據存儲的FIFO設置為1024bytes;
3) SDIO_CONTROLLER:該部分直接和SDIO模塊進行連接,是本設計中的核心部分,由于不采用APB總線,故和SDIO之間的通信都通過模擬APB總線時序的方式實現;
2.2 控制邏輯功能設計及工作原理
圖2為控制邏輯工作流程。
2.2.1 SD卡初始化階段
上電之后,控制邏輯對SD卡進行初始化操作,依據SD卡協議的相關規定,首先發送CMD0命令,將SD置于IDLE狀態,在等待大于8個CLK的周期時間之后,發送CMD8,該命令用來判斷SD卡類型,如果該命令有返回Response,則該卡為SDHC(High Capacity),如果沒有Response,則為普通SD卡。在等待最少64個CLK時鐘周期之后,繼續發送CMD55+ACMD41命令,該命令用來檢測卡的狀態,返回的Response中如果最高位(busy_bit)為0,則表示SD卡的上電/重啟操作還未完成,需要繼續發送CMD55+ACMD41命令,直至SD卡上電/重啟過程完畢,進入READY狀態。在該狀態發送CMD2,該命令使得連接的SD卡返回確認信息,而后狀態轉入IDENT。IDENT狀態中,控制邏輯發送CMD3,要求SD卡返回對應的自身地址RCA(Relative Card Address),該參數在以后的若干命令中都會有應用。考慮到在數據存儲過程中需要判斷卡的容量, CMD9用來讀取SD卡的CSD寄存器內容,該命令返回的Response中包括的三個參數:READ_BL_LEN,C_SIZE_MULT,C_SIZE,根據這三個參數可以計算出SD卡的容量大小。在上述步驟都順利執行完之后,控制邏輯發送CMD7命令,該命令將SD卡從Stand_By狀態轉入Transfer狀態,準備進行數據傳輸。SD卡的初始化過程完畢。
初始化過程中,在進行命令發送的時候,考慮到有的命令SD卡沒有正確執行或者沒有返回Response信號,因此設定在一定時間后,如果收到CMD的Response,則視該命令正確執行(每個命令都會設置相應的CMD_DONE和CMD_FAIL信號)CMD_DONE拉高,進行狀態跳轉;如果沒有收到CMD的Response,則視該命令執行失敗,狀態重新跳到IDLE狀態,重新發送各項命令,進行初始化進程。
2.2.2 數據讀取階段
在本階段的任務為讀取microSD卡的第二個BLOCK中的數據,以判斷進行存儲操作時所設置的數據存儲地址。
DATA_READ:發送CMD17,單個BLOCK數據讀取命令;
DATA_READ_START:開始進行數據讀取操作,從microSD卡中讀取的數據存儲至SDIO中的rx_fifo中(該fifo用來存儲SDIO進行讀取操作時所獲取的數據),當rx_fifo_empty為低時,表示fifo中有數據進入時,便進行數據讀取,直至讀取的數據滿512Bytes,表示一個BLOCK數據讀取完畢。
2.2.3 數據傳輸階段
在進行數據存儲時,考慮到PC端讀取軟件的需要,首先要將讀出的SD卡大小寫入第一個BLOCK,第二個BLOCK寫入語音數據的存儲地址,從第三個BLOCK開始(地址為0X400)進行語音數據的存儲。在每次512Bytes數據傳輸完畢之后,數據存儲地址Data_add加0X200,即存儲地址后移一個BLOCK,這樣可以保持語音數據在SD卡中的連續性。
如果在進行一定時間的數據存儲之后,數據的存儲地址Data_add大于卡的BLOCK大小,則數據存儲地址Data_add重新歸位為0X400,即從第三個BLOCK 開始重新進行語音數據的存儲。
TRANS:CMD24命令的發送,進行各種數據的存儲操作。在此設置參數BLOCK_NUM_CNT作為進行命令傳送地址判別的依據:BLOCK_NUM_CNT為0時,將SD卡的大小寫入第一個BLOCK;BLOCK_NUM_CNT%1024!=0時,將語音數據依次寫入卡中;當BLOCK_NUM_CNT%1024==0,此時進行第二個BLOCK中數據存儲地址的更新,這樣如果碰到掉電或者RESET情況,語音數據可以繼續上次的存儲地址繼續進行存儲。
DATA_WRITE_WAIT:SD卡初始化完畢,等待進行數據傳輸。由于SD卡在進行數據存儲時傳輸的連續性,必須以BLOCK(512Byte)為單位,所以必須等待前面的FIFO存滿512Bytes數據。當接收到FIFO傳輸過來的data_fifo_ready信號時,表明數據準備完畢,即發送CMD24(單個BLOCK傳輸命令),進行數據傳輸。
DATA_WRITE_START:數據進行傳輸狀態。SDIO中的TX_FIFO對存儲至SD卡的數據具有緩沖作用。由于SDIO中TX_FIFO的大小為32*8,當該FIFO中數據為空或者深度不大于4時,即向SDIO_CONTROLLER發送fifo_data_req信號,表示可以接收數據。
DATA_WRITE_WAIT:每接收一個32bit數據,即轉入此狀態。在該狀態判斷是否一個BLOCK數據已經傳輸完畢,如果傳輸完畢,則進入END狀態,等待下個BLOCK數據的傳輸,否則回到START狀態,根據TX_FIFO中的fifo_data_req信號繼續進行數據傳輸。
DATA_WRITE_END:512Bytes數據傳輸完畢,由于SD卡的工作頻率大于ADPCM編碼的輸入速率(32Kbit/s),故在每個BLOCK數據傳輸完畢之后,FIFO中數據還沒有存滿512Bytes,狀態轉入WAIT等待,直至FIFO中數據存滿一個BLOCK,以進行下一次數據傳輸。
3 控制邏輯的仿真以及FPGA驗證
■
通過波形可以看出,在初始化完畢之后便進行連續的數據存儲操作,控制邏輯的初始化操作以及數據的存儲功能均正確實現。
FPGA的驗證在STRATIXII平臺上面進行,使用Synplify和QuartusII軟件實現代碼的綜合和燒錄工作,通過板級的調試,初始化以及數據存儲功能正確實現。
4 結語
本文所設計的控制邏輯,從硬件啟動SD卡出發,初始化SD卡操作完成之后再進行數據存儲操作,從前仿到FPGA均驗證了該控制邏輯功能的正確性,該設計有效實現了降低系統結構,提高系統的工作效率。
參考文獻:
[1] SD Memory Card Specification Part1 PHYSICAL LAYER SPECIFICATION Version1.0.March.2000.
[2] AMBA? Specification(Rev 2.0)[S]. ARM Limited,1999.3.
[3] J.Bhasker.Verilog HDL硬件描述語言[M].機械工業出版社,2005.
[4] 王金明.數字系統設計與Verilog HDL[M].電子工業出版社,2005.9.
[5] 吳繼華,王誠.Altera FPGA/CPLD設計(高級篇)[M].人民郵電出版社,2005.7.