刘钟宇,张振华
(中国电子科技集团公司第四十七研究所,沈阳 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.