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

📄 ctrlstsregbi.v

📁 FPGA直接读取SD卡扇区数据
💻 V
字号:
//////////////////////////////////////////////////////////////////////////                                                              //////// ctrlStsRegBI.v                                               ////////                                                              //////// This file is part of the spiMaster opencores effort.//// <http://www.opencores.org/cores//>                           ////////                                                              //////// Module Description:                                          //////// Wishbone bus interface to spiMaster control and status regs////                                                              //////// To Do:                                                       //////// ////                                                              //////// Author(s):                                                   //////// - Steve Fielding, sfielding@base2designs.com                 ////////                                                              //////////////////////////////////////////////////////////////////////////////                                                              //////// Copyright (C) 2008 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 ctrlStsRegBI (  busClk,   rstFromWire,   dataIn,   dataOut,   address,   writeEn,   strobe_i,   spiSysClk,  spiTransType,   spiTransCtrl,   spiTransStatus,  spiDirectAccessTxData,  spiDirectAccessRxData,   ctrlStsRegSel,   rstSyncToBusClkOut,   rstSyncToSpiClkOut,  SDWriteError,  SDReadError,  SDInitError,  SDAddr,  spiClkDelay);input [7:0] dataIn;input [7:0] address;input writeEn;input strobe_i;input busClk;input spiSysClk;output [7:0] dataOut;input ctrlStsRegSel;output [1:0] spiTransType;output spiTransCtrl;input spiTransStatus;output [7:0] spiDirectAccessTxData;reg [7:0] spiDirectAccessTxData;input [7:0] spiDirectAccessRxData;input rstFromWire;output rstSyncToBusClkOut;output rstSyncToSpiClkOut;input [1:0] SDWriteError;input [1:0] SDReadError;input [1:0] SDInitError;output [31:0] SDAddr;reg [31:0] SDAddr;output [7:0] spiClkDelay;reg [7:0] spiClkDelay;wire [7:0] dataIn;wire [7:0] address;wire writeEn;wire strobe_i;wire clk;reg [7:0] dataOut;reg [1:0] spiTransType;reg spiTransCtrl;wire ctrlStsRegSel;wire rstFromWire;reg rstSyncToBusClkOut;reg rstSyncToSpiClkOut;//internal wire and regsreg [5:0] rstShift;reg rstFromBus;reg [7:0] spiDirectAccessTxDataSTB;reg [7:0] spiDirectAccessRxDataSTB;reg [1:0] spiTransTypeSTB;reg spiTransCtrlSTB;reg spiTransStatusSTB;reg rstSyncToSpiClkFirst;reg [5:0] spiTransCtrlShift;reg spiTransStatusReg1;reg spiTransStatusReg2;reg spiTransStatusReg3;reg [1:0] SDWriteErrorSTB;reg [1:0] SDReadErrorSTB;reg [1:0] SDInitErrorSTB;reg spiTransCtrl_reg1;reg spiTransCtrl_reg2;reg spiTransCtrl_reg3;//sync write demuxalways @(posedge busClk)begin  if (rstSyncToBusClkOut == 1'b1) begin    spiTransTypeSTB <= `DIRECT_ACCESS;    spiTransCtrlSTB <= `TRANS_STOP;    spiDirectAccessTxDataSTB <= 8'h00;    spiClkDelay <= `FAST_SPI_CLK;  end  else begin    if (writeEn == 1'b1 && ctrlStsRegSel == 1'b1 && strobe_i == 1'b1 && address == `SPI_MASTER_CONTROL_REG && dataIn[0] == 1'b1 )      rstFromBus <= 1'b1;    else      rstFromBus <= 1'b0;    if (writeEn == 1'b1 && ctrlStsRegSel == 1'b1 && strobe_i == 1'b1 && address == `TRANS_CTRL_REG && dataIn[0] == 1'b1 )      spiTransCtrlSTB <= 1'b1;    else      spiTransCtrlSTB <= 1'b0;    if (writeEn == 1'b1 && ctrlStsRegSel == 1'b1 && strobe_i == 1'b1) begin      case (address)        `TRANS_TYPE_REG: spiTransTypeSTB <= dataIn[1:0];        `SD_ADDR_7_0_REG: SDAddr[7:0] <= dataIn;        `SD_ADDR_15_8_REG: SDAddr[15:8] <= dataIn;        `SD_ADDR_23_16_REG: SDAddr[23:16] <= dataIn;        `SD_ADDR_31_24_REG: SDAddr[31:24] <= dataIn;        `SPI_CLK_DEL_REG: spiClkDelay <= dataIn;        `DIRECT_ACCESS_DATA_REG: spiDirectAccessTxDataSTB <= dataIn;      endcase    end  endend// async read muxalways @(address or spiTransTypeSTB or spiTransCtrlSTB or         spiTransStatusSTB or spiDirectAccessRxDataSTB or         SDAddr or SDInitErrorSTB or SDReadErrorSTB or SDWriteErrorSTB or         spiClkDelay)begin  case (address)    `SPI_MASTER_VERSION_REG: dataOut <= `SPI_MASTER_VERSION_NUM;    `TRANS_TYPE_REG: dataOut <= { 6'b000000, spiTransTypeSTB};    `TRANS_CTRL_REG: dataOut <= { 7'b0000000, spiTransCtrlSTB};    `TRANS_STS_REG: dataOut <= { 7'b0000000, spiTransStatusSTB};    `TRANS_ERROR_REG: dataOut <= {2'b00, SDWriteErrorSTB, SDReadErrorSTB, SDInitErrorSTB};    `SD_ADDR_7_0_REG: dataOut <= SDAddr[7:0];    `SD_ADDR_15_8_REG: dataOut <= SDAddr[15:8];    `SD_ADDR_23_16_REG: dataOut <= SDAddr[23:16];    `SD_ADDR_31_24_REG: dataOut <= SDAddr[31:24];    `SPI_CLK_DEL_REG: dataOut <= spiClkDelay;    `DIRECT_ACCESS_DATA_REG: dataOut <= spiDirectAccessRxDataSTB;    default: dataOut <= 8'h00;  endcaseend// reset control//generate 'rstSyncToBusClk'//assuming that 'busClk' < 5 * 'spiSysClk'.always @(posedge busClk) begin  if (rstFromWire == 1'b1 || rstFromBus == 1'b1)     rstShift <= 6'b111111;  else    rstShift <= {1'b0, rstShift[5:1]};endalways @(rstShift)  rstSyncToBusClkOut <= rstShift[0];// double sync across clock domains to generate 'rstSyncToSpiClkOut'always @(posedge spiSysClk) begin    rstSyncToSpiClkFirst <= rstSyncToBusClkOut;    rstSyncToSpiClkOut <= rstSyncToSpiClkFirst;end// spi transaction control//assuming that 'busClk' < 5 * 'spiSysClk'.always @(posedge busClk) begin  if (rstSyncToBusClkOut == 1'b1)     spiTransCtrlShift <= 6'b000000;  else if (spiTransCtrlSTB == 1'b1)     spiTransCtrlShift <= 6'b111111;  else    spiTransCtrlShift <= {1'b0, spiTransCtrlShift[5:1]};end//re-sync to spiSysClkalways @(posedge spiSysClk) begin  if (rstSyncToSpiClkOut == 1'b1) begin    spiTransCtrl_reg1 <= 1'b0;    spiTransCtrl_reg2 <= 1'b0;    spiTransCtrl_reg3 <= 1'b0;  end  else begin    spiTransCtrl_reg1 <= spiTransCtrlShift[0];    spiTransCtrl_reg2 <= spiTransCtrl_reg1;    spiTransCtrl_reg3 <= spiTransCtrl_reg2;    if (spiTransCtrl_reg3 == 1'b0 && spiTransCtrl_reg2 == 1'b1)      spiTransCtrl <= `TRANS_START;    else      spiTransCtrl <= `TRANS_STOP;  endend//re-sync from busClk to spiSysClk. always @(posedge spiSysClk) begin  if (rstSyncToSpiClkOut == 1'b1) begin    spiTransType <= `DIRECT_ACCESS;    spiDirectAccessTxData <= 8'h00;  end  else begin    spiDirectAccessTxData <= spiDirectAccessTxDataSTB;    spiTransType <= spiTransTypeSTB;   endend//re-sync from spiSysClk to busClkalways @(posedge busClk) begin  if (rstSyncToBusClkOut == 1'b1) begin    spiTransStatusSTB <= `TRANS_NOT_BUSY;    spiTransStatusReg1 <= `TRANS_NOT_BUSY;    spiTransStatusReg2 <= `TRANS_NOT_BUSY;    spiTransStatusReg3 <= `TRANS_NOT_BUSY;  end  else begin    spiTransStatusReg1 <= spiTransStatus;    spiTransStatusReg2 <= spiTransStatusReg1;    spiTransStatusReg3 <= spiTransStatusReg2;    if (spiTransCtrlSTB == `TRANS_START)      spiTransStatusSTB <= `TRANS_BUSY;    else if (spiTransStatusReg3 == `TRANS_BUSY && spiTransStatusReg2 == `TRANS_NOT_BUSY)      spiTransStatusSTB <= `TRANS_NOT_BUSY;  end  spiDirectAccessRxDataSTB <= spiDirectAccessRxData;  SDWriteErrorSTB <= SDWriteError;  SDReadErrorSTB <= SDReadError;  SDInitErrorSTB <= SDInitError;endendmodule

⌨️ 快捷键说明

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