sd_card_sec_read_write.v
上述为sd_card_sec_read_write中的输入输出信号。
①首先上电进入IDLE状态,sd_init_done为判断初始化是否完成的信号
当SD卡选择SPI模式,初始化时默认为一种时钟(SPI_LOW_SPEED_DIV),其余状态如读写或者CMD为另一种时钟(SPI_HIGH_SPEED_DIV)
②接下来进入CMD0状态,该状态主要是发送CMD0命令
首先来看(cmd_req_ack&~cmd_req_error) cmd_req_ack这个信号是由sd_card_cmd这个模块发出的cmd_req_ack信号,该信号在sd_card_cmd这个模块表示着进入了S_END状态,如果没有发现错误即收到了返回,则进入S_CMD8这个状态。判断cmd_req_error这个信号的原因是因为,在sd_card_cmd模块中如果没有收到正确的返回值进入S_ERROR状态,下一个时钟也会进入S_END,也会产生cmd_req_ack这个信号,so 需要判断cmd_req_error来判断是否进入过S_ERROR
③CMD8、CMD55、CMD41同理(表示着初始化已完成)
④CMD16:可以改变一次读写的长度。
⑤CMD_WAIT_WRITE_READ:
顶层如果有sd_sec_write或者sd_sec_read命令则进入对应的写模式或者读模式
⑥写状态
需要先进入CMD24这个状态,完成CMD24命令的写入(怎样判断命令写入完成呢,又是如何让sd_card_cmd这个模块来判断此时发送的是命令还是数据呢?答案在这:cmd_req,block_write_req,传送给sd_card_cmd这个模块(在这个模块中S_WAIT中有这样一段判断逻辑cmd_req==1’b1;state<=S_CMD_PRE,block_read_req==1’b1;state<=S_READ_WAIT,block_write_req==1’b1;state<=S_WRITE_TOKEN)),读状态同理。
再进行写操作,此时出现的信号block_write_req_ack为SD_CARD_CMD中输出的信号,它标志着已经完成一次写操作。
⑦读状态
需要先进入CMD17这个状态,完成CMD17命令的写入
再进行读操作,此时出现的信号block_read_req_ack为SD_CARD_CMD中输出的信号,它标志着已经完成一次读操作。
⑧完成读写,下一个状态
State=WAIT_WRITE_READ
继续进行读写操作。