用SD卡设计8086全硅计算机的硬盘
扫描二维码
随时随地手机看文章
8086 CPU[1]全硅计算机,而由于8086 CoC高度集成性,传统的机械硬盘已不适合。采用嵌入式的存储设备,例如固态硬盘(Solid-State Disk)利用Flash芯片作为存储介质,符合ATA[2]/SATA/SCSI等接口传输协议。固态硬盘设计最大的障碍就是设计过程复杂,用闪存(Flash Memory)芯片作为核心存储介质的固态硬盘需要设计复杂的控制器[3]。为了简化设计的复杂性又兼顾固态硬盘的优点,本设计采用SD卡(Secure Digital Card)作为8086 CoC的硬盘。因为SD卡是基于闪存的存储卡,具有固态硬盘的特性,安全性高、容量大、性能佳、环境适应性好等优点。采用SD卡作为8086 CoC的硬盘可避免设计复杂的硬盘控制器。
1 硬件设计
8086 CoC系统采用AMBA双总线结构,高速设备如内存(SDRAM)、显卡(VGA)等通过AHB总线与CPU进行数据交换,而低速设备则经由APB总线(Advanced Peripheral Bus)与CPU通信。SD卡作为8086 CoC的硬盘属于低速I/O,因此SD卡是挂接在APB总线上。SD卡接口可以插入SD卡作为类似硬盘的大容量存储设备使用,CPU通过APB总线对SD卡的数据进行操作。APB总线与SD卡连接的转换接口是本文硬件设计的重点,8086 CoC体系架构图如图1所示。
1.1 APB接口简介
APB总线是AMBA总线的外围总线,有关于APB总线协议可以参照AMBATM Specification(Rev2.0)。SD卡作为I/O挂接在APB的从主机口上,CPU要对I/O设备访问,必须对I/O设备分配地址,本设计为SD卡分配的地址(只要与其他端口不冲突,地址可任选)是100H和101H(H为16进制)分别为SD卡的数据端口与片选端口。CPU对SD卡进行访问时,CPU地址总线传送APB总线的地址为100H或101H。此时,APB总线通过自身内部的译码器使对应的从主机口有效,对应的从机设备被选中、SD卡I/O设备也被选中时,SD卡就可以与主机进行数据通信。
1.2 SD卡接口简介
SD卡的工作模式分别是SD模式和SPI模式[4],本设计采用SPI模式。SD卡的SPI模式设备使用SD卡协议的子协议和部分指令。SPI模式的优势在于可以使用标准主机,从而把外设减少到最低。表1所示为采用SPI模式下的SD卡的端口定义。
SPI模式是串行数据传输,而SD卡是挂接在APB的从口上的I/O设备,APB是并行数据,要使APB数据与SD卡的数据匹配,必须对APB数据进行转换,转换为符合SPI模式下的数据格式。
1.3 SD卡转换接口的设计
主机通过APB总线发送和接收的数据是1个字节(8位)的并行数据,而SD卡发送给主机设备的是串行数据,1个字节(8位)为1个数据单位。SD卡每次发送和接收串行数据是以SCLK为采样时钟,每次上升沿为1次采样数据,因此1次完整的数据采样需要8个SCLK时钟周期。SD卡被访问期间的片选信号CS一直要保持为有效低电平。SD卡转换接口的设计关键是:(1)APB总线的并行数据要转换成符合SPI协议规范的串行数据;(2)SD卡发送的串行数据转换成APB总线能够接收的并行数据;(3)产生正确采样时钟信号SCLK和片选信号CS。图2所示为SD卡转换接口模块的框图。
片选信号由APB数据线的高位控制:当APB总线的高位输出为低电平时,SS信号为低电平,SD卡被选中;当APB总线的高位输出为高电平时,SS信号为高电平,SD卡不被选中。APB总线的高位数据产生是通过软件编程实现。并串转换器作用是:首先将APB总线输出并行数据存储到一组移位寄存器,然后移位寄存器的数据被移位成串行数据,串行转换器就是并串转换器反过程。采样时钟发生器作用是:采样时钟的上升沿应在每一位串行数据中央,以确保采样时钟能够采样到正确的数据。
采用Verilog HDL硬件描述语言对SD卡转换接口模块进行设计,用modelsim6.1f 对该模块在8086 CoC系统平台进行仿真和调试。为了测试硬件接口,通过编写基于8086CPU的汇编程序,使CPU执行相应的汇编指令对SD卡进行操作,实验证明SD卡转接口的数据端口信号的仿真波形满足SPI协议规范。
2 SD卡的软件编程及功能调试
SD卡的配置、读写和擦除是通过主机给SD卡发送相应的执行命令,主机给SD卡发送命令通过软件控制来实现。SD卡的所有命令都有固定的格式,由6个字节组成:起始位、传输位、命令索引、参数、CRC和结束位。表2所示为SD卡的命令格式。复位命令CMD0:起始位为0、传输位为1、命令索引为0、CRC为固定值1001010、结束位为1。即CMD0的格式为40H00H00H00H00H95H(H为16进制)。
2.1 SD卡的初始化
本文设计了APB总线的SD卡硬件转换接口,通过BIOS软件编程实现访问SD卡软件。用软件控制的方式给SD卡发送命令,使SD卡完成初始化。SD卡初始化有2个目的:使SD卡工作于SPI接口模式、设置单块读写的数据长度。SD卡上电复位后处于SD总线模式,要使SD卡进入SPI接口模式,需要在片选信号CS为低电平时发送命令CMD0。由于SD卡在收到CMD0前处于SD总线模式,因此CMD0是唯一需要正确冗余校验的命令。发送CMD0命令后,接收Rl回应,判断SD卡是否正确接收命令。
CMD0命令使SD卡进入休眠状态,需要发送CMDl激活SD卡的初始化过程,随后接收Rl回应,判断SD卡是否正确脱离休眠状态。
为了实现对SD卡的读写操作,必须设定读写块的大小。SD卡内部结构是按照每块512字节组成的,可以对1块或者是多块进行读写,为了和8086CoC的硬盘结构一致,设定为单块读写。给出内嵌在BIOS当中初始化的(基于Emu8086)汇编程序。
……
// Initialize the SD card controller
mov al, 0ffh
mov dx, 0100h ;选中SD卡接口
mov cx, 0ah ;计数10次
hd_post_init80: ;循环10次给SD卡80个sclk, SD卡上电的过程至少要74个时钟周期
out dx, al
loop hd_post_init80
// CMD0: reset the SD card
mov ax,40h ;命令CMD0,ax寄存器高位为0,所以CS=0,SD卡片选有效
out dx, ax
xor al, al ;寄存器清0
out dx, al ;发送CMD0其他位
out dx, al
out dx, al
out dx, al
mov al, 95h ;
out dx, al ; CRC fixed value
mov al, 0ffh
out dx, al ; wait
in al, dx ; status
mov cl, al
mov ax, 0ffffh
out dx, ax ; CS=1
cmp cl, 01h ;判断响应是否为01h
je hd_post_cmd1 ;响应正确则发送CMD1,激活SD卡。
……
当SD卡初始化完成以后,就可以对SD卡进行读写操作。读SD卡的命令是CMD17;写SD卡的命令是CMD24。这2个命令都带有参数,参数是第8~39,共32位,参数表示的必须是SD卡扇区的首地址,读写SD卡以1个扇区512字节为数据单位(与硬盘相同)。
2.2 SD卡的调试
采用SD卡作为8086 CoC的硬盘,而没有采用固态硬盘,就是为简化设计,避开设计复杂固态硬盘控制器。但用SD卡作为8086 CoC系统的硬盘,调试是实验难点。因为SD卡是复杂存储器,有自己的命令集,要找到SD卡的仿真模型几乎不可能,而通过Verilog HDL硬件描述语言对SD卡的功能建立模型进行SD卡功能仿真,其复杂性将会更大。为了简化设计,不采用通过SD卡模型在Modelsim中进行仿真,而是把设计直接综合到FPGA板上进行板级仿真。根据实验已有的条件,AlteraDE2开发板核心器件是Cyclone II系列的EP2C35F672C6[5]FPGA。用Quartus II将综合8086 CoC生成的SOF文件通过JTAG电缆下载到DE2开发板上,把SD卡插入DE2开发板的SD卡插槽,进行SD卡的调试。
为了测试SD卡能否接收到主机的数据,有效办法是检测SD卡对每条命令是否响应,达到命令响应将SD卡接口信号输出到逻辑分析仪进行观察的目的。但逻辑分析仪在使用观察响应波形需要一些触发条件(其观察数据深度是有限的),而SD卡接收和发送的数据是串行数据,因此要看到所有信号完整的波形是不可能的。为了解决这个问题,可采用软硬件相结合的调试方法,即SD卡每条命令的响应可在软件编程设计程序断点办法,如初始化程序中在CMD0命令的后面加上如下断点程序。
mov ax,0h
mov ds,ax ;目标基地址为0
mov bx,0500h ;偏移地址
mov al,00h ; al寄存器写入0,可根据需要给al不同的值
mov ds:[bx],al ; 把al的值写入地址为500h内存单元
这样就可以通过主机的地址(等于500h)作为逻辑分析仪的触发条件。在每条命令中设置这样的断点,通过这些设置的断点作为逻辑分析仪的触发条件可以观测每条命令发送情况。
即使没有逻辑分析仪,也可以通过断点程序法在某一确定内存写入一些特殊的值,然后同样用Altera DE2开发板提供(DE2_contorl_panel)软件把内存值读出来与写入的值进行比较。如果内存写入的值与断点程序写入的值相同,则证明命令得到了正确响应。
验证完成SD卡初始化以后,就可以对SD卡进行读写。在写SD卡调试中:设定写命令的地址参数,在参数对应的地址单元向SD卡写入一些特殊的值,然后通过WINHEX软件去查看SD卡在该地址的数据是否与写入的数据相同。在读SD卡调试中:设定读命令的地址参数,把SD卡的某一确定地址存储单元的数据读取到确定内存单元中,通过Altera DE2开发板提供软件把该内存的数据读出来与SD卡的原来存储的数据进行比较。
此调试法并不是一定要执行,当只有SD卡不能正常读写时,可以用此方法进行调试,分析每条命令的执行情况。实验证明该方法非常有效,通过本设计提出的SD卡作为8086 CoC的硬盘设计取得了成功。图3所示为SD卡转换接口信号初始化过程中发送CMD0命令波形图。
3 FPGA的验证结果
采用Quartus II对所设计的SD卡转换接口在Cyclone II系列的EP2C35F672C6 FPGA进行综合,综合报告显示总逻辑单元46个,总寄存器数30个,时钟频率高达420 MHz,综合报告表明设计占用的逻辑资源非常少。FPGA验证显示把8086 CoC的BIOS软件存入SD卡硬盘,通过SD卡作为引导区可启动8086 CoC的DOS操作系统。
本文以SD卡作为8086CoC的硬盘设计为例,介绍了SD卡作为大容量存储器的设计方法。采用SD卡作为大容量存储器可以减少设计的复杂性、缩短设计周期。并且由于SD卡的许多优点可使得系统工作稳定、提高数据存储的安全性。虽然SD卡本身的数据传输速率有上限,数据的读写速度受到一定的限制,但这些可以通过更高读写速度的SD卡来解决。同时,本设计具有高可移植性,可以方便地移植到其他需要大容量存储器的嵌入式系统中,只需在软件操作系统嵌入关于访问SD卡的软件程序,无需修改已设计好的硬件电路,减少了电路设计的成本。