特权同学

SDHC控制器代码移植日记二(SD_CMD_SERIAL_HOST)

0
阅读(3534)

3. SD_CMD_SERIAL_HOST模块

3.1 接口连接框图

 


图3

3.2 接口定义与说明

    //系统信号,时钟和复位

input SD_CLK_IN;    //输入时钟信号

input RST_IN;       //同步复位信号,高有效

    //连接到SD_CMD_MASTER模块

input [15:0] SETTING_IN;   //当前命令的设置定义

        /*SETTING_IN位描述:

            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表示无需响应

        */

input GO_IDLE;          //复位并返回IDLE状态,GO_IDLE信号用于复位该模块,并使其进入IDLE状态,退出当前传输。           

input [39:0] CMD_IN;    //待发送的命令

input REQ_IN;           //外部模块工作请求         

input ACK_IN;           //外部模块工作完成响应

output reg [39:0] CMD_OUT;  //命令答复

output ACK_OUT;         //该模块内部工作完成应答

output reg REQ_OUT;         //该模块内部数据传送请求

output reg [15:0] STATUS;   //模块的状态标志

        /*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

        */     

    //SD卡物理层CMD接口

input cmd_dat_i;        //SD卡CMD输入信号 

output reg cmd_out_o;       //SD卡CMD输出信号

output reg cmd_oe_o;        //SD卡CMD方向使能控制信号,0--input,1--output

 

    //连接到SD_DATA_SERIAL_HOST模块

output reg [1:0] st_dat_t;  //启动数据传输:01--启动块读;10--启动块写;11--停止

/*

该模块由6个逻辑块组成:FSM_COMBO,REG_SYNC,ACK_SYNC,COMMAND_DECODER,FSM_OUT,FSM_SEQ。

    FSM_COMBO--通过组合逻辑控制状态的迁移;

    FSM_SEQ--控制状态迁移;包括状态的复位;

    REQ_SYNC/ACK_SYNC--用于降低跨时钟域亚稳态的两级寄存器;

    COMMAND_DECODER--读SETTING_IN向量并存储设置和命令道内部寄存器(在FSM_OUT中被使用);

    FSM_OUT--状态机的输出逻辑。

*/

3.3 模块功能描述

         该模块与外部的SD/MMC卡直接通信,用于读或写命令到SD/MMC卡中。外部接口由clk(在其他模块驱动输出)和双向信号CMD两个信号组成。其中CMD信号由该模块输出的cmd_out_o,cmd_dat_i和cmd_oe_o三个信号来驱动。

         系统信号SD_CLK_IN和RST_IN为模块内部工作的时钟和复位信号(高电平有效)。GO_IDLE信号和RST_IN信号作用一样,在任意状态下将整个模块的工作状态复位到初始化。

         跨时钟域的数据通信通过两组REQ和ACK信号的握手进行同步。在外部模块发出工作请求之前,需要先给控制信号总线SETTING_IN和命令值总线CMD_IN赋值,然后可以发起一次工作请求,将REQ_IN置高,若干个时钟周期后,该模块会拉低ACK_OUT表示响应。模块内部的状态机会发送CMD_IN的命令给SD卡,同时根据SETTING_IN的要求做一些完成其他的一些工作要求,如开启CRC7校验并输出校验结果、写入命令后读取若干个bit的响应数据等。只要ACK_OUT处于高电平状态,模块内部锁存的SETTING_IN和CMD_IN的状态就不会改变。ACK_OUT保持低电平直到CMD传输周期结束。     当该模块有数据要传送时(如更新STATUS或CMD_OUT中的数据有效时),该模块在做其他任何操作之前,会置位REQ_OUT并等待外部模块的ACK_IN输入拉高。CMD_OUT即读取到得应答数据,从高位开始有效。STATUS信号表示了当前该模块的工作状态,用于外部模块执行相应的处理和监视。st_dat_t信号连接到SD_DATA_SERIAL_HOST模块(做数据读写的专门模块),用于指示数据读写操作的执行。

3.4 状态机工作图

 

图4

3.5 部分仿真说明

         如图5所示,简单的产生ACK_IN/SETTING_IN/CMD_IN等激励,仿真波形输出的cmd_out_o(包括CRC7校验结果)以及其他一些寄存器输出都正常。

 


图5