劉鐘宇,張振華
(中國電子科技集團公司第四十七研究所,沈陽 110032)
由于電子產品的高速發展和消費者需求,音頻、視頻多媒體技術隨之發展,數據存儲成為必須解決的一個主要問題。SD 卡以其資料儲存量高、傳輸資料速度快、攜帶方便與安全性極佳而被廣泛應用。隨著微電子技術的發展,多媒體技術逐漸成熟和降低成本的考慮,開始使用專門的ASIC 方案,SOC(System On Chip)芯片逐漸成為主流。一般SOC 系統上多采用AMBA 總線,基于此我們開發了一款AMBA-APB 總線的IP,該IP 還可以集成在FPGA系統中,應用于軍事、航空航天、測試和測量、消費類電子、醫療等領域。
通過對SD 卡協議的分析和APB 總線的研究,設計中使用SPI 方式對SD 卡進行讀寫操作,完成各種時序電路的設計,最后掛載到ARM 系統的AHB—APB 總線橋上,進行仿真,并下載到FPGA 器件中進行驗證,編寫相應的驗證程序完成了SD 卡上塊數據的讀寫。
·容量:32MB/64MB/128MB/256MB/512MB/1Gbyte
·兼容規范版本1.01
·兩個可選的通信協議:SD 模式和SPI 模式
·可變時鐘頻率0-25MHz
·通信電壓范圍:2.0-3.6V,工作電壓范圍:2.0-3.6V
·低電壓消耗:自動斷電及自動睡醒,智能電源管理
·無需額外編程電壓
·卡片帶電插拔保護
·正向兼容MMC 卡
·高速串行接口帶隨機存取
--支持雙通道閃存交叉存取
--快寫技術:一個低成本的方案,能夠超高速
訪問閃存和高可靠數據存儲
--最大讀寫速率:10Mbyte/s
·數據壽命:10 萬次編程/擦除
該控制器的時序設計,采用SPI 方式與SD 卡進行數據傳輸,SPI時鐘極性為1,相位為1,其中SD卡在該方式下的引腳定義如表1 所示。

表1 SPI 方式下的SD 卡引腳定義
APB 主要用于低帶寬周邊外設之間的連接,例如UART、SPI、TIMER 等,它的總線架構不像AHB 支持多個主模塊,在APB 里面唯一的主模塊就是APB橋。其特性包括:兩個時鐘周期傳輸;無需等待周期和回應信號;控制邏輯簡單,只有四個控制信號。
APB 上的傳輸可以用圖1 所示的狀態圖來說明。

圖1 狀態轉換圖
(1)系統初始化為IDLE 狀態,此時沒有傳輸操作,也沒有選中任何從模塊。
(2)當有傳輸要進行時,PSELx=1,PENABLE=0,系統進入SETUP 狀態,并只會在SETUP 狀態停留一個周期。當PCLK的下一個上升沿時到來時,系統進入ENABLE 狀態。
(3)系統進入ENABLE 狀態時,維持之前在SETUP 狀態的PADDR、PSEL、PWRITE 不變,并將PENABLE 置為1。傳輸也只會在ENABLE 狀態維持一個周期,在經過SETUP 與ENABLE 狀態之后就已完成。之后如果沒有傳輸要進行,就進入IDLE狀態等待;如果有連續的傳輸,則進入SETUP 狀態。
該IP 能實現SD 卡復位、初始化、塊讀寫操作和CID、CSD 等狀態信息讀取等。該IP是通過SPI 方式訪問SD 卡的。SD 卡IP的接口信號如表2 所示。

表2 IP 信號定義

圖2 SD-IP 結構框圖
當APB 總線對寄存器進行寫操作時,從圖3APB的寫時序來分析,需要PWRITE=1,PSEL=1,PENABLE=1,則寫信號可以表示為APB_WRITE=PWRITE & PSEL & PENABLE;要寫入的寄存器地址由PADDR 來做譯碼進行選擇,寫入的數據為PWDATA。
當APB 總線對寄存器進行讀操作時,從APB的讀時序圖來分析,需要PWRITE=0,PSEL=1,PENABLE=1,則寫信號可以表示為APB_WRITE=~PWRITE & PSEL & PENABLE;要讀出的寄存器地址由PADDR 來做譯碼進行選擇,讀出的數據為PRDATA,通過APB 總線橋傳輸到CPU AHB 總線的HRDATA。

圖3 APB 寫時序圖

圖4 APB 讀時序圖
基于以上時序分析,讀寫信號的邏輯設計如圖5 所示。

