劉鐘宇,張振華
(中國電子科技集團(tuán)公司第四十七研究所,沈陽 110032)
由于電子產(chǎn)品的高速發(fā)展和消費(fèi)者需求,音頻、視頻多媒體技術(shù)隨之發(fā)展,數(shù)據(jù)存儲成為必須解決的一個主要問題。SD 卡以其資料儲存量高、傳輸資料速度快、攜帶方便與安全性極佳而被廣泛應(yīng)用。隨著微電子技術(shù)的發(fā)展,多媒體技術(shù)逐漸成熟和降低成本的考慮,開始使用專門的ASIC 方案,SOC(System On Chip)芯片逐漸成為主流。一般SOC 系統(tǒng)上多采用AMBA 總線,基于此我們開發(fā)了一款A(yù)MBA-APB 總線的IP,該IP 還可以集成在FPGA系統(tǒng)中,應(yīng)用于軍事、航空航天、測試和測量、消費(fèi)類電子、醫(yī)療等領(lǐng)域。
通過對SD 卡協(xié)議的分析和APB 總線的研究,設(shè)計中使用SPI 方式對SD 卡進(jìn)行讀寫操作,完成各種時序電路的設(shè)計,最后掛載到ARM 系統(tǒng)的AHB—APB 總線橋上,進(jìn)行仿真,并下載到FPGA 器件中進(jìn)行驗(yàn)證,編寫相應(yīng)的驗(yàn)證程序完成了SD 卡上塊數(shù)據(jù)的讀寫。
·容量:32MB/64MB/128MB/256MB/512MB/1Gbyte
·兼容規(guī)范版本1.01
·兩個可選的通信協(xié)議:SD 模式和SPI 模式
·可變時鐘頻率0-25MHz
·通信電壓范圍:2.0-3.6V,工作電壓范圍:2.0-3.6V
·低電壓消耗:自動斷電及自動睡醒,智能電源管理
·無需額外編程電壓
·卡片帶電插拔保護(hù)
·正向兼容MMC 卡
·高速串行接口帶隨機(jī)存取
--支持雙通道閃存交叉存取
--快寫技術(shù):一個低成本的方案,能夠超高速
訪問閃存和高可靠數(shù)據(jù)存儲
--最大讀寫速率:10Mbyte/s
·數(shù)據(jù)壽命:10 萬次編程/擦除
該控制器的時序設(shè)計,采用SPI 方式與SD 卡進(jìn)行數(shù)據(jù)傳輸,SPI時鐘極性為1,相位為1,其中SD卡在該方式下的引腳定義如表1 所示。
表1 SPI 方式下的SD 卡引腳定義
APB 主要用于低帶寬周邊外設(shè)之間的連接,例如UART、SPI、TIMER 等,它的總線架構(gòu)不像AHB 支持多個主模塊,在APB 里面唯一的主模塊就是APB橋。其特性包括:兩個時鐘周期傳輸;無需等待周期和回應(yīng)信號;控制邏輯簡單,只有四個控制信號。
APB 上的傳輸可以用圖1 所示的狀態(tài)圖來說明。
圖1 狀態(tài)轉(zhuǎn)換圖
(1)系統(tǒng)初始化為IDLE 狀態(tài),此時沒有傳輸操作,也沒有選中任何從模塊。
(2)當(dāng)有傳輸要進(jìn)行時,PSELx=1,PENABLE=0,系統(tǒng)進(jìn)入SETUP 狀態(tài),并只會在SETUP 狀態(tài)停留一個周期。當(dāng)PCLK的下一個上升沿時到來時,系統(tǒng)進(jìn)入ENABLE 狀態(tài)。
(3)系統(tǒng)進(jìn)入ENABLE 狀態(tài)時,維持之前在SETUP 狀態(tài)的PADDR、PSEL、PWRITE 不變,并將PENABLE 置為1。傳輸也只會在ENABLE 狀態(tài)維持一個周期,在經(jīng)過SETUP 與ENABLE 狀態(tài)之后就已完成。之后如果沒有傳輸要進(jìn)行,就進(jìn)入IDLE狀態(tài)等待;如果有連續(xù)的傳輸,則進(jìn)入SETUP 狀態(tài)。
該IP 能實(shí)現(xiàn)SD 卡復(fù)位、初始化、塊讀寫操作和CID、CSD 等狀態(tài)信息讀取等。該IP是通過SPI 方式訪問SD 卡的。SD 卡IP的接口信號如表2 所示。
表2 IP 信號定義
圖2 SD-IP 結(jié)構(gòu)框圖
當(dāng)APB 總線對寄存器進(jìn)行寫操作時,從圖3APB的寫時序來分析,需要PWRITE=1,PSEL=1,PENABLE=1,則寫信號可以表示為APB_WRITE=PWRITE & PSEL & PENABLE;要寫入的寄存器地址由PADDR 來做譯碼進(jìn)行選擇,寫入的數(shù)據(jù)為PWDATA。
當(dāng)APB 總線對寄存器進(jìn)行讀操作時,從APB的讀時序圖來分析,需要PWRITE=0,PSEL=1,PENABLE=1,則寫信號可以表示為APB_WRITE=~PWRITE & PSEL & PENABLE;要讀出的寄存器地址由PADDR 來做譯碼進(jìn)行選擇,讀出的數(shù)據(jù)為PRDATA,通過APB 總線橋傳輸?shù)紺PU AHB 總線的HRDATA。
圖3 APB 寫時序圖
圖4 APB 讀時序圖
基于以上時序分析,讀寫信號的邏輯設(shè)計如圖5 所示。
圖5 APB 讀寫控制信號
分頻時鐘為SD_CLK,該時鐘主要是與外部的SD 卡進(jìn)行SPI 通信,完成數(shù)據(jù)的讀和寫兩個過程。模塊輸入時鐘為PCLK,復(fù)位信號為PRESETn,8 位分頻寄存器的值SDIPRE,輸出信號則為SD_CLK,頻率值為:PCLK/2/(SDIPRE+1)。
設(shè)計思想是在PCLK時鐘驅(qū)動下進(jìn)行計數(shù),當(dāng)計數(shù)器等于SDIPRE時,狀態(tài)個數(shù)或時鐘個數(shù)為SDIPRE+1,此時輸出信號SD_CLK 進(jìn)行翻轉(zhuǎn);翻轉(zhuǎn)兩次則形成一個周期,從而得到所要求的分頻值PCLK/2/(SDIPRE+1)。
另外需要考慮以下這種情況,當(dāng)前SDIPRE 設(shè)定值為200,內(nèi)部計數(shù)器會出現(xiàn)0-200的任意一個值,假設(shè)當(dāng)前值為13,此時通過APB 總線設(shè)置SDIPRE=10,則需要187個時鐘周期才能再次使計數(shù)器和SDIPRE相等,也即SD_CLK 才能發(fā)生動作,然后才開始按照設(shè)定值進(jìn)行工作。為實(shí)現(xiàn)設(shè)置SDIPRE 以后立刻按照所設(shè)定的周期產(chǎn)生SD_CLK,使用一個比較器,當(dāng)計數(shù)器值大于或等于SDIPRE時,SD_CLK 即發(fā)生翻轉(zhuǎn),實(shí)現(xiàn)工作頻率的立即變換。該模塊的結(jié)構(gòu)設(shè)計見圖6。
CPU 在與SD 卡通信過程中,數(shù)據(jù)傳輸都是以塊操作來完成,數(shù)據(jù)量比較大,并且SD 卡接收時序比較慢,對于工作在AHB 總線上的CPU 來說,進(jìn)行單個數(shù)據(jù)交換會大大影響系統(tǒng)的工作效率,因此在設(shè)計上加入了發(fā)送FIFO 和接收FIFO,這樣解決了異步傳輸,快速和慢速設(shè)備之間的數(shù)據(jù)交接。
圖6 分頻模塊結(jié)構(gòu)
這兩塊FIFO 除了接口上信號不同外,內(nèi)部都一樣,只是被例化成兩個不同的模塊。FIFO 大小設(shè)計成64/4byte,有滿、半滿,空和半空標(biāo)志,因此可以通過中斷使能的開啟,產(chǎn)生中斷信號int_sd 快速與CPU 進(jìn)行協(xié)調(diào)。FIFO 設(shè)計的關(guān)鍵點(diǎn)也是這幾個信號的產(chǎn)生,以發(fā)送FIFO為例,寫入端:時鐘為PCLK,寫入使能winc是通過PSEL 與所分配的APB地址譯碼相與來產(chǎn)生。
FIFO的設(shè)計框圖見圖7。主要由寫地址產(chǎn)生模塊wr_ptr、讀地址產(chǎn)生模塊rd_ptr、FIFO 滿空標(biāo)志產(chǎn)生模塊status 和一個雙端口存儲器組成。讀寫地址采用格雷碼設(shè)計,并使用最高兩位來產(chǎn)生空還是滿的方向走勢。
SD-Card-Controller的讀寫時序由圖8 幾個狀態(tài)組成,在不同狀態(tài)下完成不同的時序,詳細(xì)時序見MMC 卡控制時序圖。該模塊具有初始化、復(fù)位、CSD 和CID 信息的讀取,BLOCK的讀和寫功能,主要完成在適當(dāng)時間,通過SPI時序?qū)懭朊?、?shù)據(jù)或讀出各種信息和數(shù)據(jù),該過程中產(chǎn)生FIFO 讀時序、寫時序和相關(guān)寄存器的訪問。
圖7 FIFO 模塊結(jié)構(gòu)
圖8 狀態(tài)機(jī)跳轉(zhuǎn)圖
該狀態(tài)機(jī)根據(jù)不同的寄存器命令和如下代碼中的信號,進(jìn)行各個狀態(tài)之間的跳轉(zhuǎn)。該狀態(tài)機(jī)設(shè)計采用三段式,其組合邏輯部分也即狀態(tài)跳轉(zhuǎn)部分Verilog 代碼如下:
該IP的驗(yàn)證主要通過 ARM9 內(nèi)核外接AHB2APB-Briage 來產(chǎn)生APB時序,并外接程序存儲器和數(shù)據(jù)存儲器,具體驗(yàn)證結(jié)構(gòu)如圖9 所示。
圖9 SD-IP的FPGA 驗(yàn)證結(jié)構(gòu)
FPGA 采用Altera的EP3SL1150C2。首先在ADS 下編寫測試程序,對寄存器進(jìn)行訪問,保證能夠讀寫,然后正確配置寄存器并通過FIFO 進(jìn)行數(shù)據(jù)讀寫,根據(jù)FIFO 產(chǎn)生的中斷標(biāo)志和狀態(tài)寄存器的兩種查詢方式,對SD-Card 進(jìn)行塊讀寫操作。數(shù)據(jù)的讀寫正確性采用交叉驗(yàn)證的方式,通過單片機(jī)在SD 卡上寫入一頁數(shù)據(jù),通過下面的系統(tǒng)讀取該區(qū)域的數(shù)據(jù);然后以該系統(tǒng)架構(gòu)執(zhí)行程序在SD 卡上寫入一頁數(shù)據(jù),再通過單片機(jī)讀出數(shù)據(jù),經(jīng)過多次讀寫數(shù)據(jù)反復(fù)驗(yàn)證,該模塊都能正常工作。驗(yàn)證過程中使用嵌入在QuartusII 中的SignalTapII Logic Analayzer 對關(guān)鍵信號采集波形,其中圖10為CID信息的讀取波形。信號SPI_DIN是輸入到SD 卡的串行數(shù)據(jù),從波形來看SPI_CS 變低以后,其輸出命令為4AH,接著4個00H,最后產(chǎn)生一個CRC 校驗(yàn)數(shù)據(jù),SPI_DOUT為SD 卡返回的信息。
圖10 讀取CID的時序波形
該IP的設(shè)計思想主要是參考三星S3C2410 中的SDIO 應(yīng)用資料,測試分析之后進(jìn)行結(jié)構(gòu)設(shè)計,經(jīng)過仿真驗(yàn)證與設(shè)計規(guī)范相符合。目前接口為APB形式,并通過FPGA 驗(yàn)證,可以進(jìn)行頁寫入、讀出和相關(guān)信息(CID、CSD)的讀取。今后可以根據(jù)實(shí)際需要更改成各種類型的接口,嵌入到FPGA 或ASIC芯片等需要進(jìn)行大量數(shù)據(jù)存儲的系統(tǒng)中。
[1]閻石.數(shù)字電子技術(shù)基礎(chǔ)[M].北京:高等教育出版社,1997.
[2]袁俊泉.Verilog HDL 數(shù)字系統(tǒng)設(shè)計及其應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2002.
[3]Steve Furber.ARM SoC 體系結(jié)構(gòu)[M].田澤,于敦山,盛世敏,譯.北京:北京航空航天大學(xué)出版社,2002.