基于FPGA的高速eMMC磁盘阵列控制器设计

2021-11-18 12:14曹剑锋陕西秦泰阳光电力工程有限公司
品牌研究 2021年5期
关键词:时钟命令传输

文/曹剑锋(陕西秦泰阳光电力工程有限公司)

一、整体结构

整体上,系统由FPGA芯片、eMMC芯片、电源及周边电路、上位机等部分组成。本设计采用4片支持eMMC5.1标准的eMMC芯片组成磁盘阵列,4片eMMC芯片单独连接至FPGA。FPGA内部实现了eMMC磁盘阵列控制器用于控制eMMC磁盘阵列。为了对设计的控制器进行测试验证,FPGA内部还实现了一个万兆网模块,通过光模块与具备万兆网卡的上位机连接,编写了上位机软件用于读写eMMC磁盘阵列。本文介绍的是设计eMMC磁盘阵列控制器的设计思想。

二、eMMC阵列控制器

eMMC磁盘阵列控制器主要由同步传输控制模块和4个eMMC驱动模块组成。4个eMMC驱动模块分别连接4个eMMC芯片。

图1 系统结构图

eMMC驱动模块直接和eMMC芯片打交道,该模块实现对其所连接的eMMC芯片进行初始化和读写操作等功能。该模块向下连接eMMC芯片,向上连接同步传输控制模块。执行同步传输控制模块发来的命令,控制eMMC作出相应的动作;读取eMMC反馈的状态信息,向同步传输控制模块发送运行状态信息。同时,当执行读操作时,从eMMC获取数据,向同步传输控制模块发送数据;当执行写操作时,获取同步传输控制模块发来的数据,发送给eMMC写入。

同步传输控制模块实现了4片eMMC芯片数据的同步读写、同步控制、提供统一对外接口等功能。同步传输控制模块向下连接4个eMMC驱动模块,向上形成eMMC磁盘阵列控制器的对外接口,用于连接万兆网模块。连接万兆网模块的接口包括数据接口和控制接口,数据接口采用标准AXI-stream接口,控制接口包括命令和状态信号。

eMMC驱动模块连接eMMC的信号包括8位数据信号、命令信号、时钟信号等;同步传输控制模块连接每个eMMC驱动模块的接口包括数据接口和控制接口,其中数据接口信号包括8位读数据信号、8位写数据信号,控制接口包括命令信号和状态信号。

(一)同步传输控制模块

同步传输控制模块主要包括数据FIFO和状态控制模块。数据FIFO建立了万兆网模块与eMMC驱动模块之间的数据通道。当进行写操作时,数据从万兆网模块通过写数据FIFO传送到eMMC驱动模块。当进行数据读取操作时,数据由eMMC驱动通过读数据FIFO传送到万兆网模块。

状态控制模块收集各个模块的工作状态和来自上位机的命令,控制各个模块协同工作,完成读写传输操作。

状态控制模块连接着万兆网模块的控制接口,能够接收万兆网模块发来的来自上位机的命令,并能够将eMMC磁盘阵列控制器的工作状态传输给万兆网模块,进而上报上位机,实现对eMMC磁盘阵列控制器的操作。

状态控制模块连接着4个eMMC驱动模块的控制接口,能够获取eMMC驱动模块报告的工作状态;能够向eMMC驱动模块下发命令,控制eMMC驱动模块的读写等操作。

状态控制模块连接着读数据FIFO和写数据FIFO,能够获取各个FIFO的工作状态,能够根据万兆网模块来的命令和eMMC驱动模块的工作状态控制各个FIFO的工作状态,从而实现数据的同步读写传输操作。

(二)eMMC驱动模块结构

eMMC驱动模块具体实现了对eMMC芯片的各种操作。eMMC驱动模块由命令接口模块、数据接口模块、初始化模块和读写控制模块等组成。

图2 eMMC阵列控制器结构图

命令接口模块用于在CMD信号线上发送命令和接收响应。该模块形成eMMC标准命令格式的48位命令数据,将命令数据转换为串行数据,并通过CMD信号线发送给eMMC芯片;通过CMD信号线接收eMMC芯片返回的响应数据,并将串行数据转化为并行数据,然后解析eMMC芯片的响应数据,以便判断命令是否成功执行,获取eMMC芯片的工作状态等。命令接口由状态控制模块、命令形成模块、响应解析模块等部分组成。

