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

📄 initsd.v

📁 FPGA直接读取SD卡扇区数据
💻 V
字号:
//////////////////////////////////////////////////////////////////////////                                                              //////// initSD.v                                                 ////////                                                              //////// This file is part of the spiMaster opencores effort.//// <http://www.opencores.org/cores//>                           ////////                                                              //////// Module Description:                                          //////// When SDInitReq asserted, initialise SD card////  ////  //// ////                                                              //////// To Do:                                                       //////// ////                                                              //////// Author(s):                                                   //////// - Steve Fielding, sfielding@base2designs.com                 ////////                                                              //////////////////////////////////////////////////////////////////////////////                                                              //////// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG          ////////                                                              //////// This source file may be used and distributed without         //////// restriction provided that this copyright statement is not    //////// removed from the file and that any derivative work contains  //////// the original copyright notice and the associated disclaimer. ////////                                                              //////// This source file is free software; you can redistribute it   //////// and/or modify it under the terms of the GNU Lesser General   //////// Public License as published by the Free Software Foundation; //////// either version 2.1 of the License, or (at your option) any   //////// later version.                                               ////////                                                              //////// This source is distributed in the hope that it will be       //////// useful, but WITHOUT ANY WARRANTY; without even the implied   //////// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      //////// PURPOSE. See the GNU Lesser General Public License for more  //////// details.                                                     ////////                                                              //////// You should have received a copy of the GNU Lesser General    //////// Public License along with this source; if not, download it   //////// from <http://www.opencores.org/lgpl.shtml>                   ////////                                                              ////////////////////////////////////////////////////////////////////////////`include "timescale.v"`include "spiMaster_defines.v"module initSD (checkSumByte, clk, cmdByte, dataByte1, dataByte2, dataByte3, dataByte4, initError, respByte, respTout, rst, rxDataRdy, rxDataRdyClr, SDInitRdy, SDInitReq, sendCmdRdy, sendCmdReq, spiClkDelayIn, spiClkDelayOut, spiCS_n, txDataEmpty, txDataFull, txDataOut, txDataWen);input   clk;input   [7:0]respByte;input   respTout;input   rst;input   rxDataRdy;input   SDInitReq;input   sendCmdRdy;input   [7:0]spiClkDelayIn;input   txDataEmpty;input   txDataFull;output  [7:0]checkSumByte;output  [7:0]cmdByte;output  [7:0]dataByte1;output  [7:0]dataByte2;output  [7:0]dataByte3;output  [7:0]dataByte4;output  [1:0]initError;output  rxDataRdyClr;output  SDInitRdy;output  sendCmdReq;output  [7:0]spiClkDelayOut;output  spiCS_n;output  [7:0]txDataOut;output  txDataWen;reg     [7:0]checkSumByte, next_checkSumByte;wire    clk;reg     [7:0]cmdByte, next_cmdByte;reg     [7:0]dataByte1, next_dataByte1;reg     [7:0]dataByte2, next_dataByte2;reg     [7:0]dataByte3, next_dataByte3;reg     [7:0]dataByte4, next_dataByte4;reg     [1:0]initError, next_initError;wire    [7:0]respByte;wire    respTout;wire    rst;wire    rxDataRdy;reg     rxDataRdyClr, next_rxDataRdyClr;reg     SDInitRdy, next_SDInitRdy;wire    SDInitReq;wire    sendCmdRdy;reg     sendCmdReq, next_sendCmdReq;wire    [7:0]spiClkDelayIn;reg     [7:0]spiClkDelayOut, next_spiClkDelayOut;reg     spiCS_n, next_spiCS_n;wire    txDataEmpty;wire    txDataFull;reg     [7:0]txDataOut, next_txDataOut;reg     txDataWen, next_txDataWen;// diagram signals declarationsreg  [9:0]delCnt1, next_delCnt1;reg  [7:0]delCnt2, next_delCnt2;reg  [7:0]loopCnt, next_loopCnt;// BINARY ENCODED state machine: initSDSt// State codes definitions:`define START 4'b0000`define WT_INIT_REQ 4'b0001`define CLK_SEQ_SEND_FF 4'b0010`define CLK_SEQ_CHK_FIN 4'b0011`define RESET_SEND_CMD 4'b0100`define RESET_DEL 4'b0101`define RESET_WT_FIN 4'b0110`define RESET_CHK_FIN 4'b0111`define INIT_WT_FIN 4'b1000`define INIT_CHK_FIN 4'b1001`define INIT_SEND_CMD 4'b1010`define INIT_DEL1 4'b1011`define INIT_DEL2 4'b1100`define CLK_SEQ_WT_DATA_EMPTY 4'b1101reg [3:0]CurrState_initSDSt, NextState_initSDSt;// Diagram actions (continuous assignments allowed only: assign ...)// diagram ACTION// Machine: initSDSt// NextState logic (combinatorial)always @ (spiClkDelayIn or SDInitReq or txDataFull or loopCnt or sendCmdRdy or respTout or respByte or delCnt1 or delCnt2 or txDataEmpty or spiClkDelayOut or SDInitRdy or spiCS_n or initError or txDataOut or txDataWen or cmdByte or dataByte1 or dataByte2 or dataByte3 or dataByte4 or checkSumByte or sendCmdReq or rxDataRdyClr or CurrState_initSDSt)begin  NextState_initSDSt <= CurrState_initSDSt;  // Set default values for outputs and signals  next_spiClkDelayOut <= spiClkDelayOut;  next_SDInitRdy <= SDInitRdy;  next_spiCS_n <= spiCS_n;  next_initError <= initError;  next_txDataOut <= txDataOut;  next_txDataWen <= txDataWen;  next_cmdByte <= cmdByte;  next_dataByte1 <= dataByte1;  next_dataByte2 <= dataByte2;  next_dataByte3 <= dataByte3;  next_dataByte4 <= dataByte4;  next_checkSumByte <= checkSumByte;  next_sendCmdReq <= sendCmdReq;  next_loopCnt <= loopCnt;  next_delCnt1 <= delCnt1;  next_delCnt2 <= delCnt2;  next_rxDataRdyClr <= rxDataRdyClr;  case (CurrState_initSDSt)  // synopsys parallel_case full_case    `START:    begin      next_spiClkDelayOut <= spiClkDelayIn;      next_SDInitRdy <= 1'b0;      next_spiCS_n <= 1'b1;      next_initError <= `INIT_NO_ERROR;      next_txDataOut <= 8'h00;      next_txDataWen <= 1'b0;      next_cmdByte <= 8'h00;      next_dataByte1 <= 8'h00;      next_dataByte2 <= 8'h00;      next_dataByte3 <= 8'h00;      next_dataByte4 <= 8'h00;      next_checkSumByte <= 8'h00;      next_sendCmdReq <= 1'b0;      next_loopCnt <= 8'h00;      next_delCnt1 <= 10'h000;      next_delCnt2 <= 8'h00;      next_rxDataRdyClr <= 1'b0;      NextState_initSDSt <= `WT_INIT_REQ;    end    `WT_INIT_REQ:    begin      next_SDInitRdy <= 1'b1;      next_spiClkDelayOut <= spiClkDelayIn;      next_cmdByte <= 8'h00;      next_dataByte1 <= 8'h00;      next_dataByte2 <= 8'h00;      next_dataByte3 <= 8'h00;      next_dataByte4 <= 8'h00;      next_checkSumByte <= 8'h00;      if (SDInitReq == 1'b1)      begin        NextState_initSDSt <= `CLK_SEQ_SEND_FF;        next_SDInitRdy <= 1'b0;        next_loopCnt <= 8'h00;        next_spiClkDelayOut <= `SLOW_SPI_CLK;        next_initError <= `INIT_NO_ERROR;      end    end    `CLK_SEQ_SEND_FF:    begin      if (txDataFull == 1'b0)      begin        NextState_initSDSt <= `CLK_SEQ_CHK_FIN;        next_txDataOut <= 8'hff;        next_txDataWen <= 1'b1;        next_loopCnt <= loopCnt + 1'b1;      end    end    `CLK_SEQ_CHK_FIN:    begin      next_txDataWen <= 1'b0;      if (loopCnt == `SD_INIT_START_SEQ_LEN)      begin        NextState_initSDSt <= `CLK_SEQ_WT_DATA_EMPTY;      end      else      begin        NextState_initSDSt <= `CLK_SEQ_SEND_FF;      end    end    `CLK_SEQ_WT_DATA_EMPTY:    begin      if (txDataEmpty == 1'b1)      begin        NextState_initSDSt <= `RESET_SEND_CMD;        next_loopCnt <= 8'h00;      end    end    `RESET_SEND_CMD:    begin      next_cmdByte <= 8'h40;      //CMD0      next_dataByte1 <= 8'h00;      next_dataByte2 <= 8'h00;      next_dataByte3 <= 8'h00;      next_dataByte4 <= 8'h00;      next_checkSumByte <= 8'h95;      next_sendCmdReq <= 1'b1;      next_loopCnt <= loopCnt + 1'b1;      next_spiCS_n <= 1'b0;      NextState_initSDSt <= `RESET_DEL;    end    `RESET_DEL:    begin      next_sendCmdReq <= 1'b0;      NextState_initSDSt <= `RESET_WT_FIN;    end    `RESET_WT_FIN:    begin      if (sendCmdRdy == 1'b1)      begin        NextState_initSDSt <= `RESET_CHK_FIN;        next_spiCS_n <= 1'b1;      end    end    `RESET_CHK_FIN:    begin      if ((respTout == 1'b1 || respByte != 8'h01) && loopCnt != 8'hff)      begin        NextState_initSDSt <= `RESET_SEND_CMD;      end      else if (respTout == 1'b1 || respByte != 8'h01)      begin        NextState_initSDSt <= `WT_INIT_REQ;        next_initError <= `INIT_CMD0_ERROR;      end      else      begin        NextState_initSDSt <= `INIT_SEND_CMD;      end    end    `INIT_WT_FIN:    begin      if (sendCmdRdy == 1'b1)      begin        NextState_initSDSt <= `INIT_CHK_FIN;        next_spiCS_n <= 1'b1;      end    end    `INIT_CHK_FIN:    begin      if ((respTout == 1'b1 || respByte != 8'h00) && loopCnt != 8'hff)      begin        NextState_initSDSt <= `INIT_SEND_CMD;      end      else if (respTout == 1'b1 || respByte != 8'h00)      begin        NextState_initSDSt <= `WT_INIT_REQ;        next_initError <= `INIT_CMD1_ERROR;      end      else      begin        NextState_initSDSt <= `WT_INIT_REQ;      end    end    `INIT_SEND_CMD:    begin      next_cmdByte <= 8'h41;      //CMD1      next_dataByte1 <= 8'h00;      next_dataByte2 <= 8'h00;      next_dataByte3 <= 8'h00;      next_dataByte4 <= 8'h00;      next_checkSumByte <= 8'hff;      next_sendCmdReq <= 1'b1;      next_loopCnt <= loopCnt + 1'b1;      next_spiCS_n <= 1'b0;      next_delCnt1 <= 10'h000;      NextState_initSDSt <= `INIT_DEL1;    end    `INIT_DEL1:    begin      next_delCnt1 <= delCnt1 + 1'b1;      next_delCnt2 <= 8'h00;      next_sendCmdReq <= 1'b0;      if (delCnt1 == `TWO_MS)      begin        NextState_initSDSt <= `INIT_WT_FIN;      end      else      begin        NextState_initSDSt <= `INIT_DEL2;      end    end    `INIT_DEL2:    begin      next_delCnt2 <= delCnt2 + 1'b1;      if (delCnt2 == 8'hff)      begin        NextState_initSDSt <= `INIT_DEL1;      end    end  endcaseend// Current State Logic (sequential)always @ (posedge clk)begin  if (rst == 1'b1)    CurrState_initSDSt <= `START;  else    CurrState_initSDSt <= NextState_initSDSt;end// Registered outputs logicalways @ (posedge clk)begin  if (rst == 1'b1)  begin    spiClkDelayOut <= spiClkDelayIn;    SDInitRdy <= 1'b0;    spiCS_n <= 1'b1;    initError <= `INIT_NO_ERROR;    txDataOut <= 8'h00;    txDataWen <= 1'b0;    cmdByte <= 8'h00;    dataByte1 <= 8'h00;    dataByte2 <= 8'h00;    dataByte3 <= 8'h00;    dataByte4 <= 8'h00;    checkSumByte <= 8'h00;    sendCmdReq <= 1'b0;    rxDataRdyClr <= 1'b0;    loopCnt <= 8'h00;    delCnt1 <= 10'h000;    delCnt2 <= 8'h00;  end  else   begin    spiClkDelayOut <= next_spiClkDelayOut;    SDInitRdy <= next_SDInitRdy;    spiCS_n <= next_spiCS_n;    initError <= next_initError;    txDataOut <= next_txDataOut;    txDataWen <= next_txDataWen;    cmdByte <= next_cmdByte;    dataByte1 <= next_dataByte1;    dataByte2 <= next_dataByte2;    dataByte3 <= next_dataByte3;    dataByte4 <= next_dataByte4;    checkSumByte <= next_checkSumByte;    sendCmdReq <= next_sendCmdReq;    rxDataRdyClr <= next_rxDataRdyClr;    loopCnt <= next_loopCnt;    delCnt1 <= next_delCnt1;    delCnt2 <= next_delCnt2;  endendendmodule

⌨️ 快捷键说明

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