圖5 APB 讀寫控制信號
分頻時鐘為SD_CLK,該時鐘主要是與外部的SD 卡進行SPI 通信,完成數據的讀和寫兩個過程。模塊輸入時鐘為PCLK,復位信號為PRESETn,8 位分頻寄存器的值SDIPRE,輸出信號則為SD_CLK,頻率值為:PCLK/2/(SDIPRE+1)。
設計思想是在PCLK時鐘驅動下進行計數,當計數器等于SDIPRE時,狀態個數或時鐘個數為SDIPRE+1,此時輸出信號SD_CLK 進行翻轉;翻轉兩次則形成一個周期,從而得到所要求的分頻值PCLK/2/(SDIPRE+1)。
另外需要考慮以下這種情況,當前SDIPRE 設定值為200,內部計數器會出現0-200的任意一個值,假設當前值為13,此時通過APB 總線設置SDIPRE=10,則需要187個時鐘周期才能再次使計數器和SDIPRE相等,也即SD_CLK 才能發生動作,然后才開始按照設定值進行工作。為實現設置SDIPRE 以后立刻按照所設定的周期產生SD_CLK,使用一個比較器,當計數器值大于或等于SDIPRE時,SD_CLK 即發生翻轉,實現工作頻率的立即變換。該模塊的結構設計見圖6。
CPU 在與SD 卡通信過程中,數據傳輸都是以塊操作來完成,數據量比較大,并且SD 卡接收時序比較慢,對于工作在AHB 總線上的CPU 來說,進行單個數據交換會大大影響系統的工作效率,因此在設計上加入了發送FIFO 和接收FIFO,這樣解決了異步傳輸,快速和慢速設備之間的數據交接。

圖6 分頻模塊結構
這兩塊FIFO 除了接口上信號不同外,內部都一樣,只是被例化成兩個不同的模塊。FIFO 大小設計成64/4byte,有滿、半滿,空和半空標志,因此可以通過中斷使能的開啟,產生中斷信號int_sd 快速與CPU 進行協調。FIFO 設計的關鍵點也是這幾個信號的產生,以發送FIFO為例,寫入端:時鐘為PCLK,寫入使能winc是通過PSEL 與所分配的APB地址譯碼相與來產生。
FIFO的設計框圖見圖7。主要由寫地址產生模塊wr_ptr、讀地址產生模塊rd_ptr、FIFO 滿空標志產生模塊status 和一個雙端口存儲器組成。讀寫地址采用格雷碼設計,并使用最高兩位來產生空還是滿的方向走勢。
SD-Card-Controller的讀寫時序由圖8 幾個狀態組成,在不同狀態下完成不同的時序,詳細時序見MMC 卡控制時序圖。該模塊具有初始化、復位、CSD 和CID 信息的讀取,BLOCK的讀和寫功能,主要完成在適當時間,通過SPI時序寫入命令、數據或讀出各種信息和數據,該過程中產生FIFO 讀時序、寫時序和相關寄存器的訪問。

圖7 FIFO 模塊結構

圖8 狀態機跳轉圖
該狀態機根據不同的寄存器命令和如下代碼中的信號,進行各個狀態之間的跳轉。該狀態機設計采用三段式,其組合邏輯部分也即狀態跳轉部分Verilog 代碼如下:


該IP的驗證主要通過 ARM9 內核外接AHB2APB-Briage 來產生APB時序,并外接程序存儲器和數據存儲器,具體驗證結構如圖9 所示。

圖9 SD-IP的FPGA 驗證結構
FPGA 采用Altera的EP3SL1150C2。首先在ADS 下編寫測試程序,對寄存器進行訪問,保證能夠讀寫,然后正確配置寄存器并通過FIFO 進行數據讀寫,根據FIFO 產生的中斷標志和狀態寄存器的兩種查詢方式,對SD-Card 進行塊讀寫操作。數據的讀寫正確性采用交叉驗證的方式,通過單片機在SD 卡上寫入一頁數據,通過下面的系統讀取該區域的數據;然后以該系統架構執行程序在SD 卡上寫入一頁數據,再通過單片機讀出數據,經過多次讀寫數據反復驗證,該模塊都能正常工作。驗證過程中使用嵌入在QuartusII 中的SignalTapII Logic Analayzer 對關鍵信號采集波形,其中圖10為CID信息的讀取波形。信號SPI_DIN是輸入到SD 卡的串行數據,從波形來看SPI_CS 變低以后,其輸出命令為4AH,接著4個00H,最后產生一個CRC 校驗數據,SPI_DOUT為SD 卡返回的信息。

圖10 讀取CID的時序波形
該IP的設計思想主要是參考三星S3C2410 中的SDIO 應用資料,測試分析之后進行結構設計,經過仿真驗證與設計規范相符合。目前接口為APB形式,并通過FPGA 驗證,可以進行頁寫入、讀出和相關信息(CID、CSD)的讀取。今后可以根據實際需要更改成各種類型的接口,嵌入到FPGA 或ASIC芯片等需要進行大量數據存儲的系統中。
[1]閻石.數字電子技術基礎[M].北京:高等教育出版社,1997.
[2]袁俊泉.Verilog HDL 數字系統設計及其應用[M].西安:西安電子科技大學出版社,2002.
[3]Steve Furber.ARM SoC 體系結構[M].田澤,于敦山,盛世敏,譯.北京:北京航空航天大學出版社,2002.