数据接口模块用于在eMMC芯片数据线上发送和接收数据。数据接口模块由发送数据模块和接收数据模块组成。本设计采用HS400工作模式,数据会在时钟的上升沿和下降沿传输。当发送数据时,发送数据模块按照eMMC标准规定的数据格式在8根数据线上送出数据包,即1个周期的开始信号、256个时钟周期共512字节数据、16个周期的CRC数据和一个结束信号;当接收数据时,接收数据模块接收8根数据线上的数据包,即1个周期的开始信号、256个周期共512字节数据、16个周期的CRC数据和一个结束信号。在接收256个时钟周期的数据时计算CRC,在接收完数据包后将计算的CRC与接收到的CRC比较,若相同则接收成功,若不同则接收失败。

初始化模块用于对eMMC芯片进行初始化,使其进入传输模式,以便进行读写操作。同时,初始化模块用于监控eMMC的工作状态,当出现故障时,初始化模块重新对eMMC芯片执行初始化操作。初始化模块还向同步传输模块报告eMMC芯片的工作状态。初始化模块包括初始化状态机模块和状态监测模块。初始化状态机用于执行eMMC标准规定的初始化流程,状态监测模块用于监测eMMC工作状态。初始化模块接收同步传输模块发来的命令,向命令接口模块发送需要发送的命令,并接收命令接口模块报告的eMMC工作状态。

读写控制模块用于实现对eMMC芯片的读、写、擦除等操作功能。读写控制模块包括读控制模块、写控制模块、擦除控制模块等部分。当读写控制模块收到同步传输控制模块发来的命令时,根据指令执行不同的操作流程。读写控制模块向命令接口模块发送命令,使所连接的eMMC芯片进入读、写或者擦除的工作状态;读写控制模块接收命令接口模块回报的状态,即所连接的eMMC芯片进入的读、写或擦除状态后,控制数据接口模块进行读、写数据操作。

(三)命令接口模块设计

命令接口模块的作用主要是向eMMC芯片发送串行命令和接收eMMC芯片的响应。命令接口模块依据初始化模块或者读写控制模块发来的命令生成符合eMMC规范的命令包,发送给eMMC芯片;解析eMMC芯片发回的响应,判断命令是否成功执行,并向上返回状态。

在命令接口模块发送命令的时候遵循一定的流程进行。一般情况下,命令接口模块处于IDLE状态,等待新命令。

当初始化模块或者读写控制模块向命令接口模块下发新命令时,命令接口模块状态转化为START,在此状态下,向CMD信号线发送开始信号。随后状态转换为DIR状态,向CMD信号线发送方向信号。接着状态切换到CMD状态,向CMD信号线发送6个时钟周期的CMD数据。随后是PARA状态,向CMD信号线发送32位参数数据。在发送从START到PARA的数据过程中计算7位CRC,在发送完PARA数据后转换为CRC状态并发送计算的CRC数据,最后转化为END状态并发送结束位。这样就完成了一个命令的发送操作。

当命令发送完成后,模块接收eMMC芯片的响应。命令接口模块状态转换为START状态,并在这一状态等待CMD信号线上出现开始信号。当开始信号出现后,状态转换为DIR状态,接收方向信号。然后转换为CMD状态接收6位命令码,并确认接收到的6位命令码是刚才发送命令的响应。随后转换为PARA状态接收32位参数,此参数可以包括eMMC当前的工作状态数据等,由此可以判断命令是否成功执行。接收上述数据时计算CRC。接收完PARA数据后转换为CRC状态,接收CRC数据,然后转换为END状态,并在这一状态验证CRC以判断响应是否正确接收。由此即可完成一次响应的接收。

(四)数据接口模块设计

数据接口模块的作用是向eMMC芯片发送数据和接收eMMC发来的数据。数据接口模块依照eMMC 5.1标准中HS400工作模式形成数据包和解析接收到的数据。数据接口模块接收读写控制模块传来的数据,按照发送流程发送给eMMC芯片,并检查写入是否成功;接收eMMC芯片发来的数据,并检查接收到的数据是否存在错误,成功接收后将数据上传读写控制模块。

发送数据时,当读写控制模块准备好数据后,向命令接口模块和数据接口模块发送写数据命令。数据接口模块从IDLE状态转换为START状态,在此状态下在8位数据线上发送1个时钟周期的开始信号,然后转化为DATA状态。在DATA状态下,发送256个时钟周期的数据信号,数据信号在时钟的上升沿和下降沿发送,一个时钟周期发送2字节数据,共发送512字节数据。在发送数据时计算CRC,当完成发送数据时状态转化为CRC,此时发送16个时钟周期的CRC数据,然后转化为CHECK状态。在CHECK下检查eMMC是否写入成功,若写入成功,则转入IDLE状态等待下一个写数据命令;若写入失败,则转入START状态重复以上流程重新写入当前数据。

