OpenCores
URL https://opencores.org/ocsvn/spimaster/spimaster/trunk

Subversion Repositories spimaster

[/] [spimaster/] [trunk/] [RTL/] [spiCtrl.v] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 sfielding
 
2
//////////////////////////////////////////////////////////////////////
3
////                                                              ////
4
//// spiCtrl.v                                                 ////
5
////                                                              ////
6
//// This file is part of the spiMaster opencores effort.
7
//// <http://www.opencores.org/cores//>                           ////
8
////                                                              ////
9
//// Module Description:                                          ////
10
////  Controls access to the 3 types of SPI access
11
//// Direct SPI access, SD initialisation, and SD block read/write
12
//// 
13
////                                                              ////
14
//// To Do:                                                       ////
15
//// 
16
////                                                              ////
17
//// Author(s):                                                   ////
18
//// - Steve Fielding, sfielding@base2designs.com                 ////
19
////                                                              ////
20
//////////////////////////////////////////////////////////////////////
21
////                                                              ////
22
//// Copyright (C) 2008 Steve Fielding and OPENCORES.ORG          ////
23
////                                                              ////
24
//// This source file may be used and distributed without         ////
25
//// restriction provided that this copyright statement is not    ////
26
//// removed from the file and that any derivative work contains  ////
27
//// the original copyright notice and the associated disclaimer. ////
28
////                                                              ////
29
//// This source file is free software; you can redistribute it   ////
30
//// and/or modify it under the terms of the GNU Lesser General   ////
31
//// Public License as published by the Free Software Foundation; ////
32
//// either version 2.1 of the License, or (at your option) any   ////
33
//// later version.                                               ////
34
////                                                              ////
35
//// This source is distributed in the hope that it will be       ////
36
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
37
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
38
//// PURPOSE. See the GNU Lesser General Public License for more  ////
39
//// details.                                                     ////
40
////                                                              ////
41
//// You should have received a copy of the GNU Lesser General    ////
42
//// Public License along with this source; if not, download it   ////
43
//// from <http://www.opencores.org/lgpl.shtml>                   ////
44
////                                                              ////
45
//////////////////////////////////////////////////////////////////////
46
//
47
`include "timescale.v"
48
`include "spiMaster_defines.v"
49
 
50
module spiCtrl (clk, readWriteSDBlockRdy, readWriteSDBlockReq, rst, rxDataRdy, rxDataRdyClr, SDInitRdy, SDInitReq, spiCS_n, spiTransCtrl, spiTransSts, spiTransType, txDataWen);
51
input   clk;
52
input   readWriteSDBlockRdy;
53
input   rst;
54
input   rxDataRdy;
55
input   SDInitRdy;
56
input   spiTransCtrl;
57
input   [1:0]spiTransType;
58
output  [1:0]readWriteSDBlockReq;
59
output  rxDataRdyClr;
60
output  SDInitReq;
61
output  spiCS_n;
62
output  spiTransSts;
63
output  txDataWen;
64
 
65
wire    clk;
66
wire    readWriteSDBlockRdy;
67
reg     [1:0]readWriteSDBlockReq, next_readWriteSDBlockReq;
68
wire    rst;
69
wire    rxDataRdy;
70
reg     rxDataRdyClr, next_rxDataRdyClr;
71
wire    SDInitRdy;
72
reg     SDInitReq, next_SDInitReq;
73
reg     spiCS_n, next_spiCS_n;
74
wire    spiTransCtrl;
75
reg     spiTransSts, next_spiTransSts;
76
wire    [1:0]spiTransType;
77
reg     txDataWen, next_txDataWen;
78
 
79
// BINARY ENCODED state machine: spiCtrlSt
80
// State codes definitions:
81
`define ST_S_CTRL 3'b000
82
`define WT_S_CTRL_REQ 3'b001
83
`define WT_FIN1 3'b010
84
`define DIR_ACC 3'b011
85
`define INIT 3'b100
86
`define WT_FIN2 3'b101
87
`define RW 3'b110
88
`define WT_FIN3 3'b111
89
 
90
reg [2:0]CurrState_spiCtrlSt, NextState_spiCtrlSt;
91
 
92
// Diagram actions (continuous assignments allowed only: assign ...)
93
// diagram ACTION
94
 
95
 
96
// Machine: spiCtrlSt
97
 
98
// NextState logic (combinatorial)
99
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)
100
begin
101
  NextState_spiCtrlSt <= CurrState_spiCtrlSt;
102
  // Set default values for outputs and signals
103
  next_readWriteSDBlockReq <= readWriteSDBlockReq;
104
  next_txDataWen <= txDataWen;
105
  next_SDInitReq <= SDInitReq;
106
  next_rxDataRdyClr <= rxDataRdyClr;
107
  next_spiTransSts <= spiTransSts;
