SDHC控制器代码移植日记三(SD_CMD_MASTER)
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
题记:
其实这个SDHC的移植已经完成了第一段落。看样子原作者是在ACTEL的器件上实现的,这下已经把所有相关的源代码在Cyclone II环境下通过综合了,内部的一些FIFO等都是重新生成的,源代码也都基本重新按特权个人的风格整合了一下。只是开始时做了两个模块的仿真,后面的就比较心急,也主要是抓住作者的思路来理解代码,还没有认真的验证。
但是做到这里,已经基本把握住了作者的设计思路,编译一下用了有2000多个LE,并且内嵌RAM的使用也超过了40Kbit。感觉有些失望,这样的资源占用率就快顶上一个经济型的NIOS II处理器了,而它给出的WISHBONE(当然在Altera器件中就移植成AVALONE总线)总线用于和处理器接口,对于软件开发来说其实就是初始化的过程和详细的读写存储细节被屏蔽了,而原本这些工作对软件来说充其量不过是几个子函数而已。这些工作量对应的却是付出一个准51单片机的价格,从成本上来说是极不划算的。那么对于这个有些“鸡肋”的SDHC控制器其实只能用于学习和练习,达不到真正意义上的实用。
离开大手大脚花钱甚至于没有成本概念的航天行业,特权同学越来越感觉到成本控制在产品研发上的重要性。对于一个产品,如何能让客户认可?单从产品本身来看(很多人为的因素不是这里讨论的重点),就特权同学个人的见解,无外乎产品的创新性(纯粹的技术)、可靠性和成本优势。创新性就是指别人的产品实现不了的功能你实现了,那么你的产品就牛,这就是卖点,如果这个功能是客户必须的,那么有时抬高价格也不愁卖不出去;可靠性,就是产品的质量好坏,它的重要性不言而喻,在军工领域和工业领域都是有讲究的;另外就是成本,军工领域是对成本最不敏感的(哎,总是有那么些人不拿纳税人的钱当钱),工业领域基本上是因项目而异,消费类是成本最敏感的。身处工控和消费夹缝中的特权同学也不得不多一份心在成本上下功夫。
虽然这个SDHC达不到预期的用处,但是特权同学既然已经重新整理了代码,那么就继续往下连载吧。
4.1接口连接框图
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
图6
4.2接口定义与说明
//系统信号
input CLK_PAD_IO; //时钟信号
input RST_PAD_I; //复位信号
//连接到SD_CONTROLLER_WB模块
input New_CMD; //新的命令输入
input [31:0] ARG_REG; //CMDA,Command argument
input [15:0] CMD_SET_REG; //命令设置寄存器
/* CMD_SET_REG位定义
bit15-14: 保留
bit13-8: CMDI,Command index
bit7-6: CMDW,Command word select
bit5: 保留
bit4: CICE,Command index check
bit3: CIRC,Command CRC check
bit2: 保留
bit1-0: RTS-Response type;0--no response,01--length136,1x--length48
*/
input [15:0] TIMEOUT_REG; //超时计数寄存器,操作等待超出这个寄存器值的系统时钟周期数后算作超时
output reg [4:0] ERR_INT_REG; //Error interrupt status reg
/* ERR_INT_REG位定义
bit15-4: 保留
bit3: CIE,Command index error
bit2: 保留
bit1: CCRC,Command CRC error
bit0: CTE,Command timeout
*/
output reg [15:0] NORMAL_INT_REG; //Normal interrupt status reg
/* NORMAL_INT_REG位定义
bit15: EI,Error interrupt.当Error interrupt status reg任意位置位,则该位拉高
bit14-1: 保留
bit0: CC,Command complete.当收到命令响应的最后一位时,该标志位拉高
*/
//连接SD_DATA_MASTER模块
input data_write; //数据写入命令,被锁存到settings[11]
input data_read; //数据读命令,被锁存到settings[12]
//连接到顶层逻辑处理
output reg [15:0] STATUS_REG; //Status reg
/* STATUS_REG位定义
bit15-12: CST,CMD host serial status
0--reset,1--write only(wo),2--write to read(w2r),
3--delay after w2r,4--delay after wo,5--read CMD
bit11-1: 保留
bit0: CICMD,Command inhibit;1--busy,0--ready
*/
output reg [31:0] RESP_1_REG; //Response reg,命令响应寄存器
input ERR_INT_RST; //错误中断寄存器复位,即将Error interrupt status reg清零
input NORMAL_INT_RST; //正常中断寄存器复位,即将Normal interrupt status reg清零
//连接到SD_CMD_SERIAL_HOST模块
output reg [15:0] settings; //输出给SD_CMD_SERIAL_HOST的设置信号
/* settings位描述:
bit[15]--1,保留
bit[14:13]--word select
bit[12]--block read
bit[11]--block write
bit[10:8]--timing values
bit[7]--CRC check ON/OFF
bit[6:0]--response size;即响应数据位宽,0表示无需响应
*/
output reg go_idle_o; //输出给SD_CMD_SERIAL_HOST使其进入复位
output reg [39:0] cmd_out; //待发送的命令
output reg req_out; //工作请求输出信号
output reg ack_out; //工作响应输出信号
input req_in; //工作请求输入
input ack_in; //工作响应输入
input [39:0] cmd_in; //待发送的命令
input [15:0] serial_status; //SD_CMD_SERIAL_HOST模块的状态标志
/* serial_status位描述
bit[15:7]--保留
bit[6]--data available,状态为DLY_WO或DLY_READ时该位置高
bit[5]--CRC valid
bit[4]--CMD state L/H
bit[3:0]--state:0001--WRITE_WR,0010--WRITE_WO,0011--DLY_WR,0100--DLY_WO,0101--READ_WR,0110--DLY_READ
*/
4.3模块功能描述
该模块对主机接口和物理层接口进行同步。执行以下三个主要的任务:
1,顶层SD卡控制器可访问的命令寄存器接口实现。
2,读取SD_CMD_HOST获得的响应信息,以及顶层可访问的寄存器读接口实现。
3,追踪SD_CMD_SERIAL_HOST模块的路径状态。
如果ARG_REG中有新的命令需要写入,则New_CMD有效。如果输入的命令是块读或块写操作,则data_write和data_read信号被置位。该模块读取CMD_SET_REG值,并送出有效的settings和cmd_out信号。然后初始化一次命令传输,该模块置位req_out,直到接收到ack_in信号。这段时间内req_out、settings和cmd_out信号值不会改变。当serial_status和/或cmd_in出现有效值,req_in将被置位,它由ack_out进行响应。如果发生超时,go_idle_o信号将被置位。内部很多寄存器都是在顶层的Wishbone总线上可以被读写的。
4.4状态机工作图
图7
用户377235 2012-12-11 15:11
用户1458803 2010-10-12 14:07