2 //////////////////////////////////////////////////////////////////////
\r
6 //// This file is part of the spiMaster opencores effort.
\r
7 //// <http://www.opencores.org/cores//> ////
\r
9 //// Module Description: ////
\r
10 //// parameterized dual clock domain fifo.
\r
11 //// fifo depth is restricted to 2^ADDR_WIDTH
\r
12 //// No protection against over runs and under runs.
\r
18 //// Author(s): ////
\r
19 //// - Steve Fielding, sfielding@base2designs.com ////
\r
21 //////////////////////////////////////////////////////////////////////
\r
23 //// Copyright (C) 2008 Steve Fielding and OPENCORES.ORG ////
\r
25 //// This source file may be used and distributed without ////
\r
26 //// restriction provided that this copyright statement is not ////
\r
27 //// removed from the file and that any derivative work contains ////
\r
28 //// the original copyright notice and the associated disclaimer. ////
\r
30 //// This source file is free software; you can redistribute it ////
\r
31 //// and/or modify it under the terms of the GNU Lesser General ////
\r
32 //// Public License as published by the Free Software Foundation; ////
\r
33 //// either version 2.1 of the License, or (at your option) any ////
\r
34 //// later version. ////
\r
36 //// This source is distributed in the hope that it will be ////
\r
37 //// useful, but WITHOUT ANY WARRANTY; without even the implied ////
\r
38 //// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
\r
39 //// PURPOSE. See the GNU Lesser General Public License for more ////
\r
42 //// You should have received a copy of the GNU Lesser General ////
\r
43 //// Public License along with this source; if not, download it ////
\r
44 //// from <http://www.opencores.org/lgpl.shtml> ////
\r
46 //////////////////////////////////////////////////////////////////////
\r
48 `include "timescale.v"
\r
49 `include "spiMaster_defines.v"
\r
51 module spiCtrl (clk, readWriteSDBlockRdy, readWriteSDBlockReq, rst, rxDataRdy, rxDataRdyClr, SDInitRdy, SDInitReq, spiCS_n, spiTransCtrl, spiTransSts, spiTransType, txDataWen);
\r
53 input readWriteSDBlockRdy;
\r
58 input [1:0]spiTransType;
\r
59 output [1:0]readWriteSDBlockReq;
\r
60 output rxDataRdyClr;
\r
67 wire readWriteSDBlockRdy;
\r
68 reg [1:0]readWriteSDBlockReq, next_readWriteSDBlockReq;
\r
71 reg rxDataRdyClr, next_rxDataRdyClr;
\r
73 reg SDInitReq, next_SDInitReq;
\r
74 reg spiCS_n, next_spiCS_n;
\r
76 reg spiTransSts, next_spiTransSts;
\r
77 wire [1:0]spiTransType;
\r
78 reg txDataWen, next_txDataWen;
\r
80 // BINARY ENCODED state machine: spiCtrlSt
\r
81 // State codes definitions:
\r
82 `define ST_S_CTRL 3'b000
\r
83 `define WT_S_CTRL_REQ 3'b001
\r
84 `define WT_FIN1 3'b010
\r
85 `define DIR_ACC 3'b011
\r
87 `define WT_FIN2 3'b101
\r
89 `define WT_FIN3 3'b111
\r
91 reg [2:0]CurrState_spiCtrlSt, NextState_spiCtrlSt;
\r
93 // Diagram actions (continuous assignments allowed only: assign ...)
\r
97 // Machine: spiCtrlSt
\r
99 // NextState logic (combinatorial)
\r
100 always @ (spiTransCtrl or rxDataRdy or spiTransType or SDInitRdy or readWriteSDBlockRdy or readWriteSDBlockReq or txDataWen or SDInitReq or rxDataRdyClr or spiTransSts or spiCS_n or CurrState_spiCtrlSt)
\r
102 NextState_spiCtrlSt <= CurrState_spiCtrlSt;
\r
103 // Set default values for outputs and signals
\r
104 next_readWriteSDBlockReq <= readWriteSDBlockReq;
\r
105 next_txDataWen <= txDataWen;
\r
106 next_SDInitReq <= SDInitReq;
\r
107 next_rxDataRdyClr <= rxDataRdyClr;
\r
108 next_spiTransSts <= spiTransSts;
\r
109 next_spiCS_n <= spiCS_n;
\r
110 case (CurrState_spiCtrlSt) // synopsys parallel_case full_case
\r
113 next_readWriteSDBlockReq <= `NO_BLOCK_REQ;
\r
114 next_txDataWen <= 1'b0;
\r
115 next_SDInitReq <= 1'b0;
\r
116 next_rxDataRdyClr <= 1'b0;
\r
117 next_spiTransSts <= `TRANS_NOT_BUSY;
\r
118 next_spiCS_n <= 1'b1;
\r
119 NextState_spiCtrlSt <= `WT_S_CTRL_REQ;
\r
123 next_rxDataRdyClr <= 1'b0;
\r
124 next_spiTransSts <= `TRANS_NOT_BUSY;
\r
125 if ((spiTransCtrl == `TRANS_START) && (spiTransType == `INIT_SD))
\r
127 NextState_spiCtrlSt <= `INIT;
\r
128 next_spiTransSts <= `TRANS_BUSY;
\r
129 next_SDInitReq <= 1'b1;
\r
131 else if ((spiTransCtrl == `TRANS_START) && (spiTransType == `RW_WRITE_SD_BLOCK))
\r
133 NextState_spiCtrlSt <= `RW;
\r
134 next_spiTransSts <= `TRANS_BUSY;
\r
135 next_readWriteSDBlockReq <= `WRITE_SD_BLOCK;
\r
137 else if ((spiTransCtrl == `TRANS_START) && (spiTransType == `RW_READ_SD_BLOCK))
\r
139 NextState_spiCtrlSt <= `RW;
\r
140 next_spiTransSts <= `TRANS_BUSY;
\r
141 next_readWriteSDBlockReq <= `READ_SD_BLOCK;
\r
143 else if ((spiTransCtrl == `TRANS_START) && (spiTransType == `DIRECT_ACCESS))
\r
145 NextState_spiCtrlSt <= `DIR_ACC;
\r
146 next_spiTransSts <= `TRANS_BUSY;
\r
147 next_txDataWen <= 1'b1;
\r
148 next_spiCS_n <= 1'b0;
\r
153 if (rxDataRdy == 1'b1)
\r
155 NextState_spiCtrlSt <= `WT_S_CTRL_REQ;
\r
156 next_rxDataRdyClr <= 1'b1;
\r
157 next_spiCS_n <= 1'b1;
\r
162 next_txDataWen <= 1'b0;
\r
163 NextState_spiCtrlSt <= `WT_FIN1;
\r
167 next_SDInitReq <= 1'b0;
\r
168 NextState_spiCtrlSt <= `WT_FIN2;
\r
172 if (SDInitRdy == 1'b1)
\r
174 NextState_spiCtrlSt <= `WT_S_CTRL_REQ;
\r
179 next_readWriteSDBlockReq <= `NO_BLOCK_REQ;
\r
180 NextState_spiCtrlSt <= `WT_FIN3;
\r
184 if (readWriteSDBlockRdy == 1'b1)
\r
186 NextState_spiCtrlSt <= `WT_S_CTRL_REQ;
\r
192 // Current State Logic (sequential)
\r
193 always @ (posedge clk)
\r
196 CurrState_spiCtrlSt <= `ST_S_CTRL;
\r
198 CurrState_spiCtrlSt <= NextState_spiCtrlSt;
\r
201 // Registered outputs logic
\r
202 always @ (posedge clk)
\r
206 readWriteSDBlockReq <= `NO_BLOCK_REQ;
\r
209 rxDataRdyClr <= 1'b0;
\r
210 spiTransSts <= `TRANS_NOT_BUSY;
\r
215 readWriteSDBlockReq <= next_readWriteSDBlockReq;
\r
216 txDataWen <= next_txDataWen;
\r
217 SDInitReq <= next_SDInitReq;
\r
218 rxDataRdyClr <= next_rxDataRdyClr;
\r
219 spiTransSts <= next_spiTransSts;
\r
220 spiCS_n <= next_spiCS_n;
\r