108
  next_spiCS_n <= spiCS_n;
109
  case (CurrState_spiCtrlSt)  // synopsys parallel_case full_case
110
    `ST_S_CTRL:
111
    begin
112
      next_readWriteSDBlockReq <= `NO_BLOCK_REQ;
113
      next_txDataWen <= 1'b0;
114
      next_SDInitReq <= 1'b0;
115
      next_rxDataRdyClr <= 1'b0;
116
      next_spiTransSts <= `TRANS_NOT_BUSY;
117
      next_spiCS_n <= 1'b1;
118
      NextState_spiCtrlSt <= `WT_S_CTRL_REQ;
119
    end
120
    `WT_S_CTRL_REQ:
121
    begin
122
      next_rxDataRdyClr <= 1'b0;
123
      next_spiTransSts <= `TRANS_NOT_BUSY;
124
      if ((spiTransCtrl == `TRANS_START) && (spiTransType == `INIT_SD))
125
      begin
126
        NextState_spiCtrlSt <= `INIT;
127
        next_spiTransSts <= `TRANS_BUSY;
128
        next_SDInitReq <= 1'b1;
129
      end
130
      else if ((spiTransCtrl == `TRANS_START) && (spiTransType == `RW_WRITE_SD_BLOCK))
131
      begin
132
        NextState_spiCtrlSt <= `RW;
133
        next_spiTransSts <= `TRANS_BUSY;
134
        next_readWriteSDBlockReq <= `WRITE_SD_BLOCK;
135
      end
136
      else if ((spiTransCtrl == `TRANS_START) && (spiTransType == `RW_READ_SD_BLOCK))
137
      begin
138
        NextState_spiCtrlSt <= `RW;
139
        next_spiTransSts <= `TRANS_BUSY;
140
        next_readWriteSDBlockReq <= `READ_SD_BLOCK;
141
      end
142
      else if ((spiTransCtrl == `TRANS_START) && (spiTransType == `DIRECT_ACCESS))
143
      begin
144
        NextState_spiCtrlSt <= `DIR_ACC;
145
        next_spiTransSts <= `TRANS_BUSY;
146
        next_txDataWen <= 1'b1;
147
        next_spiCS_n <= 1'b0;
148
      end
149
    end
150
    `WT_FIN1:
151
    begin
152
      if (rxDataRdy == 1'b1)
153
      begin
154
        NextState_spiCtrlSt <= `WT_S_CTRL_REQ;
155
        next_rxDataRdyClr <= 1'b1;
156
        next_spiCS_n <= 1'b1;
157
      end
158
    end
159
    `DIR_ACC:
160
    begin
161
      next_txDataWen <= 1'b0;
162
      NextState_spiCtrlSt <= `WT_FIN1;
163
    end
164
    `INIT:
165
    begin
166
      next_SDInitReq <= 1'b0;
167
      NextState_spiCtrlSt <= `WT_FIN2;
168
    end
169
    `WT_FIN2:
170
    begin
171
      if (SDInitRdy == 1'b1)
172
      begin
173
        NextState_spiCtrlSt <= `WT_S_CTRL_REQ;
174
      end
175
    end
176
    `RW:
177
    begin
178
      next_readWriteSDBlockReq <= `NO_BLOCK_REQ;
179
      NextState_spiCtrlSt <= `WT_FIN3;
180
    end
181
    `WT_FIN3:
182
    begin
183
      if (readWriteSDBlockRdy == 1'b1)
184
      begin
185
        NextState_spiCtrlSt <= `WT_S_CTRL_REQ;
186
      end
187
    end
188
  endcase
189
end
190
 
191
// Current State Logic (sequential)
192
always @ (posedge clk)
193
begin
194
  if (rst == 1'b1)
195
    CurrState_spiCtrlSt <= `ST_S_CTRL;
196
  else
197
    CurrState_spiCtrlSt <= NextState_spiCtrlSt;
198
end
199
 
200
// Registered outputs logic
201
always @ (posedge clk)
202
begin
203
  if (rst == 1'b1)
204
  begin
205
    readWriteSDBlockReq <= `NO_BLOCK_REQ;
206
    txDataWen <= 1'b0;
207
    SDInitReq <= 1'b0;
208
    rxDataRdyClr <= 1'b0;
209
    spiTransSts <= `TRANS_NOT_BUSY;
210
    spiCS_n <= 1'b1;
211
  end
212
  else
213
  begin
214
    readWriteSDBlockReq <= next_readWriteSDBlockReq;
215
    txDataWen <= next_txDataWen;
216
    SDInitReq <= next_SDInitReq;
217
    rxDataRdyClr <= next_rxDataRdyClr;
218
    spiTransSts <= next_spiTransSts;
219
    spiCS_n <= next_spiCS_n;
220
  end
221
end
222
 
223
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.