input in_sd_clk;//clock for sd card
input hrst_n;//ahb signal
input in_soft_reset;//software reset
input [3:0] in_sd_data;//data input drom sd card
input [31:0] sd_fifo_rdata;//parallel data from tx fifo
input [3:0] in_current_state;//current state of data fsm
input [3:0] in_next_state;//next state of data fsm
input in_data_width;//data width 1:4bit 0:1bit
input [3:0] in_send_crc_counter;//has sent crc bits
input [13:0] in_has_send_bit;//has sent data bits
input [1:0] in_interval_counter;//time interval 数对面crc
input in_high_speed_clk;
output [3:0] out_serial_data;//original serial output data
output sd_fifo_re;//tx fifo read enable
output out_crc_status_wrong;//crc status wrong flag
output [3:0] out_data_dir;//data direction 1:send
output [3:0] out_data_half_delay;//serial output data to sd card
always @(posedge in_sd_clk or negedge hrst_n) begin
if(!hrst_n) begin
shift_reg0 <=32'b0;
out_serial_data <=4'b1111;
crc_status_reg <=4'b0;
crc_shift_reg0 <=16'b0;
crc_shift_reg1 <=16'b0;
crc_shift_reg2 <=16'b0;
crc_shift_reg3 <=16'b0;
end
elseif(!in_soft_reset)
begin
shift_reg0 <=32'b0;
out_serial_data <=4'b1111;
crc_status_reg <=4'b0;
crc_shift_reg0 <=16'b0;
crc_shift_reg1 <=16'b0;
crc_shift_reg2 <=16'b0;
crc_shift_reg3 <=16'b0;
end
else
begin
if(!in_data_width)
begin
if(in_current_state == `DATA_STATE_SEND_START_BIT)//send start bit
out_serial_data[0]<=1'b0;elseif(in_current_state == `DATA_STATE_SEND)
begin
//每32个bit,重新赋一个值(从fifo中读出得到)if(in_has_send_bit[4:0]==5'b0){out_serial_data[0],shift_reg0}<={sd_fifo_rdata_tp,1'b0};else{out_serial_data[0],shift_reg0}<={shift_reg0,1'b0};//向左移位输出,并行转串行
end
elseif(in_current_state == `DATA_STATE_SEND_CRC)
begin
if(in_send_crc_counter ==0){out_serial_data[0],crc_shift_reg0}<={crc_reg0,1'b0};else{out_serial_data[0],crc_shift_reg0}<={crc_shift_reg0,1'b0};
end
elseif(in_current_state == `DATA_STATE_SEND_END_BIT)
begin
out_serial_data[0]<=1'b1;
end
//DATA_STATE_RECEIVE_CRC_STATUS 这里sd 数据线的方向变化,变为接收crc_statuselseif(in_current_state == `DATA_STATE_RECEIVE_CRC_STATUS)
begin
crc_status_reg <={crc_status_reg[2:0], in_sd_data[0]};
end
elseif(in_current_state == `DATA_STATE_WAIT_SEND)
begin
crc_status_reg <=4'b0;
end
end
else
begin
if(in_current_state == `DATA_STATE_SEND_START_BIT)
out_serial_data <=4'b0;elseif(in_current_state == `DATA_STATE_SEND)
begin
if(in_has_send_bit[2:0]==3'b0){out_serial_data,shift_reg0}<={sd_fifo_rdata_tp,4'b0};else{out_serial_data,shift_reg0}<={shift_reg0,4'b0};
end
elseif(in_current_state == `DATA_STATE_SEND_CRC)
begin
if(in_send_crc_counter ==0)
begin
{out_serial_data[3],crc_shift_reg3}<={crc_reg3,1'b0};{out_serial_data[2],crc_shift_reg2}<={crc_reg2,1'b0};{out_serial_data[1],crc_shift_reg1}<={crc_reg1,1'b0};{out_serial_data[0],crc_shift_reg0}<={crc_reg0,1'b0};
end
else
begin
{out_serial_data[3],crc_shift_reg3}<={crc_shift_reg3,1'b0};{out_serial_data[2],crc_shift_reg2}<={crc_shift_reg2,1'b0};{out_serial_data[1],crc_shift_reg1}<={crc_shift_reg1,1'b0};{out_serial_data[0],crc_shift_reg0}<={crc_shift_reg0,1'b0};
end
end
elseif(in_current_state == `DATA_STATE_RECEIVE_CRC_STATUS)
begin
crc_status_reg <={crc_status_reg[2:0],in_sd_data[0]};
end
elseif(in_current_state ==`DATA_STATE_WAIT_SEND)
crc_status_reg <=4'b0
end
end
end
always @(*) begin
sd_fifo_re =1'b0;if(!in_data_width)
begin
if(((in_current_state == `DATA_STATE_SEND_START_BIT)&&(in_has_send_bit[4:0]==5'b0))||((in_current_state == `DATA_STATE_SEND)&&(in_next_state == `DATA_STATE_SEND)&&(in_has_send_bit[4:0]==5'b11111)))
sd_fifo_re =1'b1;
end
else begin
if(((in_current_state == `DATA_STATE_SEND_START_BIT)&&(in_has_send_bit[2:0]==3'b0))||((in_current_state == `DATA_STATE_SEND)&&(in_next_state == `DATA_STATE_SEND)&&(in_has_send_bit[2:0]==3'b111)))
sd_fifo_re =1'b1;
end
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
8.crc16的状态
crc16的状态为3bit数,由crc_status_reg 决定,010表示正常
always @(*) begin
out_crc_status_wrong =1'b0;if((in_current_state == `DATA_STATE_SEND_BUSY)&&!(crc_status_reg ==4'b0010))
out_crc_status_wrong =1'b1;
end