一种在嵌入式系统中使用FPGA改进SD卡的方案的制作方法

文档序号:23090455发布日期:2020-11-27 12:42阅读:146来源:国知局
一种在嵌入式系统中使用FPGA改进SD卡的方案的制作方法
本发明涉及一种在嵌入式系统中使用fpga改进sd卡的方案。
背景技术
:sd卡作为一种便携式的非易失性存储设备,被广泛地用作嵌入式主机的磁盘,起到操作系统镜像存储、数据存储等作用。目前,使用sd卡进行操作系统启动已经成为了嵌入式主机系统启动的主流方式,一些嵌入式soc甚至抛弃了以往常见的spiflash、nandflash等启动方式,只支持使用sd卡进行启动。插有microsd卡的嵌入式主机的框图如图1所示,sd卡中存储系统镜像、应用程序和用户数据,当系统启动时,嵌入式soc会首先将sd卡中的系统镜像加载至存储器中,然后运行系统镜像以启动操作系统。此外,当操作系统启动后,该系统运行的应用程序以及使用的用户数据也往往来自于sd卡。由此可见sd卡在嵌入式主机中的重要作用。然而,嵌入式soc往往对硬件兼容性要求苛刻,且在pcb设计阶段就容易出错,这导致开发阶段对sd卡的调试可能消耗大量的时间成本;其次,sd卡作为可插拔设备,安装在一些恶劣的机械环境中时会对稳定性造成隐患;最后,sd卡必须插拔后才能进行系统和软件的更新(简称离线更新),而一些应用场景希望在不进行硬件插拔,甚至希望在系统运行的同时进行系统和软件的更新。综上所述,sd卡在这些场合下是难于或无法使用的。技术实现要素:本发明目的是:提供一种在嵌入式系统中使用fpga改进sd卡的方案,在工作时,fpga完全模仿一个标准的第二代sd高容量卡(简称sdhcv2)的行为。本发明的技术方案是:一种在嵌入式系统中使用fpga改进sd卡的方案,包括:嵌入式soc和fpga模块;所述fpga模块上包括sdfake和存储装置,所述sdfake是所述fpga内的ip核,所述sdfake通过sd卡接口电路与所述嵌入式soc连接,所述存储装置通过存储器接口与所述sdfake连接;所述sdfake从存储器接口读取数据传送到所述嵌入式soc。其进一步的技术方案是:所述sd卡接口电路包括1bit的时钟sdclk、1bit的命令信号sdcmd、4bit的数据信号sddat0~3;所述嵌入式soc上的时钟sdclk、命令信号sdcmd、数据信号sddat0~3依次连接fpga的6个io管脚;所述嵌入式soc上的sdvcc是提供给sd卡的电源,sdvcc与gnd之间并联电阻和电容,在sdvcc上产生电流,用于供所述嵌入式soc判断sd卡是否存在;所述嵌入式soc的sddat3连接上拉电阻到sdvcc,用于指示sd卡已插入。其进一步的技术方案是:所述sdfake的接口包括复位信号接口、sd总线接口、存储器接口、状态指示灯接口、调试接口;所述复位信号接口实现所述sdfake的异步复位;所述sd总线接口通过所述sd卡接口电路连接到所述嵌入式soc;所述存储器接口连接到所述存储装置;所述状态指示灯接口用于显示sd卡状态;所述嵌入式soc发送的每条命令发送到所述调试接口。其进一步的技术方案是:所述存储装置包括片内rom,所述片内rom通过片内存储器接口与所述sdfake连接。其进一步的技术方案是:所述存储装置还包括片外存储器,所述片外存储器通过片外存储器接口与所述sdfake连接;当所述片外存储器接口与所述sdfake提供的接口不同时,所述存储装置还包括存储接口适配器,所述片外存储器通过片外存储器接口与所述存储接口适配器连接,所述存储接口适配器通过片内存储器接口与所述sdfake连接。其进一步的技术方案是:所述片外存储器包括norflash和nandflash中的至少一种。其进一步的技术方案是:所述存储装置内写入全盘数据的流程包括:使用winhex软件获取sd卡的全盘数据;若使用所述fpga模块的片内rom,则将获取的全盘数据转换成verilog描述的rom;若使用所述fpga模块的片外flash存储器是直插封装的芯片,或只写入一次,则使用flash烧写座将全盘数据写入存储器;若使用所述fpga模块的片外flash存储器是贴片封装,且需要写入多次,则使用切换电路写入;其中,所述切换电路包括烧写控制逻辑电路和mux;在写入时,mux切换到a口;在测试或运行时,mux切换到b口,所述嵌入式soc从写好的存储器中启动。其进一步的技术方案是:所述fpga模块还包括uart发送器,所述uart发送器将所述sdfake提供的调试信息发送给开发者,当开发者对所述嵌入式soc的启动配置和对sd卡兼容性进行调试时,例化所述uart发送器以查看调试信息。本发明的优点是:1.通过将sd卡用fpga代替,fpga可以焊接在pcb板上,避免了普通的sd卡必须插在卡槽中,在一些恶劣的机械环境,比如高频振动或高速旋转的环境下存在接触不良导致系统无法运行等问题,从而消除了机械振动带来的隐患;2.通过记录sd总线上所有来自主机的请求和来自自身的响应,在调试阶段,开发者可以根据记录的信息尽早定位接口故障、启动异常、软件异常等问题的原因,解决了嵌入式主机的操作系统高度定制对硬件兼容性高,导致对开发和调试阶段的错误定位带来困难的问题;3.由于开发者可以通过远程控制fpga的方式来更新虚拟sd卡的内容,从而解决了需要拔下sd卡改动其内容进行系统更新的方式不适用于非接触更新的应用场景的问题;同时,当更新进程被意外打断时,由于fpga的固件没有被破坏,重新启动后仍可以重新更新,从而解决远程控制下使用嵌入式主机本身来改动sd卡进行系统更新的方式无法应对意外情况,当更新进程因意外关机被打断时sd卡内容被损坏,无法启动并继续更新的问题。附图说明下面结合附图及实施例对本发明作进一步描述:图1是包含sd卡的嵌入式主机的系统框图;图2是sd-host、sd卡与连接的sd总线的示意图;图3是sd卡结构的示意图;图4是sd卡上电时的命令序列图;图5是本申请一个实施例提供的在嵌入式系统中使用fpga改进sd卡的方案的结构框图;图6是本申请一个实施例提供的sd卡接口电路的原理图;图7是sdfake模块接口图;图8是sd卡内编址规则与存储器接口编址规则的对应关系图;图9是存储器接口时序图;图10是调试接口时序图;图11是在winhex软件中打开磁盘的界面示意图;图12是在物理磁环中打开sd卡的界面示意图;图13是选择选块开始的界面示意图;图14是选择选块结尾的界面示意图;图15是将sd卡全盘的数据存储到文件的界面示意图;图16是保存hex文件的界面示意图;图17是使用mux切换烧写模式与测试模式的结构框图;图18是用于定位sd卡问题的调试硬件设计的结构框图;图19是仓储机器人中使用本申请的嵌入式系统的结构框图。具体实施方式实施例:sd卡是一种非易失性存储设备,可以作为可移动磁盘使用。如图2所示,其示出了sd卡的应用场景框图,sd-host往往是嵌入式soc、读卡器等设备。sd-host与sd卡之间的总线称为sd总线,包含6根信号,sdclk是sd-host提供给sd卡的时钟。sdcmd是双向信号,sd-host通过sdcmd发送命令给sd卡,并从sdcmd得到其响应。sddat是4bit双向信号,当sd-host读卡时,数据通过sddat从sd卡到sd-host。当sd-host写卡时,数据通过sddat从sd-host到sd卡。结合参考图3,sd卡由两个部分组成——存储阵列(memorycore)和接口控制器(cardinterfacecontroller)。接口控制器解析sd-host发来的命令并提供响应。存储阵列本质上是nandflash,用于存储sd卡的内容。存储阵列以字节编址,地址位宽为41bit,因此寻址空间大小为241=2tib。不同型号的sd卡容量各不相同,例如sdhcv2卡容量范围为2gib~32gib,无论sd卡的容量为多少,它们都使用2tib地址空间内最靠前的连续的地址空间。例如一个7.8gib的sd卡使用的地址范围为0x00000000000~0x001f3333400。sd卡理论上就像norflash和nandflash一样,只需要规定读写操作就能工作。但实际上作为典型的消费电子产品,sd卡接口的协议很复杂(见《sdspecificationsversion2.00》),这既有历史遗留问题的原因,又有兼容形形色色的读卡器的考虑。sd协议规定了近百条命令,分为cmd命令和acmd命令两大类,例如cmd0命令可以将sd卡复位、cmd2命令获取sdcard的cid寄存器、cmd6命令切换sd卡模式、acmd6命令切换sddat的有效总线宽度、cmd17命令是单扇区读、cmd18是多扇区读……这些命令造成了sd卡的操作流程较为繁琐,例如,sd卡上电时,内部的接口控制器需要进行如图4的指令序列。sd卡内的接口控制器可以正确地响应主机发来的命令序列,使操作系统正确地将sd卡识别为磁盘。但如果存储阵列中的数据是空白或随机的,那么sd卡就是未格式化的,类似于受损的磁盘——它是一个合法的物理磁盘,但其中没有逻辑分区。要让嵌入式soc能够从sd卡启动,对存储阵列(sd卡的内容)有如下要求:1.sd卡应该格式化为某种文件系统(例如fat32),即sd卡中必须有文件系统的必要元素:主引导记录(mbr)、操作系统引导记录(dbr)、文件分配表(fat)等。2.在文件系统的基础上,sd卡内要有这种嵌入式soc规定的操作系统镜像文件。例如对于xilinx的zynq处理器,sd卡内要有boot.bin和image.ub文件,才能正常启动操作系统。因此,使用fpga模拟sd卡并能够启动嵌入式soc,需要完成两个工作:首先,需要在fpga内实现一个模块来代替sd卡的接口控制器,由于sd总线协议很复杂,因此实现起来难度较大;其次,需要在fpga片内或片外部署一个存储器来代替sd卡内的存储阵列,且存储器中应存放文件系统信息和soc启动所需要的系统镜像文件。基于上述考虑,本申请提供了一种在嵌入式系统中使用fpga改进sd卡的方案,如图5所示,该方案包括:嵌入式soc和fpga模块。fpga模块上包括sdfake和存储装置,sdfake是fpga内的ip核,sdfake通过sd卡接口电路与嵌入式soc连接,存储装置通过存储器接口与sdfake连接;sdfake从存储器接口读取数据传送到嵌入式soc。可选的,存储装置包括片内rom,片内rom通过片内存储器接口与sdfake连接。可选的,存储装置还包括片外存储器,片外存储器通过片外存储器接口与sdfake连接;当片外存储器接口与sdfake提供的接口不同时,存储装置还包括存储接口适配器,片外存储器通过片外存储器接口与存储接口适配器连接,存储接口适配器通过片内存储器接口与sdfake连接。可选的,片外存储器包括norflash和nandflash中的至少一种。在改进的设计中,sd卡接口电路和sdfake是固定设计,sd卡接口电路负责将嵌入式soc连接到fpga模块。sdfake是fpga内的一个ip核,是本申请的核心部分,能代替sd卡中的接口控制器,具体地讲,sdfake接收并解析嵌入式soc发来的请求,并按《sdspecificationsversion2.00》所规定的sd总线规范进行响应,对于读数据请求,sdfake会从片内存储器接口读取数据并传送到soc。对于soc来说,sdfake的行为与一个sdhcv2只读卡完全相同。片内rom、存储接口适配器、片外存储器是可变设计,用于存储虚拟sd卡的数据(文件系统、系统镜像文件等)。当数据较少时,可以存储于片内rom中;当数据较多时,可以存储于片外存储器(例如norflash、nandflash)中,如果片外存储器接口与sdfake提供的接口不同,需要一个存储器接口适配器进行转换。可选的,fpga模块还包括uart发送器,uart发送器将sdfake提供的调试信息发送给开发者,当开发者对嵌入式soc的启动配置和对sd卡兼容性进行调试时,例化uart发送器以查看调试信息。uart发送器是可选设计,它能将sdfake提供的调试信息通过uart发送给开发者,当开发者希望对嵌入式soc的启动配置和对sd卡兼容性进行调试时,可以例化uart发送器以查看调试信息。结合参考图6,sd卡接口电路包括1bit的时钟sdclk、1bit的命令信号sdcmd、4bit的数据信号sddat0~3;嵌入式soc上的时钟sdclk、命令信号sdcmd、数据信号sddat0~3依次连接fpga的6个io管脚;嵌入式soc上的sdvcc是提供给sd卡的电源,sdvcc与gnd之间并联电阻和电容,示例性的,并联10kω的电阻和1uf的电容,在sdvcc上产生一个小电流,用于供嵌入式soc判断sd卡是否存在;嵌入式soc的sddat3连接上拉电阻到sdvcc,示例性的,上拉电阻47kω,该电阻模仿sd卡规范所规定的sddat3的上拉电阻,用于指示sd卡已插入。sdfake代替了sd卡中原有的接口控制器,它能够按《sdspecificationsversion2.00》中规定的sd总线协议事务来响应soc的请求,并将soc的读请求转化为简易的存储器接口的读事务,方便用户外接各种类型的存储器来实现sd卡的存储阵列。同时,sdfake能够监听soc在sd总线上的命令,通过调试接口发送出去。结合参考图7,sdfake的接口包括复位信号接口、sd总线接口、存储器接口、状态指示灯接口、调试接口;复位信号接口实现sdfake的异步复位;sd总线接口通过sd卡接口电路连接到嵌入式soc;存储器接口连接到存储装置;状态指示灯接口用于显示sd卡状态;嵌入式soc发送的每条命令发送到调试接口。sdfake使用systemverilog编写,兼容性强,能部署在altera、xilinx、microsemi等不同厂商的fpga上。表1是其接口简介:表1其中,关于复位信号,复位信号rst_n能实现模块的异步复位。当rst_n=0时,虚拟sd卡的状态全部复位,并且不响应任何指令。当rst_n=1时,模块正常工作。rst_n可以恒定赋值为高,或者连接到fpga开发板上的按键上。关于sd总线信号,sd总线信号包括1bitinput的sdclk,1bitinout的sdcmd,4bitoutput的sddat,应当直接把它们引出到fpga引脚,再连接到soc即可。需要注意的是,按照sd协议,sddat信号的方向是inout,但sdfake中它是output,这是因为sdfake实现的是sd只读卡,这种卡只会驱动sddat信号,而不会读它。关于存储器接口信号,当soc请求读数据时,sdfake模块通过存储器接口取数据。存储器接口拥有位宽为16bit的数据线(rddata),因此以双字节为单位编址。sd卡中的数据以字节为单位编址,因此sdfake会以小端顺序将sd卡中的相邻两个字节合并为存储器接口中的一个双字节,如图8,左侧为sd卡内编址规则,右侧为存储器接口编址规则。在双字节编址下,存储器接口的地址位宽为40bit,即存储器接口有2*2^40=2tib的寻址空间。sdfake模拟的是一个7.2gb大小的sd-rom卡,2tib的寻址空间中只有前7.2gb被使用。存储器接口时序如图9,rdclk由sdfake提供,频率不超过25mhz。rdreq是读使能信号,rdclk上升沿时,若rdreq出现高电平脉冲,则存储器需要将rdaddr地址所对应的数据读出到rddata信号上,然后rddata需要保持不变直到下一个rdreq高电平脉冲到来。关于状态指示信号,状态指示信号status_led指示接口控制器的状态,可以连接到fpga开发板的8bitled灯上(但不是必须的)。表2展示了每一位的含义:表2关于调试接口,调试接口能显示soc发送的所有命令字。时序如图10。当sdfake收到soc发来的一个命令时,dbg_wen出现一个周期的高电平,同时该命令字出现在dbg_wdata上。当开发者需要使用调试功能时,可以使用uart发送器将调试信息发送到pc机查看,或使用fpga内的逻辑分析仪(例如ila或signaltap)查看。对于sdfake的综合结果,表3展示sdfake在xilinxfpga和alterafpga上综合的结果,可以看出,本申请仅需要一颗小规模、低成本的fpga就能部署。表3fpga型号logicavailablelogicusagefpga芯片价格alteraep4ce662721381(22%)¥12xilinxxc6slx438401125(29%)¥28对于存储器的设计,存储器是为了替代sd卡内的存储阵列,并存储能够让soc启动的文件系统和系统镜像文件。关于存储器硬件设计,不同于sdfake模块的固定设计,存储器的设计很灵活,具体实现方式可以是:1.fpga片内rom:若只需要在soc上运行裸机程序,sd卡中使用的空间很少,大多数空间空闲,此时的sd卡内容可以存储在fpga片内rom中。2.fpga片外存储器:若需要运行操作系统,sd卡中使用的空间往往在5mb以上,此时的sd卡内容可以存储在外置的norflash芯片上,如果使用的空间在几百mb以上,可以使用容量更大的nandflash芯片。若片外存储器的接口与图8或图9所示存储器接口不同,则需要在fpga内实现一个存储接口适配器进行转换。在存储装置内写入全盘数据的流程包括:第一步,使用winhex软件获取sd卡的全盘数据。具体流程如下:1.将sd卡插入windows系统的pc机。2.以管理员身份打开winhex软件,在上方工具栏选择“工具->打开磁盘”。如图11。3.选择“物理磁盘->sd卡”,如图12。4.打开后可以看到全盘内容,右键点击第一个字节,点击“选块开始”,如图13。5.用“滚动条”下拉到最下面,右键最后一个字节,点击“选块结尾”,如图14。6.选中选块后,在上方工具栏点击“编辑->复制选块->置入新文件”,如图15。7.将文件命名为xxx.hex,保存,如图16。存储器的容量往往小于第一步中获取的数据文件的大小,但数据文件中除了前部分的有效数据,末尾大多数数据是0,因此可以先将文件裁剪到存储器的实际大小,然后用以下方式将文件中的数据写入存储器。第二步,若使用fpga模块的片内rom,则将获取的全盘数据转换成verilog描述的rom。第三步,若使用fpga模块的片外flash存储器是直插封装的芯片,或只写入一次(例如在产品量产阶段且不需要在线更新),则使用flash烧写座将全盘数据写入存储器。第四步,若使用fpga模块的片外flash存储器是贴片封装,且需要写入多次(例如处于调试阶段,或在产品使用阶段需要进行在线更新),则使用如图17的切换电路写入。其中,切换电路包括烧写控制逻辑电路和mux;在写入时,mux切换到a口;在测试或运行时,mux切换到b口,嵌入式soc从写好的存储器中启动。如果测试出现问题,开发者可以通过uart查看调试信息,修改系统镜像后重新写入并测试。如果将链路定制为wifi等无线链路,还可以实现远程的在线系统更新,这是普通的sd卡不能完成的。综上所述,本申请提供的在嵌入式系统中使用fpga改进sd卡的方案,首先,将sdfake模块部署在fpga中,其功能相当于sd卡中的接口控制器,实现复杂的sd总线协议的处理;其次,给出灵活的存储器设计方案,其功能相当于sd卡中的flash存储阵列;最后,说明如何准备写入存储器的数据,以及如何写入存储器,以让soc能从fpga模拟的sd卡中启动。本申请捕获soc发送的sd总线命令并作为调试信息输出,若在开发阶段遇到sd卡不能识别等错误,开发者可以通过调试信息定位原因;使用fpga模拟sd卡,原先需要插在插槽中的sd卡被替换成了可以贴片在pcb上的fpga和flash芯片,规避了恶劣机械环境下插槽接触不良的隐患;本申请还可以定制存储器更新的物理链路,若使用wifi等无线链路,可以实现非接触式的系统更新。在一种可能的应用中,本申请在调试阶段可以为开发者带来便利。比如某个应用场景使用xilinxzynqxc7z020soc作为嵌入式主机。按正常流程制作好包含操作系统镜像的sd卡后,发现该sd卡无法使soc启动,且soc的uart没有打印任何信息。根据嵌入式开发的经验,出错的可能原因可能出现在从硬件到软件的任何一个地方:1.硬件错误,例如pcb设计问题、焊接问题。2.soc启动配置错误,可能没有配置为sd卡启动模式。3.soc不兼容这种版本的sd卡。4.soc不兼容sd卡中当前的文件系统。5.镜像制作的有问题,soc虽然能从sd卡中找到系统镜像,但启动时出错。由于soc没有通过uart返回任何信息,无法定位错误出现在哪一步,必须逐条排查问题;而且,经验不丰富的开发者可能想不到以上列出的所有可能性,即便排查完自己能想到的所有可能性后也没法定位问题。基于本申请,将调试接口发送的信息通过uart展示给开发者,硬件设计框图如图18。在嵌入式soc试图启动时,uart发送器打印了10条命令,这些命令是soc发送给fpga的sd总线命令,开发者可以对照《sdspecificationsversion2.00》逐条解读这些命令以定位问题,如表4:表4根据表4的解读,定位到问题出现在可能性4,经进一步查证,该sd卡被格式化为exfat,但该soc只支持fat16和fat32作为sd卡的文件系统,问题解决。由此可以看出本申请可以帮助嵌入式开发者定位有关sd卡的错误,加快开发进程。在另一种可能的应用中,本申请能够解决解决sd卡接触不良的隐患和无法进行在线系统更新的问题。比如,仓储机器人能够对货物完成自动分拣与归置,其中的嵌入式系统需要完成室内定位、rfid识别、视觉识别、运动控制等多种算法和操作,考虑到算法的复杂性和任务的多样性,往往需要对仓储机器人进行大批量的系统固件更新和应用更新,如果嵌入式处理器使用sd卡存储系统固件和应用,大批量的固件和应用更新会很麻烦。此外,仓储机器人运行时存在振动,使用sd卡会造成接触不良的隐患。使用本申请改进后的仓储机器人的嵌入式系统如图19。sd卡被使用fpga(alteraep4ce6e22,价格¥12)、并行口norflash(s29gl512p,价格¥11)和2.4g无线通信终端(nrf24l01,价格¥4)代替。这些元件可以与嵌入式soc设计在同一块pcb上,规避了振动带来的接触不良的隐患。s29gl512p的容量为64mb,足够存储仓储机器人的系统镜像+应用程序(约为20~50mb)。此外,当进行批量的系统更新时,可以在2.4g无线信号范围内通过nrf24l01来批量更新s29gl512p中的内容,解决了使用sd卡时不能批量更新的麻烦。综上所述,本申请提供的在嵌入式系统中使用fpga改进sd卡的方案,通过将sd卡用fpga代替,fpga可以焊接在pcb板上,避免了普通的sd卡必须插在卡槽中,在一些恶劣的机械环境,比如高频振动或高速旋转的环境下存在接触不良导致系统无法运行等问题,从而消除了机械振动带来的隐患。另外,通过记录sd总线上所有来自主机的请求和来自自身的响应,在调试阶段,开发者可以根据记录的信息尽早定位接口故障、启动异常、软件异常等问题的原因,解决了嵌入式主机的操作系统高度定制对硬件兼容性高,导致对开发和调试阶段的错误定位带来困难的问题。另外,由于开发者可以通过远程控制fpga的方式来更新虚拟sd卡的内容,从而解决了需要拔下sd卡改动其内容进行系统更新的方式不适用于非接触更新的应用场景的问题;同时,当更新进程被意外打断时,由于fpga的固件没有被破坏,重新启动后仍可以重新更新,从而解决远程控制下使用嵌入式主机本身来改动sd卡进行系统更新的方式无法应对意外情况,当更新进程因意外关机被打断时sd卡内容被损坏,无法启动并继续更新的问题。术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或隐含所指示的技术特征的数量。由此,限定的“第一”、“第二”的特征可以明示或隐含地包括一个或者更多个该特征。在本申请的描述中,除非另有说明,“多个”的含义是两个或者两个以上。上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器、磁盘或光盘等。以上所述仅为本申请的较佳实施例,并不用以限制本申请,凡在本申请的精神和原则之内所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1