diff --git a/final_sd_interface.sv b/final_sd_interface.sv index be9dd77879550c639b795d4f8869e9506666b2a9..badecb2b7c4019ebf763c92de6340ce92d053b8d 100644 --- a/final_sd_interface.sv +++ b/final_sd_interface.sv @@ -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),