assign block_write_data = sdcard_write_data;
assign sdcard_read_data = block_read_data;
assign sdcard_read_valid = (state == sd_cmdread) && block_read_valid;
assign sdcard_read_end = (state == sd_read_end);
assign sdcard_write_end = (state == sd_write_end);
assign sdcard_write_data_req =(state == sd_cmdwrite)&& block_write_data_rd;
现在就刚看完的一段代码做一个总结发言。因为要用到sd卡做一些操作,因此自学这部分。简要介绍一下今天学到内容,就不赋图了。先就上面代码做一个说明,sdcard_write_data为外部要写入sd卡的数据,block_write_data为sd卡内部流转的数据,其实来讲在端口定义时,直接赋值也行。 block_read_data为内部数据,sdcard_read_data为用户要读取的数据,sdcard_read_valid这个信号是告诉外部的设备或者程序,我的这个数据可以用了,你来读吧,其实如果你要存入FIFO或者ram、ddr中,这个就是你的写使能, sdcard_read_data就是你要写入进去的数据。一个使能信号对应一个数据;block_read_valid这个呢,是内部的数据有效信号,因为只有当当前为读状态,且当前数据是有效的,才能拉高外部的这个有效信号,sdcard_read_end 和sdcard_write_end 就不用多说了,就是当读完或者写完了就去拉高这两个信号。sdcard_write_data_req这个信号是内部发出的写请求信号,请求外部写入数据,因为内部不够512个数据,所以就要外部输入数据。
sd_cmd0 :
begin
if(block_cmd_req_ack && ~block_cmd_error)
begin
state <= sd_cmd8;
block_cmd_req <= 1'b0;
end
else
begin
block_cmd_req <= 1'b1;
block_data_len <= 16'd0;
block_cmd_response <= 8'h01;
block_cmd <= {8'h00,8'h00,8'h00,8'h00,8'h00,8'h95};
end
end
这一段是cmd0命令的操作符,可从中看到block_cmd,block_cmd_response,这两个信号,即命令和它的回应,而且只有当给出的命令有回应而且跟当前的sd卡相符合时,2.0,1.0.还是MMC卡,我用的是2.0的卡。这一部分就这样。