接收数据时,当读写控制模块需要读取数据时,向命令接口模块和数据接口模块发送读数据命令。数据接口模块从IDLE状态转换为START状态,等待eMMC数据线上出现开始信号。当等待开始信号超时时,数据接口模块状态返回IDLE状态并向读写控制模块报告状态,等待下一次命令。当eMMC数据线上出现开始信号后,状态转化为DATA,开始接收256个时钟周期的数据。每个时钟周期的上升沿和下降沿都会传输数据,共接收512字节数据。在接收数据的同时计算CRC。当接收数据完成后,状态转换为CRC状态,接收16个时钟的CRC数据。接收完CRC后转换为CHECK状态,将计算得到的CRC和接收到的CRC比较,若一致,则接收成功,否则接收失败,向读写控制模块报告状态后返回IDLE状态,完成接收。

(五)初始化模块

初始化模块的作用是初始化eMMC芯片,使其进入传输模式,准备好进行读写等操作。对于eMMC的初始化,模块遵循eMMC5.1标准中的初始化流程进行。

初始化模块通过向命令接口模块发送命令,控制命令接口模块将指定的初始化命令发送给eMMC芯片;同时获取命令接口模块回报的发送结果。

当系统上电后,初始化模块首先发送CMD0,对eMMC芯片进行软复位,使其进入IDLE状态。随后发送CMD1,当eMMC芯片准备完成后进入READY状态。此时发送CMD2获取芯片的CID,使其进入IDENTFICATION状态。然后发送CMD3为芯片设置地址,芯片进入STANDBY状态。然后发送CMD7选中该芯片,进入SETBW状态。接着发送CMD6设置位宽为8位,进入SETHS400状态。最后发送CMD6设置工作模式为HS400模式,进入DONE状态。这样就完成了eMMC芯片的初始化。当在任何状态下出现发送错误时,系统均进入ERROR状态,在此状态下发送CMD0复位eMMC芯片,使其进入IDLE状态,重复以上过程,直到初始化成功。

在芯片成功完成初始化后,芯片就可以接收读写控制命令进行数据传输等操作了。初始化模块会监控芯片的工作状态,当出现异常状态时,可以对芯片重新初始化。

(六)读写控制模块

读写控制模块实现了对eMMC芯片的数据读取、写入和擦除操作。读写控制模块接收上级传来的命令,并按照eMMC5.1标准中的读、写、擦除操作流程进行工作。

当没有操作命令时,模块处于空闲状态。当收到新的操作命令后,根据命令进行相应的读取、写入或者擦除操作。

当收到读取数据命令时,模块状态从空闲转入读取状态。首先设置块长,通过命令接口模块发送CMD16设置此次要读取的数据块长度,对于HS400,只支持512字节块长;然后设置块数,发送CMD23设置需要读取的数据块个数;然后发送多块读命令,发送CMD18开始读取数据;在读数据状态向数据接口模块发送读取数据命令,等待数据读取完成。当读取完成后进入检查状态,检查读取是否成功,并向上返回状态。读取完成后进入空闲状态等待下一个命令。

当收到写入数据命令时,模块从空闲状态转入写入状态。首先设置块长和设置块数,与读数据命令相同,也是通过命令接口模块发送CMD16和CMD23完成。然后发送多块写命令,发送CMD25开始写入数据;在写数据状态向数据接口模块发送写入数据命令,等待数据写入完成。当写入完成后进入检查状态,检查写入是否成功,并向上返回状态。写入完成后进入空闲状态等待下一个命令。

当收到擦除命令时,模块从空闲状态转入擦除状态。首先通过命令接口模块发送CMD35设置需要擦除数据的起始地址,然后发送CMD36设置结束地址,最后发送CMD38开始擦除数据,状态进入检查状态,等待擦除完成。当擦除完成后向上返回状态,并进入空闲状态等待下一个命令。

三、总结

通过一段时间的编写调试,成功地完成了该eMMC磁盘阵列控制器的设计。通过使用上位机软件测试,该控制器能够以超过1GB每秒的速度读取eMMC中的数据,实现了高速读写eMMC芯片的设计目标。

猜你喜欢
时钟命令传输
轨道交通信号系统无线传输应用
管理Windows10的PowerShell命令行使用记录
特斯拉的接班人:电力可以通过空气传输
古代的时钟
疫情就是命令 防控就是责任
这个时钟一根针
浅谈垂直极化天线在地面数字电视传输中的应用
4K传输
有趣的时钟
解析Windows10的内部命令