Skip to content
Snippets Groups Projects
Commit 96c3f4eb authored by Jumbo's avatar Jumbo
Browse files

sd interface correction

parent 7e01a0b9
No related branches found
No related tags found
No related merge requests found
......@@ -32,8 +32,8 @@ logic [7:0] sd_cmd_message [6], sd_cmd_message_next[6];
logic [10:0] counter,counter_next;
logic c_reset;//c_continue;
logic sd_clk_tog;
logic sd_cmd_in, sd_dat_in;
//logic sd_clk_tog;
logic sd_cmd_in, sd_dat_in, sd_cmd_in_next;
//logic [3:0] sd_dat_buffer;
///logic sd_cmd_reg_output;
logic [47:0]reg_48,reg_48_next;
......@@ -89,6 +89,7 @@ always_ff @(posedge CLK) begin
sd_cmd_message[i] <= 8'b0;
end
interface_status <= 0;
sd_cmd_in <= 1;
end else begin
state <= state_next;
reg_48 <= reg_48_next;
......@@ -98,6 +99,7 @@ always_ff @(posedge CLK) begin
sd_cmd_message[i] <= sd_cmd_message_next[i];
end
interface_status <= interface_status_next;
sd_cmd_in <= sd_cmd_in_next;
end
end
......@@ -111,27 +113,29 @@ end
always_comb begin
for (int i=0;i<6;++i) begin
sd_cmd_message_next[i] <= sd_cmd_message[i];
sd_cmd_message_next[i] = sd_cmd_message[i];
end
sd_readdata = 32'hCCCC;
c_reset = 1'b0;
//sd_clk_tog = 0;
for (int i=0;i<128;++i) begin
dataBuffer_next[i] <= dataBuffer[i];
dataBuffer_next[i] = dataBuffer[i];
end
counter_next = counter;
state_next = state;
sd_cmd_in_next = sd_cmd_in;
reg_48_next = reg_48;
reg_8_next = reg_8;
interface_status_next = interface_status;
interface_command_mes = 3'b0;
sd_cmd_in = 1; //set cmd line to output
//sd_cmd_in = 1; //set cmd line to output
sd_dat_in = 1; //set data line to input
//SD_CLK_next = SD_CLK;
sd_clk_tog = 0;
SD_CLK_next = 1;
//sd_clk_tog = 0;
......@@ -180,10 +184,10 @@ always_comb begin
//state case
case (state)
Init : begin
sd_cmd_in = 0; //set cmd line to output
sd_cmd_in_next = 1;
sd_dat_in = 1; //set data line to input
SD_CLK_next = 1;
sd_clk_tog = 0;
//sd_clk_tog = 0;
//SD_CMD = 1;
//SD_DAT = 0;
if (interface_command_mes == 3'b111) begin
......@@ -199,47 +203,53 @@ always_comb begin
3'b001: begin
//send message routine
c_reset = 1;
sd_clk_tog = 1;
SD_CLK_next = 0;
//sd_clk_tog = 1;
//sd_cmd_reg_load = 1;
//sd_cmd_reg_input = sd_cmd_message [0];
reg_48_next = {sd_cmd_message[0],sd_cmd_message[1],sd_cmd_message[2],
sd_cmd_message[3],sd_cmd_message[4],sd_cmd_message[5]};
state_next = Send_cmd;
sd_cmd_in_next = 0;
interface_status_next = 2'b00;
end
3'b010: begin
//receive cmd state
c_reset = 1;
sd_clk_tog = 1;
//sd_clk_tog = 1;
//sd_cmd_rec_shift = 1;
SD_CLK_next = 0;
state_next = Receive_cmd;
interface_status_next = 2'b00;
end
3'b011: begin
//read data state
c_reset = 1;
sd_clk_tog = 1;
//sd_clk_tog = 1;
SD_CLK_next = 0;
state_next = Read_data_0;
interface_status_next = 2'b00;
end
3'b100: begin
//toggle 8 SD_CLK
c_reset = 1;
sd_clk_tog = 1;
//sd_clk_tog = 1;
SD_CLK_next = 0;
state_next = Dummy_clk;
interface_status_next = 2'b00;
end
3'b101: begin
c_reset = 1;
sd_clk_tog = 1;
//sd_clk_tog = 1;
SD_CLK_next = 0;
state_next = Dummy_clk2;
interface_status_next = 2'b00;
end
3'b110: begin
//probe read
c_reset = 1;
sd_clk_tog = 1;
//sd_clk_tog = 1;
SD_CLK_next = 0;
state_next = Receive_cmd_probe_0;
interface_status_next = 2'b00;
end
......@@ -249,55 +259,73 @@ always_comb begin
Send_cmd: begin
//sd_clk_tog = 1;
sd_cmd_in = 0; //set cmd line to output
//sd_cmd_in = 0; //set cmd line to output
counter_next = counter + 1;
if (counter[0])
if (counter[0]) begin
reg_48_next = {reg_48[46:0],1'b0};
SD_CLK_next = 0;
end else
SD_CLK_next = 1;
if (counter == 11'b00001011111) begin
c_reset = 1;
state_next = Idle;
interface_status_next = 2'b01;
sd_cmd_in_next = 1;
SD_CLK_next = 1;
end else begin
state_next = Send_cmd;
sd_clk_tog = 1;
//sd_clk_tog = 1;
end
end
Receive_cmd: begin
sd_cmd_in = 1; // set cmd line to be input
//sd_cmd_in = 1; // set cmd line to be input
counter_next = counter + 1;
if (counter[0]) begin
reg_8_next = {reg_8[6:0],SD_CMD};
end
SD_CLK_next = 0;
end else
SD_CLK_next = 1;
if (counter == 11'b00000001111) begin
c_reset = 1;
state_next = Idle;
interface_status_next = 2'b01;
SD_CLK_next = 1;
end else begin
//sd_cmd_rec_shift = 1;
state_next = Receive_cmd;
sd_clk_tog = 1;
//sd_clk_tog = 1;
end
end
Receive_cmd_probe_0: begin
counter_next = counter + 1;
sd_cmd_in = 1; // set cmd line to be input
sd_clk_tog = 1;
//sd_cmd_in = 1; // set cmd line to be input
//sd_clk_tog = 1;
if (counter[0])
SD_CLK_next = 0;
else
SD_CLK_next = 1;
//sd_cmd_rec_shift = 1;
state_next = Receive_cmd_probe_1;
end
Receive_cmd_probe_1: begin
counter_next = counter + 1;
sd_cmd_in = 1; // set cmd line to be input
sd_clk_tog = 1;
//sd_cmd_in = 1; // set cmd line to be input
//sd_clk_tog = 1;
if (counter[0])
SD_CLK_next = 0;
else
SD_CLK_next = 1;
reg_8_next = {reg_8[6:0],SD_CMD};
if (counter >= 11'b00100111111) begin
c_reset = 1;
state_next = Init;
interface_status_next = 2'b11;
SD_CLK_next = 1;
end else if (SD_CMD) begin
state_next = Receive_cmd_probe_0;
end else begin
......@@ -306,15 +334,25 @@ always_comb begin
end
Receive_cmd_probe_2: begin
counter_next = counter + 1;
sd_cmd_in = 1; // set cmd line to be input
sd_clk_tog = 1;
//sd_cmd_in = 1; // set cmd line to be input
//sd_clk_tog = 1;
if (counter[0])
SD_CLK_next = 0;
else
SD_CLK_next = 1;
//sd_cmd_rec_shift = 1;
state_next = Receive_cmd_probe_3;
end
Receive_cmd_probe_3: begin
counter_next = counter + 1;
sd_cmd_in = 1; // set cmd line to be input
sd_clk_tog = 1;
//sd_cmd_in = 1; // set cmd line to be input
//sd_clk_tog = 1;
if (counter[0])
SD_CLK_next = 0;
else
SD_CLK_next = 1;
reg_8_next = {reg_8[6:0],SD_CMD};
if ((!SD_CMD) || (counter >= 11'b00100111111)) begin
......@@ -322,6 +360,7 @@ always_comb begin
c_reset = 1;
state_next = Init;
interface_status_next = 2'b11;
SD_CLK_next = 1;
end else begin
state_next = Receive_cmd;
counter_next = 11'b00000000100;
......@@ -331,12 +370,16 @@ always_comb begin
end
end
Read_data_0: begin
sd_clk_tog = 1;
//sd_clk_tog = 1;
SD_CLK_next = 1;
state_next = Read_data_1;
end
Read_data_1:begin
sd_clk_tog = 1;
//sd_clk_tog = 1;
SD_CLK_next = 0;
if (SD_DAT) begin
state_next = Read_data_0;
end else begin
......@@ -346,6 +389,10 @@ always_comb begin
Read_data:begin
counter_next = counter + 1;
if (counter[0])
SD_CLK_next = 0;
else
SD_CLK_next = 1;
if (counter[0]) begin
dataBuffer_next[counter[10:4]][{(counter[3:2]),~counter[1],2'b11}] = SD_DAT[3];
dataBuffer_next[counter[10:4]][{(counter[3:2]),~counter[1],2'b10}] = SD_DAT[2];
......@@ -356,41 +403,52 @@ always_comb begin
c_reset = 1;
state_next = Idle;
interface_status_next = 2'b01;
SD_CLK_next = 1;
end else begin
state_next = Read_data;
sd_clk_tog = 1;
//sd_clk_tog = 1;
end
end
Dummy_clk: begin
counter_next = counter + 1;
if (counter[0])
SD_CLK_next = 0;
else
SD_CLK_next = 1;
if (counter == 11'b00000001111) begin
c_reset = 1;
state_next = Idle;
interface_status_next = 2'b01;
SD_CLK_next = 1;
end else begin
state_next = Dummy_clk;
sd_clk_tog = 1;
//sd_clk_tog = 1;
end
end
//default : /* default */;
Dummy_clk2: begin
counter_next = counter + 1;
if (counter[0])
SD_CLK_next = 0;
else
SD_CLK_next = 1;
if (counter == 11'b00000110001) begin
c_reset = 1;
state_next = Idle;
interface_status_next = 2'b01;
SD_CLK_next = 1;
end else begin
state_next = Dummy_clk2;
sd_clk_tog = 1;
//sd_clk_tog = 1;
end
end
endcase
if (sd_clk_tog)
SD_CLK_next = ~SD_CLK;
else
SD_CLK_next = SD_CLK;
// if (//sd_clk_tog)
// SD_CLK_next = ~SD_CLK;
// else
// SD_CLK_next = SD_CLK;
end
/*
reg_48 sd_cmd_register(.Clk(CLK),.SD_CLK(SD_CLK),.Reset(RESET),.Shift_In(1'b0),.Load(sd_cmd_reg_load),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment