⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd_cmd_master.v

📁 SD卡控制器IP. 兼容SD卡协议2.0。与wishbone bus 接口
💻 V
字号:
`include "SD_defines.v"module SD_CMD_MASTER(input CLK_PAD_IO,input SD_CLK_I,input RST_PAD_I,input New_CMD,input data_write,input data_read,input cmd_dat_i,output cmd_out_o,output  cmd_oe_o,input [31:0]ARG_REG,input [15:0]CMD_SET_REG,input [15:0] TIMEOUT_REG,output reg [15:0] STATUS_REG,output reg [31:0] RESP_1_REG,output reg [15:0] ERR_INT_REG, output reg [15:0] NORMAL_INT_REG, input  [7:0] CLK_DIVIDER,output [1:0] st_dat_t);//`define dat_ava status[6]`define crc_valid status[5] `define small_rsp 7'b0101000`define big_rsp 7'b1111111`define CMDI CMD_SET_REG[13:8]`define WORD_SELECT CMD_SET_REG[7:6]`define CICE CMD_SET_REG[4]`define CRCE CMD_SET_REG[3]`define RTS CMD_SET_REG[1:0]`define CTE ERR_INT_REG[0]`define CCRCE ERR_INT_REG[1]`define CIE  ERR_INT_REG[3]`define EI NORMAL_INT_REG[15]`define CC  NORMAL_INT_REG[0]`define CICMD STATUS_REG[0]             //-----------Types--------------------------------------------------------reg CRC_check_enable;reg index_check_enable;reg [6:0]response_size;reg go_idle_o;reg [15:0] settings;reg [39:0] cmd_out;reg req_out;reg ack_out;wire req_in;wire ack_in;wire [39:0] cmd_in;wire [15:0]serial_status;reg [15:0]status;reg [15:0]  Watchdog_Cnt;reg complete;parameter SIZE = 3;reg [SIZE-1:0] state;reg [SIZE-1:0] next_state;parameter IDLE   =  3'b001;parameter SETUP   =  3'b010;parameter EXECUTE  =  3'b100;//---------------Input ports---------------CMD_SERIAL_HOST CMD_SERIAL_HOST_1(  .SD_CLK_IN (SD_CLK_I),   .RST_IN  (RST_PAD_I),   .SETTING_IN (settings),  .GO_IDLE (go_idle_o),   .CMD_IN (cmd_out),  .REQ_IN (req_out),  .ACK_IN (ack_out),  .REQ_OUT (req_in),   .ACK_OUT (ack_in),  .CMD_OUT (cmd_in),  .STATUS (serial_status),  .cmd_dat_i  (cmd_dat_i),  .cmd_out_o (cmd_out_o),  .cmd_oe_o ( cmd_oe_o),  .st_dat_t (st_dat_t));reg ack_in_int;always @ (posedge CLK_PAD_IO or posedge RST_PAD_I   )begin  if (RST_PAD_I) begin       ack_in_int<=0; end else begin  ack_in_int<=ack_in;end    endalways @ ( state or New_CMD or complete or ack_in_int )begin : FSM_COMBO    next_state = 0; case(state) IDLE:   begin      if (New_CMD) begin          next_state = SETUP;      end           else begin         next_state = IDLE;      end    end        SETUP:begin    if (ack_in_int)                    next_state = EXECUTE;       else          next_state = SETUP;   end   EXECUTE:    begin       if (complete) begin          next_state = IDLE;      end           else begin         next_state = EXECUTE;      end end             default : next_state  = IDLE;  endcase     end  always @ (posedge CLK_PAD_IO or posedge RST_PAD_I   )begin : FSM_SEQ  if (RST_PAD_I ) begin    state <= #1 IDLE; end  else begin    state <= #1 next_state; endendalways @ (posedge CLK_PAD_IO or posedge RST_PAD_I   )begin   if (RST_PAD_I ) begin     CRC_check_enable=0;    complete =0;    RESP_1_REG = 0;     ERR_INT_REG =0;    NORMAL_INT_REG=0;    STATUS_REG=0;    status=0;     cmd_out =0 ;    settings=0;    response_size=0;    req_out=0;    index_check_enable=0;     ack_out=0;     Watchdog_Cnt=0;        `CCRCE=0;    `EI = 0;    `CC = 0;      go_idle_o=0;   end  else begin complete=0; case(state) IDLE: begin    go_idle_o=0;      req_out=0;		ack_out =0;		`CICMD =0;     if ( req_in == 1) begin     //Status change        status=serial_status;        ack_out = 1;        STATUS_REG[15:12] =serial_status[3:0];            end end SETUP:  begin          NORMAL_INT_REG=0;      ERR_INT_REG =0;     STATUS_REG =0;     index_check_enable = `CICE;      CRC_check_enable = `CRCE;        if ( (`RTS  == 2'b10 ) || ( `RTS == 2'b11)) begin      response_size =  7'b0101000;     end    else if (`RTS == 2'b01) begin      response_size = 7'b1111111;     end        else begin       response_size=0;    end            cmd_out[39:38]=2'b01;             cmd_out[37:32]=`CMDI;  //CMD_INDEX    cmd_out[31:0]= ARG_REG;           //CMD_Argument          settings[14:13]=`WORD_SELECT;             //Reserved    settings[12] = data_read; //Type of command    settings[11] = data_write;    settings[10:8]=3'b111;            //Delay    settings[7]=`CRCE;         //CRC-check    settings[6:0]=response_size;   //response size        Watchdog_Cnt = 0;        `CICMD =1;     end     EXECUTE: begin       Watchdog_Cnt = Watchdog_Cnt +1;    if (Watchdog_Cnt>TIMEOUT_REG) begin      `CTE=1;      `EI = 1;      if (ack_in == 1) begin         complete=1;      end         go_idle_o=1;     end        //Default    req_out=0;		ack_out =0;        //Start sending when serial module is ready   	if (ack_in == 1) begin	    	     	    		req_out =1;	   			   			  end		   //Incoming New Status 	  else if ( req_in == 1) begin           status=serial_status;        STATUS_REG[15:12] =serial_status[3:0];        ack_out = 1;         if ( `dat_ava ) begin //Data avaible           complete=1;            `EI = 0;                        if (CRC_check_enable & ~`crc_valid) begin             `CCRCE=1;            `EI = 1;                        end            else if (index_check_enable &  (cmd_out[37:32] != cmd_in [37:32]) ) begin            `CIE=1;            `EI = 1;                       end          // else begin             `EI = 0;             `CC = 1;                                        RESP_1_REG=cmd_in[31:0];                      // end          end ////Data avaible       end //Status change     end //EXECUTE state   endcase  endendendmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -