虞亚君,王小龙,2,邵春伟,2,郝国峰,2,沈小波,2
(1.无锡华普微电子有限公司,江苏 无锡 214035;2.中科芯集成电路有限公司,江苏 无锡 214072)
eMMC(Embedded Multi Media Card)存储颗粒以其尺寸小、速度高、易开发的特点[1],非常适合用作嵌入式数据存储介质。用在机载记录装置时,实时记录大量飞行图像数据,待飞行结束后再将数据卸载回收,提供给相关机构进行研究。用在汽车驾驶辅助系统时,实时记录视频摄像头、激光测距器等探测的环境数据,经过控制器运算,做出行驶路径的预测与规划[2]。虽然eMMC具备坏块管理能力,但如果长时间高密度读写,会出现数据记录出错情况。在系统研发阶段,需提前验证其实际使用寿命,靠近寿损之前及时更换芯片,以确保数据记录无误。本文设计的eMMC 寿命验证方法,使用FPGA 作为读写eMMC 的主控器,可同时验证4 片eMMC 寿命,硬件结构简单、通用性好、观测性强。
本次验证选用江波龙公司旗下的eMMC 芯片,型号为FEMDRW064G-88A19,存储容量为64 GB。图1 是eMMC 内部架构图,主要由MMC 控制器和NAND Flash组成[3-4]。MMC 控制器包含了稳压器、寄存器、核心逻辑块等。稳压器可选1.2 V、1.8 V 或3.3 V,寄存器模块包含CID、CSD、ECSD 等,可读取eMMC 芯片出厂信息和配置工作模式。核心逻辑块完成对外eMMC 总线的数据交互,也完成对内NAND Flash 的功能控制。该控制器实现了接口协议管理、磨损均衡、坏块管理与ECC错误纠错功能,外部设备按照JEDEC 标准eMMC 5.1 协议规范对其控制,驱动eMMC 正常工作。
本次设计同时验证4 片eMMC 在High Speed DDR[5]工作模式下的读写寿命情况。FPGA 选择Xilinx 公司的xc7a50tfgg484-1,该芯片采用28 nm 技术架构,系统级性能比上一代提升50%。可通过Hardware Manager 调试界面,观察eMMC 总线工作情况,读写次数及记录查询由监控软件完成。
测试环境采用软硬结合的方法,如图2 所示。在PC端编写eMMC 监控软件,用于配置并监控FPGA 验证板的工作状态。FPGA 验证板挂载4 片eMMC 芯片,可在特定编程下同时运行,除常规时钟、电源外,配置芯片BPI Flash(PC28F00AP30TFA)用来加载启动程序[6],同时开辟部分缓存,用于保存上次掉电数据。
图2 系统架构图
图3 是基于PC 设计的eMMC 监控软件,通过串口与FPGA 芯片通信,监控eMMC 芯片的读写情况[7]。先设置“测试条件”与“产品编号”,选择“串口端号”,然后启动“串口开关”。板卡上电后,先按下“eMMC 状态查询”,若eMMC 状态查询后的颜色条为绿色,则表示eMMC 初始化成功,否则失败。下一步,在“设置读写次数”后面输入循环读写次数,按下“设置读写次数”按钮,颜色条显示绿色,设置成功。按下“启动测试”按钮,开始测试。支持“暂停测试”或“继续测试”。图3 左下方显示“当前上电启动次数”“当前设置读写次数”“当前测试次数”等状态。“当前测试结果”显示绿色则结果正确,若显示红色则结果出错。该软件还支持“查询总上电启动次数”“查询历史上电记录”,返回相应的“计划测试次数”与“完成测试次数”,颜色条显示测试结果。
图3 eMMC 监控软件
本节主要介绍FPGA 逻辑设计部分,包括时钟切换模块、初始化模块、读写模块,从原理到实现进行阐述。
2.3.1 时钟切换模块设计
根据eMMC5.1 协议规范,系统初始化模块的主时钟为250 kHz,High Speed DDR(双倍率)工作模式下的主时钟为50 MHz。如果使用简单的两路选择器,在切换时钟时,避免不了毛刺的产生,出现不可预期的错误,所以设计图4 的防毛刺时钟切换电路[8-9]。当SELECT 为0时,时钟OUT_CLK 输出为CLK_250K,否则输出为CLK_50M。图中两路都使用了两级D 触发器,再经过与门和或门的运算操作,最终CLK_OUT 输出将无毛刺。输出波形见图5,SELECT 的值拉低后,间隔两个CLK_250K 周期,CLK_OUT 从250 kHz 变成50 MHz。
图4 防毛刺时钟切换电路
图5 CLK_OUT 的输出波形
2.3.2 初始化模块设计
初始化模块是针对eMMC 芯片上电后的的首要配置[10],是实现读写功能的前提,图6 显示配置过程。第一步软件复位,FPGA 发送CMD0 指令<0x40_0000_0000_95>,无返回值。第二步查询上电是否完成,重复发送CMD1 指令<0x41_40FF_8080_89>,直到返回值中busy(最高位)为1,则复位完成,停止发送。第三步发送CMD2 指令<0x 40_0000_0000_4d>,读取CID 寄存器,识别产品标识码信息。第四步分配相对地址,FPGA 发送CMD3 指令<0x 43_0123_0000_a3>,片选地址为0x0123。第五步读取CSD 寄存器,发送CMD9 指令<0x49_0123_0000_2D>,读取数据格式、存储容量、数据传输速率等信息。第六步发送CMD7 指令<0x47_0123_0000_01>,用于选定第四步中分配的相对地址,选中设备。第七步至第九步都发送不同的CMD6 指令,第七步发送<0x46_0321_0100_cb>,设置CACHE_CTRL 为0x01,开启高速缓存;第八步发送<0x46_03b9_0100_2F >,开启High Speed 高速模式;第九步发送<0x46_03B7_0600_4F>,数据位宽设为8 bit、双沿采样。最后一步发送CMD13 指令<0x4d_0123_0000_8f >,验证初始化操作的正确性。
图6 初始化流程
2.3.3 读写模块设计
本次设计的数据传输模式为双倍率总线模式[11],格式如图7 所示。数据帧的起始位为0,在时钟CLK 上升沿有效,数据块长度为块长度的1/2,其中奇数数据在CLK上升沿有效,偶数数据在CLK 下降沿有效。数据块之后附带2 组CRC 校验码,分别保护数据块中奇数和偶数数据,CLK 上升沿有效的是奇数数据校验,下降沿有效的是偶数数据校验。数据包的停止位在上升沿有效。
图7 双倍率数据传输格式
数据写入模块采用开放式多块写方式[12],传输数据块数量不设限,比单块写方式节省更新新地址的时间损耗。状态机如图8 所示,发送CMD25 指令<0x5900_0000_0003>设置数据写入首地址,等待Rsp 响应正确后,写入512 字节的块数据,然后等待DAT0 总线上的CRC 校验结果,若正确,则返回010,然后发送其他块数据;若错误,则返回101,在发送停止命令CMD12<0x4C00_0000_0061>后,本次传输结束,再重新发送当前块数据。全部写完数据块后,也需要发送CMD12 来结束传输。
图8 写数据状态机
数据读出模块采用开放式多块读方式,与图8 写数据状态机类似。首先发送CMD18<0x5200_0000_00E1>设置数据首地址,在发送命令完毕后等待2 个时钟,数据块开始读回,含尾部CRC 校验码。然后FPGA 进行CRC 解校验,若校验成功,则保存数据,否则发送CMD12,结束本次传输。
得益于eMMC 芯片独有的Global-wear-leveling 全局磨损均衡算法,可以针对局部地址重复擦写。所以将eMMC 分区,按实际使用60 GB 计算,分成60 等块,选取1 GB 的块区域进行操作。为严格验证读写寿命,每次刷新都需要对每一个比特位进行0 和1 翻转。先在块区域里写满0x55,并读出比较,返回值一致后,再刷新写满0xAA,再读取比较是否一致,重复进行60 次,才遍历读写完一次eMMC。参照eMMC 芯片手册不低于3 000 次的读写寿命,所以监控软件生成的“总累计读写次数”要不低于180 000 次,只要出错一次,则寿命验证结果失败。表1 是在eMMC 监控软件里随机抽取的4 片eMMC测试记录。其中抽取了1 号eMMC 的第23 次上电启动次数,上电时间是2022/3/20/8:42,下电时间是2022/3/22/13:06,总时长为3 144 min,考虑中途有断电情况,实际完成次数是3 008,测试结果为正常。
表1 抽取4 片eMMC 记录数据
表2 统计4 片eMMC 的全部测完180 000 次的累计天数,可以看出完成180 000 次寿命测试,4 片eMMC 中累计天数最大是138.77 天,最低是136.34 天,相差2.43天,偏差合理。图9 显示4 片eMMC 读写速率,在第10 000 次的时候,eMMC2 的速度最大是35 MB/s,在第80 000 次的时候,速度最小是29 MB/s,其速率都在31 MB/s 左右,符合设定总线速度要求。结果为4 片eMMC 全部通过寿命验证。
表2 统计4 片eMMC 累计读写天数
图9 4 片eMMC 读写速率
本文基于eMMC 芯片工作原理,深入研究了用FPGA实现eMMC 寿命测试的实现方法。针对eMMC 芯片单沿采样速率慢的问题,研发了High Speed DDR 总线工作模式,实际测得最快读写均速达到31 MB/s。同时,经过长时间的疲劳测试,所选4 块eMMC 芯片均能完成180 000次的块读写,达到了手册上的要求。此次设计的寿命测试系统结合了监测软件的可配置性,结合FPGA 芯片独有的多线并行操作,为同时控制4 片eMMC 读写带来极大的可控性。按照实际项目需要,若选用市面上其他主流的eMMC 芯片,都能在此硬件架构下进行功能测试,体现了本设计的可扩展性高、通用性强的特点。