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

Subversion Repositories qspiflash

[/] [qspiflash/] [trunk/] [rtl/] [wbqspiflash.v] - Blame information for rev 20

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 14 dgisselq
////////////////////////////////////////////////////////////////////////////////
2 2 dgisselq
//
3
// Filename:    wbspiflash.v
4
//
5 3 dgisselq
// Project:     Wishbone Controlled Quad SPI Flash Controller
6 2 dgisselq
//
7
// Purpose:     Access a Quad SPI flash via a WISHBONE interface.  This
8
//              includes both read and write (and erase) commands to the SPI
9
//              flash.  All read/write commands are accomplished using the
10
//              high speed (4-bit) interface.  Further, the device will be
11
//              left/kept in the 4-bit read interface mode between accesses,
12
//              for a minimum read latency.
13
//
14 3 dgisselq
//      Wishbone Registers (See spec sheet for more detail):
15 2 dgisselq
//      0: local config(r) / erase commands(w) / deep power down cmds / etc.
16
//      R: (Write in Progress), (dirty-block), (spi_port_busy), 1'b0, 9'h00,
17
//              { last_erased_sector, 14'h00 } if (WIP)
18
//              else { current_sector_being_erased, 14'h00 }
19
//              current if write in progress, last if written
20
//      W: (1'b1 to erase), (12'h ignored), next_erased_block, 14'h ignored)
21 3 dgisselq
//      1: Configuration register
22
//      2: Status register (R/w)
23
//      3: Read ID (read only)
24 2 dgisselq
//      (19 bits): Data (R/w, but expect writes to take a while)
25
//              
26
//
27 14 dgisselq
// Creator:     Dan Gisselquist, Ph.D.
28 8 dgisselq
//              Gisselquist Technology, LLC
29 2 dgisselq
//
30 14 dgisselq
////////////////////////////////////////////////////////////////////////////////
31 2 dgisselq
//
32 20 dgisselq
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
33 2 dgisselq
//
34 3 dgisselq
// This program is free software (firmware): you can redistribute it and/or
35
// modify it under the terms of  the GNU General Public License as published
36
// by the Free Software Foundation, either version 3 of the License, or (at
37
// your option) any later version.
38
//
39
// This program is distributed in the hope that it will be useful, but WITHOUT
40
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
41
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
42
// for more details.
43
//
44
// You should have received a copy of the GNU General Public License along
45 14 dgisselq
// with this program.  (It's in the $(ROOT)/doc directory.  Run make with no
46 3 dgisselq
// target there if the PDF file isn't present.)  If not, see
47
// <http://www.gnu.org/licenses/> for a copy.
48
//
49
// License:     GPL, v3, as defined and found on www.gnu.org,
50
//              http://www.gnu.org/licenses/gpl.html
51
//
52
//
53 14 dgisselq
////////////////////////////////////////////////////////////////////////////////
54 7 dgisselq
//
55 20 dgisselq
//
56
`include "flashconfig.v"
57 14 dgisselq
`default_nettype        none
58 7 dgisselq
//
59 16 dgisselq
`define WBQSPI_RESET            5'd0
60
`define WBQSPI_RESET_QUADMODE   5'd1
61
`define WBQSPI_IDLE             5'd2
62
`define WBQSPI_RDIDLE           5'd3    // Idle, but in fast read mode
63
`define WBQSPI_WBDECODE         5'd4
64
`define WBQSPI_RD_DUMMY         5'd5
65
`define WBQSPI_QRD_ADDRESS      5'd6
66
`define WBQSPI_QRD_DUMMY        5'd7
67
`define WBQSPI_READ_CMD         5'd8
68
`define WBQSPI_READ_DATA        5'd9
69
`define WBQSPI_WAIT_TIL_RDIDLE  5'd10
70
`define WBQSPI_READ_ID_CMD      5'd11
71
`define WBQSPI_READ_ID          5'd12
72
`define WBQSPI_READ_STATUS      5'd13
73
`define WBQSPI_READ_CONFIG      5'd14
74
`define WBQSPI_WAIT_TIL_IDLE    5'd15
75 7 dgisselq
//
76
//
77
`ifndef READ_ONLY
78
//
79 16 dgisselq
`define WBQSPI_WAIT_WIP_CLEAR   5'd16
80
`define WBQSPI_CHECK_WIP_CLEAR  5'd17
81
`define WBQSPI_CHECK_WIP_DONE   5'd18
82
`define WBQSPI_WEN              5'd19
83
`define WBQSPI_PP               5'd20   // Program page
84
`define WBQSPI_QPP              5'd21   // Program page, 4 bit mode
85
`define WBQSPI_WR_DATA          5'd22
86
`define WBQSPI_WR_BUS_CYCLE     5'd23
87
`define WBQSPI_WRITE_STATUS     5'd24
88
`define WBQSPI_WRITE_CONFIG     5'd25
89
`define WBQSPI_ERASE_WEN        5'd26
90
`define WBQSPI_ERASE_CMD        5'd27
91
`define WBQSPI_ERASE_BLOCK      5'd28
92
`define WBQSPI_CLEAR_STATUS     5'd29
93
`define WBQSPI_IDLE_CHECK_WIP   5'd30
94 7 dgisselq
//
95
`endif
96 2 dgisselq
 
97 16 dgisselq
module  wbqspiflash(i_clk,
98 2 dgisselq
                // Internal wishbone connections
99
                i_wb_cyc, i_wb_data_stb, i_wb_ctrl_stb, i_wb_we,
100
                i_wb_addr, i_wb_data,
101
                // Wishbone return values
102
                o_wb_ack, o_wb_stall, o_wb_data,
103
                // Quad Spi connections to the external device
104
                o_qspi_sck, o_qspi_cs_n, o_qspi_mod, o_qspi_dat, i_qspi_dat,
105 3 dgisselq
                o_interrupt);
106 7 dgisselq
        parameter       ADDRESS_WIDTH=22;
107 16 dgisselq
        localparam      AW = ADDRESS_WIDTH-2;
108
        input   wire            i_clk;
109 2 dgisselq
        // Wishbone, inputs first
110 14 dgisselq
        input   wire            i_wb_cyc, i_wb_data_stb, i_wb_ctrl_stb, i_wb_we;
111 16 dgisselq
        input   wire    [(AW-1):0]       i_wb_addr;
112 14 dgisselq
        input   wire    [31:0]   i_wb_data;
113 2 dgisselq
        // then outputs
114
        output  reg             o_wb_ack;
115
        output  reg             o_wb_stall;
116
        output  reg     [31:0]   o_wb_data;
117
        // Quad SPI control wires
118
        output  wire            o_qspi_sck, o_qspi_cs_n;
119
        output  wire    [1:0]    o_qspi_mod;
120
        output  wire    [3:0]    o_qspi_dat;
121 14 dgisselq
        input   wire    [3:0]    i_qspi_dat;
122 2 dgisselq
        // Interrupt line
123
        output  reg             o_interrupt;
124 7 dgisselq
        // output       wire    [31:0]  o_debug;
125 2 dgisselq
 
126
        reg             spi_wr, spi_hold, spi_spd, spi_dir;
127
        reg     [31:0]   spi_in;
128
        reg     [1:0]    spi_len;
129
        wire    [31:0]   spi_out;
130
        wire            spi_valid, spi_busy;
131 4 dgisselq
        wire            w_qspi_sck, w_qspi_cs_n;
132
        wire    [3:0]    w_qspi_dat;
133
        wire    [1:0]    w_qspi_mod;
134 7 dgisselq
        // wire [22:0]  spi_dbg;
135 16 dgisselq
        llqspi  lldriver(i_clk,
136 2 dgisselq
                        spi_wr, spi_hold, spi_in, spi_len, spi_spd, spi_dir,
137
                                spi_out, spi_valid, spi_busy,
138 4 dgisselq
                        w_qspi_sck, w_qspi_cs_n, w_qspi_mod, w_qspi_dat,
139 3 dgisselq
                                i_qspi_dat);
140 2 dgisselq
 
141
        // Erase status tracking
142
        reg             write_in_progress, write_protect;
143 7 dgisselq
        reg     [(ADDRESS_WIDTH-17):0]   erased_sector;
144 2 dgisselq
        reg             dirty_sector;
145
        initial begin
146
                write_in_progress = 1'b0;
147 7 dgisselq
                erased_sector = 0;
148 2 dgisselq
                dirty_sector  = 1'b1;
149
                write_protect = 1'b1;
150
        end
151
 
152 14 dgisselq
        wire    [23:0]   w_wb_addr;
153
        generate
154
        if (ADDRESS_WIDTH>=24)
155
                assign w_wb_addr = { i_wb_addr[21:0], 2'b00 };
156
        else
157
                assign w_wb_addr = { {(24-ADDRESS_WIDTH){1'b0}}, i_wb_addr, 2'b00 };
158
        endgenerate
159
 
160
        // Repeat for spif_addr
161
        reg     [(ADDRESS_WIDTH-3):0]    spif_addr;
162
        wire    [23:0]   w_spif_addr;
163
        generate
164
        if (ADDRESS_WIDTH>=24)
165
                assign w_spif_addr = { spif_addr[21:0], 2'b00 };
166
        else
167
                assign w_spif_addr = { {(24-ADDRESS_WIDTH){1'b0}}, spif_addr, 2'b00 };
168
        endgenerate
169
 
170 2 dgisselq
        reg     [7:0]    last_status;
171 16 dgisselq
        reg     [9:0]    reset_counter;
172 2 dgisselq
        reg             quad_mode_enabled;
173 4 dgisselq
        reg             spif_cmd, spif_override;
174 2 dgisselq
        reg     [31:0]   spif_data;
175 14 dgisselq
        reg     [4:0]    state;
176 2 dgisselq
        reg             spif_ctrl, spif_req;
177 16 dgisselq
        reg             alt_cmd, alt_ctrl;
178 7 dgisselq
        wire    [(ADDRESS_WIDTH-17):0]   spif_sector;
179 16 dgisselq
        assign  spif_sector = spif_addr[(AW-1):14];
180 2 dgisselq
 
181 7 dgisselq
        // assign       o_debug = { spi_wr, spi_spd, spi_hold, state, spi_dbg };
182
 
183 2 dgisselq
        initial state = `WBQSPI_RESET;
184
        initial o_wb_ack   = 1'b0;
185
        initial o_wb_stall = 1'b1;
186
        initial spi_wr     = 1'b0;
187
        initial spi_len    = 2'b00;
188
        initial quad_mode_enabled = 1'b0;
189
        initial o_interrupt = 1'b0;
190 16 dgisselq
        initial spif_override = 1'b1;
191
        initial spif_ctrl     = 1'b0;
192
        always @(posedge i_clk)
193 4 dgisselq
        begin
194
        spif_override <= 1'b0;
195 16 dgisselq
        alt_cmd  <= (reset_counter[9:8]==2'b10)?reset_counter[3]:1'b1; // Toggle CS_n
196
        alt_ctrl <= (reset_counter[9:8]==2'b10)?reset_counter[0]:1'b1; // Toggle clock too
197 2 dgisselq
        if (state == `WBQSPI_RESET)
198
        begin
199
                // From a reset, we should
200
                //      Enable the Quad I/O mode
201
                //      Disable the Write protection bits in the status register
202
                //      Chip should already be up and running, so we can start
203
                //      immediately ....
204
                o_wb_ack <= 1'b0;
205
                o_wb_stall <= 1'b1;
206 4 dgisselq
                spi_wr   <= 1'b0;
207 2 dgisselq
                spi_hold <= 1'b0;
208
                spi_spd  <= 1'b0;
209
                spi_dir  <= 1'b0;
210
                last_status <= 8'h00;
211 4 dgisselq
                state <= `WBQSPI_RESET_QUADMODE;
212 2 dgisselq
                spif_req <= 1'b0;
213 4 dgisselq
                spif_override <= 1'b1;
214 16 dgisselq
                last_status   <= 8'h00; //
215
                reset_counter <= 10'h3fc; //
216 4 dgisselq
                        // This guarantees that we aren't starting in quad
217
                        // I/O mode, where the FPGA configuration scripts may
218
                        // have left us.
219
        end else if (state == `WBQSPI_RESET_QUADMODE)
220 2 dgisselq
        begin
221 4 dgisselq
                // Okay, so here's the problem: we don't know whether or not
222
                // the Xilinx loader started us up in Quad Read I/O idle mode.
223 14 dgisselq
                // So, thus we need to toggle the clock and CS_n, with fewer
224
                // clocks than are necessary to transmit a word.
225
                //
226 4 dgisselq
                // Not ready to handle the bus yet, so stall any requests
227
                o_wb_ack   <= 1'b0;
228
                o_wb_stall <= 1'b1;
229
 
230
                // Do something ...
231 16 dgisselq
                if (reset_counter == 10'h00)
232 2 dgisselq
                begin
233 4 dgisselq
                        spif_override <= 1'b0;
234
                        state <= `WBQSPI_IDLE;
235 16 dgisselq
 
236
                        // Find out if we can use Quad I/O mode ...
237
                        state <= `WBQSPI_READ_CONFIG;
238
                        spi_wr <= 1'b1;
239
                        spi_len <= 2'b01;
240
                        spi_in <= { 8'h35, 24'h00};
241
 
242 4 dgisselq
                end else begin
243 16 dgisselq
                        reset_counter <= reset_counter - 10'h1;
244 4 dgisselq
                        spif_override <= 1'b1;
245 2 dgisselq
                end
246
        end else if (state == `WBQSPI_IDLE)
247
        begin
248
                o_interrupt <= 1'b0;
249
                o_wb_stall <= 1'b0;
250
                o_wb_ack <= 1'b0;
251
                spif_cmd   <= i_wb_we;
252
                spif_addr  <= i_wb_addr;
253
                spif_data  <= i_wb_data;
254
                spif_ctrl  <= (i_wb_ctrl_stb)&&(~i_wb_data_stb);
255
                spif_req   <= (i_wb_ctrl_stb)||(i_wb_data_stb);
256
                spi_wr <= 1'b0; // Keep the port idle, unless told otherwise
257
                spi_hold <= 1'b0;
258
                spi_spd  <= 1'b0;
259
                spi_dir <= 1'b0; // Write (for now, 'cause of cmd)
260
                // Data register access
261 14 dgisselq
                if (i_wb_data_stb)
262 2 dgisselq
                begin
263
 
264
                        if (i_wb_we) // Request to write a page
265
                        begin
266 7 dgisselq
`ifdef  READ_ONLY
267
                                o_wb_ack <= 1'b1;
268
                                o_wb_stall <= 1'b0;
269
                        end else
270
`else
271 2 dgisselq
                                if((~write_protect)&&(~write_in_progress))
272
                                begin // 00
273
                                        spi_wr <= 1'b1;
274
                                        spi_len <= 2'b00; // 8 bits
275
                                        // Send a write enable command
276
                                        spi_in <= { 8'h06, 24'h00 };
277
                                        state <= `WBQSPI_WEN;
278
 
279
                                        o_wb_ack <= 1'b0;
280
                                        o_wb_stall <= 1'b1;
281
                                end else if (write_protect)
282
                                begin // whether or not write-in_progress ...
283
                                        // Do nothing on a write protect
284
                                        // violation
285
                                        //
286
                                        o_wb_ack <= 1'b1;
287
                                        o_wb_stall <= 1'b0;
288
                                end else begin // write is in progress, wait
289
                                        // for it to complete
290
                                        state <= `WBQSPI_WAIT_WIP_CLEAR;
291
                                        o_wb_ack <= 1'b0;
292
                                        o_wb_stall <= 1'b1;
293
                                end
294
                        end else if (~write_in_progress)
295 7 dgisselq
`endif
296 2 dgisselq
                        begin // Read access, normal mode(s)
297
                                o_wb_ack   <= 1'b0;
298
                                o_wb_stall <= 1'b1;
299
                                spi_wr     <= 1'b1;     // Write cmd to device
300
                                if (quad_mode_enabled)
301
                                begin
302 14 dgisselq
                                        spi_in <= { 8'heb, w_wb_addr };
303 2 dgisselq
                                        state <= `WBQSPI_QRD_ADDRESS;
304
                                        spi_len    <= 2'b00; // single byte, cmd only
305
                                end else begin
306 14 dgisselq
                                        spi_in <= { 8'h0b, w_wb_addr };
307 2 dgisselq
                                        state <= `WBQSPI_RD_DUMMY;
308
                                        spi_len    <= 2'b11; // cmd+addr,32bits
309
                                end
310 7 dgisselq
`ifndef READ_ONLY
311 2 dgisselq
                        end else begin
312
                                // A write is in progress ... need to stall
313
                                // the bus until the write is complete.
314
                                state <= `WBQSPI_WAIT_WIP_CLEAR;
315
                                o_wb_ack   <= 1'b0;
316
                                o_wb_stall <= 1'b1;
317 7 dgisselq
`endif
318 2 dgisselq
                        end
319 14 dgisselq
                end else if ((i_wb_ctrl_stb)&&(i_wb_we))
320 2 dgisselq
                begin
321 7 dgisselq
`ifdef  READ_ONLY
322
                        o_wb_ack   <= 1'b1;
323
                        o_wb_stall <= 1'b0;
324
`else
325 2 dgisselq
                        o_wb_stall <= 1'b1;
326
                        case(i_wb_addr[1:0])
327
                        2'b00: begin // Erase command register
328 16 dgisselq
                                write_protect <= !i_wb_data[28];
329 2 dgisselq
                                o_wb_stall <= 1'b0;
330
 
331 16 dgisselq
                                if((i_wb_data[31])&&(!write_in_progress))
332 2 dgisselq
                                begin
333
                                        // Command an erase--ack it immediately
334
 
335
                                        o_wb_ack <= 1'b1;
336
                                        o_wb_stall <= 1'b0;
337
 
338
                                        if ((i_wb_data[31])&&(~write_protect))
339
                                        begin
340
                                                spi_wr <= 1'b1;
341
                                                spi_len <= 2'b00;
342
                                                // Send a write enable command
343
                                                spi_in <= { 8'h06, 24'h00 };
344
                                                state <= `WBQSPI_ERASE_CMD;
345
                                                o_wb_stall <= 1'b1;
346
                                        end
347
                                end else if (i_wb_data[31])
348
                                begin
349
                                        state <= `WBQSPI_WAIT_WIP_CLEAR;
350
                                        o_wb_ack   <= 1'b1;
351
                                        o_wb_stall <= 1'b1;
352
                                end else
353
                                        o_wb_ack   <= 1'b1;
354
                                        o_wb_stall <= 1'b0;
355
                                end
356
                        2'b01: begin
357
                                // Write the configuration register
358
                                o_wb_ack <= 1'b1;
359
                                o_wb_stall <= 1'b1;
360
 
361
                                // Need to send a write enable command first
362
                                spi_wr <= 1'b1;
363
                                spi_len <= 2'b00; // 8 bits
364
                                // Send a write enable command
365
                                spi_in <= { 8'h06, 24'h00 };
366
                                state <= `WBQSPI_WRITE_CONFIG;
367
                                end
368
                        2'b10: begin
369
                                // Write the status register
370
                                o_wb_ack <= 1'b1; // Ack immediately
371
                                o_wb_stall <= 1'b1; // Stall other cmds
372
                                // Need to send a write enable command first
373
                                spi_wr <= 1'b1;
374
                                spi_len <= 2'b00; // 8 bits
375
                                // Send a write enable command
376
                                spi_in <= { 8'h06, 24'h00 };
377
                                state <= `WBQSPI_WRITE_STATUS;
378
                                end
379
                        2'b11: begin // Write the ID register??? makes no sense
380
                                o_wb_ack <= 1'b1;
381
                                o_wb_stall <= 1'b0;
382
                                end
383
                        endcase
384 7 dgisselq
`endif
385 16 dgisselq
                end else if (i_wb_ctrl_stb) // &&(!i_wb_we))
386 2 dgisselq
                begin
387
                        case(i_wb_addr[1:0])
388
                        2'b00: begin // Read local register
389
                                if (write_in_progress) // Read status
390
                                begin// register, is write still in progress?
391
                                        state <= `WBQSPI_READ_STATUS;
392
                                        spi_wr <= 1'b1;
393
                                        spi_len <= 2'b01;// 8 bits out, 8 bits in
394
                                        spi_in <= { 8'h05, 24'h00};
395
 
396
                                        o_wb_ack <= 1'b0;
397
                                        o_wb_stall <= 1'b1;
398
                                end else begin // Return w/o talking to device
399
                                        o_wb_ack <= 1'b1;
400
                                        o_wb_stall <= 1'b0;
401
                                        o_wb_data <= { write_in_progress,
402
                                                dirty_sector, spi_busy,
403
                                                ~write_protect,
404
                                                quad_mode_enabled,
405 7 dgisselq
                                                {(29-ADDRESS_WIDTH){1'b0}},
406 2 dgisselq
                                                erased_sector, 14'h000 };
407
                                end end
408
                        2'b01: begin // Read configuration register
409
                                state <= `WBQSPI_READ_CONFIG;
410
                                spi_wr <= 1'b1;
411
                                spi_len <= 2'b01;
412
                                spi_in <= { 8'h35, 24'h00};
413
 
414
                                o_wb_ack <= 1'b0;
415
                                o_wb_stall <= 1'b1;
416
                                end
417
                        2'b10: begin // Read status register
418
                                state <= `WBQSPI_READ_STATUS;
419
                                spi_wr <= 1'b1;
420
                                spi_len <= 2'b01; // 8 bits out, 8 bits in
421
                                spi_in <= { 8'h05, 24'h00};
422
 
423
                                o_wb_ack <= 1'b0;
424
                                o_wb_stall <= 1'b1;
425
                                end
426
                        2'b11: begin // Read ID register
427
                                state <= `WBQSPI_READ_ID_CMD;
428
                                spi_wr <= 1'b1;
429
                                spi_len <= 2'b00;
430
                                spi_in <= { 8'h9f, 24'h00};
431
 
432
                                o_wb_ack <= 1'b0;
433
                                o_wb_stall <= 1'b1;
434
                                end
435
                        endcase
436 7 dgisselq
`ifndef READ_ONLY
437 2 dgisselq
                end else if ((~i_wb_cyc)&&(write_in_progress))
438
                begin
439
                        state <= `WBQSPI_IDLE_CHECK_WIP;
440
                        spi_wr <= 1'b1;
441
                        spi_len <= 2'b01; // 8 bits out, 8 bits in
442
                        spi_in <= { 8'h05, 24'h00};
443
 
444
                        o_wb_ack <= 1'b0;
445
                        o_wb_stall <= 1'b1;
446 7 dgisselq
`endif
447 2 dgisselq
                end
448
        end else if (state == `WBQSPI_RDIDLE)
449
        begin
450
                spi_wr <= 1'b0;
451
                o_wb_stall <= 1'b0;
452
                o_wb_ack <= 1'b0;
453
                spif_cmd   <= i_wb_we;
454
                spif_addr  <= i_wb_addr;
455
                spif_data  <= i_wb_data;
456
                spif_ctrl  <= (i_wb_ctrl_stb)&&(~i_wb_data_stb);
457
                spif_req   <= (i_wb_ctrl_stb)||(i_wb_data_stb);
458
                spi_hold <= 1'b0;
459
                spi_spd<= 1'b1;
460
                spi_dir <= 1'b0; // Write (for now)
461 16 dgisselq
                if ((i_wb_data_stb)&&(!i_wb_we))
462 2 dgisselq
                begin // Continue our read ... send the new address / mode
463
                        o_wb_stall <= 1'b1;
464
                        spi_wr <= 1'b1;
465 4 dgisselq
                        spi_len <= 2'b10; // Write address, but not mode byte
466 14 dgisselq
                        spi_in <= { w_wb_addr, 8'ha0 };
467 2 dgisselq
                        state <= `WBQSPI_QRD_DUMMY;
468 16 dgisselq
                end else if((i_wb_ctrl_stb)&&(!i_wb_we)&&(i_wb_addr[1:0] == 2'b00))
469 2 dgisselq
                begin
470
                        // A local read that doesn't touch the device, so leave
471
                        // the device in its current state
472
                        o_wb_stall <= 1'b0;
473
                        o_wb_ack <= 1'b1;
474
                        o_wb_data <= { write_in_progress,
475
                                        dirty_sector, spi_busy,
476
                                        ~write_protect,
477
                                        quad_mode_enabled,
478 7 dgisselq
                                        {(29-ADDRESS_WIDTH){1'b0}},
479 2 dgisselq
                                        erased_sector, 14'h000 };
480 14 dgisselq
                end else if(((i_wb_ctrl_stb)||(i_wb_data_stb)))
481 2 dgisselq
                begin // Need to release the device from quad mode for all else
482
                        o_wb_ack   <= 1'b0;
483
                        o_wb_stall <= 1'b1;
484
                        spi_wr <= 1'b1;
485
                        spi_len <= 2'b11;
486
                        spi_in <= 32'h00;
487
                        state <= `WBQSPI_WBDECODE;
488
                end
489
        end else if (state == `WBQSPI_WBDECODE)
490
        begin
491
                // We were in quad SPI read mode, and had to get out.
492
                // Now we've got a command (not data read) to read and
493
                // execute.  Accomplish what we would've done while in the
494
                // IDLE state here, save only that we don't have to worry
495
                // about data reads, and we need to operate on a stored
496
                // version of the bus command
497
                o_wb_stall <= 1'b1;
498
                o_wb_ack <= 1'b0;
499
                spi_wr <= 1'b0; // Keep the port idle, unless told otherwise
500
                spi_hold <= 1'b0;
501
                spi_spd <= 1'b0;
502
                spi_dir <= 1'b0;
503
                spif_req<= (spif_req) && (i_wb_cyc);
504
                if ((~spi_busy)&&(o_qspi_cs_n)&&(~spi_wr)) // only in full idle ...
505
                begin
506
                        // Data register access
507
                        if (~spif_ctrl)
508
                        begin
509
                                if (spif_cmd) // Request to write a page
510
                                begin
511 7 dgisselq
`ifdef  READ_ONLY
512
                                        o_wb_ack <= spif_req;
513
                                        o_wb_stall <= 1'b0;
514
                                        state <= `WBQSPI_IDLE;
515
`else
516 2 dgisselq
                                        if((~write_protect)&&(~write_in_progress))
517
                                        begin // 00
518
                                                spi_wr <= 1'b1;
519
                                                spi_len <= 2'b00; // 8 bits
520
                                                // Send a write enable command
521
                                                spi_in <= { 8'h06, 24'h00 };
522
                                                state <= `WBQSPI_WEN;
523
 
524
                                                o_wb_ack <= 1'b0;
525
                                                o_wb_stall <= 1'b1;
526
                                        end else if (write_protect)
527
                                        begin // whether or not write-in_progress ...
528
                                                // Do nothing on a write protect
529
                                                // violation
530
                                                //
531
                                                o_wb_ack <= spif_req;
532
                                                o_wb_stall <= 1'b0;
533
                                                state <= `WBQSPI_IDLE;
534
                                        end else begin // write is in progress, wait
535
                                                // for it to complete
536
                                                state <= `WBQSPI_WAIT_WIP_CLEAR;
537
                                                o_wb_ack <= 1'b0;
538
                                                o_wb_stall <= 1'b1;
539
                                        end
540
                                // end else if (~write_in_progress) // always true
541
                                // but ... we wouldn't get here on a normal read access
542 7 dgisselq
`endif
543 2 dgisselq
                                end else begin
544 7 dgisselq
                                        // Something's wrong, we should never
545
                                        //   get here
546 2 dgisselq
                                        // Attempt to go to idle to recover
547
                                        state <= `WBQSPI_IDLE;
548
                                end
549
                        end else if ((spif_ctrl)&&(spif_cmd))
550
                        begin
551 7 dgisselq
`ifdef  READ_ONLY
552
                                o_wb_ack   <= spif_req;
553
                                o_wb_stall <= 1'b0;
554
                                state <= `WBQSPI_IDLE;
555
`else
556 2 dgisselq
                                o_wb_stall <= 1'b1;
557
                                case(spif_addr[1:0])
558
                                2'b00: begin // Erase command register
559
                                        o_wb_ack   <= spif_req;
560
                                        o_wb_stall <= 1'b0;
561
                                        state <= `WBQSPI_IDLE;
562
                                        write_protect <= ~spif_data[28];
563
                                        // Are we commanding an erase?
564
                                        // We're in read mode, writes cannot
565
                                        // be in progress, so ...
566
                                        if (spif_data[31]) // Command an erase
567
                                        begin
568
                                                // Since we're not going back
569
                                                // to IDLE, we must stall the
570
                                                // bus here
571
                                                o_wb_stall <= 1'b1;
572
                                                spi_wr <= 1'b1;
573
                                                spi_len <= 2'b00;
574
                                                // Send a write enable command
575
                                                spi_in <= { 8'h06, 24'h00 };
576
                                                state <= `WBQSPI_ERASE_CMD;
577
                                        end end
578
                                2'b01: begin
579
                                        // Write the configuration register
580
                                        o_wb_ack <= spif_req;
581
                                        o_wb_stall <= 1'b1;
582
 
583
                                        // Need to send a write enable command first
584
                                        spi_wr <= 1'b1;
585
                                        spi_len <= 2'b00; // 8 bits
586
                                        // Send a write enable command
587
                                        spi_in <= { 8'h06, 24'h00 };
588
                                        state <= `WBQSPI_WRITE_CONFIG;
589
                                        end
590
                                2'b10: begin
591
                                        // Write the status register
592
                                        o_wb_ack <= spif_req; // Ack immediately
593
                                        o_wb_stall <= 1'b1; // Stall other cmds
594
                                        // Need to send a write enable command first
595
                                        spi_wr <= 1'b1;
596
                                        spi_len <= 2'b00; // 8 bits
597
                                        // Send a write enable command
598
                                        spi_in <= { 8'h06, 24'h00 };
599
                                        state <= `WBQSPI_WRITE_STATUS;
600
                                        end
601
                                2'b11: begin // Write the ID register??? makes no sense
602
                                        o_wb_ack <= spif_req;
603
                                        o_wb_stall <= 1'b0;
604
                                        state <= `WBQSPI_IDLE;
605
                                        end
606
                                endcase
607 7 dgisselq
`endif
608 2 dgisselq
                        end else begin // on (~spif_we)
609
                                case(spif_addr[1:0])
610
                                2'b00: begin // Read local register
611
                                        // Nonsense case--would've done this
612
                                        // already
613
                                        state <= `WBQSPI_IDLE;
614
                                        o_wb_ack <= spif_req;
615
                                        o_wb_stall <= 1'b0;
616
                                        end
617
                                2'b01: begin // Read configuration register
618
                                        state <= `WBQSPI_READ_CONFIG;
619
                                        spi_wr <= 1'b1;
620
                                        spi_len <= 2'b01;
621
                                        spi_in <= { 8'h35, 24'h00};
622
 
623
                                        o_wb_ack <= 1'b0;
624
                                        o_wb_stall <= 1'b1;
625
                                        end
626
                                2'b10: begin // Read status register
627
                                        state <= `WBQSPI_READ_STATUS;
628
                                        spi_wr <= 1'b1;
629
                                        spi_len <= 2'b01; // 8 bits out, 8 bits in
630
                                        spi_in <= { 8'h05, 24'h00};
631
 
632
                                        o_wb_ack <= 1'b0;
633
                                        o_wb_stall <= 1'b1;
634
                                        end
635
                                2'b11: begin // Read ID register
636
                                        state <= `WBQSPI_READ_ID_CMD;
637
                                        spi_wr <= 1'b1;
638
                                        spi_len <= 2'b00;
639
                                        spi_in <= { 8'h9f, 24'h00};
640
 
641
                                        o_wb_ack <= 1'b0;
642
                                        o_wb_stall <= 1'b1;
643
                                        end
644
                                endcase
645
                        end
646
                end
647 7 dgisselq
//
648
//
649
//      READ DATA section: for both data and commands
650
//
651 2 dgisselq
        end else if (state == `WBQSPI_RD_DUMMY)
652
        begin
653
                o_wb_ack   <= 1'b0;
654
                o_wb_stall <= 1'b1;
655
 
656
                spi_wr <= 1'b1; // Non-stop
657
                // Need to read one byte of dummy data,
658
                // just to consume 8 clocks
659
                spi_in <= { 8'h00, 24'h00 };
660
                spi_len <= 2'b00; // Read 8 bits
661
                spi_spd <= 1'b0;
662
                spi_hold <= 1'b0;
663
                spif_req<= (spif_req) && (i_wb_cyc);
664
 
665
                if ((~spi_busy)&&(~o_qspi_cs_n))
666
                        // Our command was accepted
667
                        state <= `WBQSPI_READ_CMD;
668
        end else if (state == `WBQSPI_QRD_ADDRESS)
669
        begin
670
                // We come in here immediately upon issuing a QRD read
671
                // command (8-bits), but we have to pause to give the
672
                // address (24-bits) and mode (8-bits) in quad speed.
673
                o_wb_ack   <= 1'b0;
674
                o_wb_stall <= 1'b1;
675
 
676
                spi_wr <= 1'b1; // Non-stop
677 14 dgisselq
                spi_in <= { w_spif_addr, 8'ha0 };
678 4 dgisselq
                spi_len <= 2'b10; // Write address, not mode byte
679 2 dgisselq
                spi_spd <= 1'b1;
680
                spi_dir <= 1'b0; // Still writing
681
                spi_hold <= 1'b0;
682
                spif_req<= (spif_req) && (i_wb_cyc);
683
 
684
                if ((~spi_busy)&&(spi_spd))
685
                        // Our command was accepted
686
                        state <= `WBQSPI_QRD_DUMMY;
687
        end else if (state == `WBQSPI_QRD_DUMMY)
688
        begin
689
                o_wb_ack   <= 1'b0;
690
                o_wb_stall <= 1'b1;
691
 
692
                spi_wr <= 1'b1; // Non-stop
693
                spi_in <= { 8'ha0, 24'h00 }; // Mode byte, then 2 bytes dummy
694 9 dgisselq
                spi_len <= 2'b10; // Write 24 bits
695 2 dgisselq
                spi_spd <= 1'b1;
696
                spi_dir <= 1'b0; // Still writing
697
                spi_hold <= 1'b0;
698
                spif_req<= (spif_req) && (i_wb_cyc);
699
 
700
                if ((~spi_busy)&&(spi_in[31:28] == 4'ha))
701
                        // Our command was accepted
702
                        state <= `WBQSPI_READ_CMD;
703
        end else if (state == `WBQSPI_READ_CMD)
704
        begin // Issue our first command to read 32 bits.
705
                o_wb_ack   <= 1'b0;
706
                o_wb_stall <= 1'b1;
707
 
708
                spi_wr <= 1'b1;
709
                spi_in <= { 8'hff, 24'h00 }; // Empty
710
                spi_len <= 2'b11; // Read 32 bits
711
                spi_dir <= 1'b1; // Now reading
712
                spi_hold <= 1'b0;
713
                spif_req<= (spif_req) && (i_wb_cyc);
714
                if ((spi_valid)&&(spi_len == 2'b11))
715
                        state <= `WBQSPI_READ_DATA;
716
        end else if (state == `WBQSPI_READ_DATA)
717
        begin
718
                // Pipelined read support
719 14 dgisselq
                spi_wr <=((i_wb_data_stb)&&(~i_wb_we)&&(i_wb_addr== (spif_addr+1)));
720 2 dgisselq
                spi_in <= 32'h00;
721
                spi_len <= 2'b11;
722
                // Don't adjust the speed here, it was set in the setup
723 4 dgisselq
                spi_dir <= 1'b1;        // Now we get to read
724
                // Don't let the device go to idle until the bus cycle ends.
725
                //      This actually prevents a *really* nasty race condition,
726
                //      where the strobe comes in after the lower level device
727
                //      has decided to stop waiting.  The write is then issued,
728
                //      but no one is listening.  By leaving the device open,
729
                //      the device is kept in a state where a valid strobe
730
                //      here will be useful.  Of course, we don't accept
731
                //      all commands, just reads.  Further, the strobe needs
732
                //      to be high for two clocks cycles without changing
733
                //      anything on the bus--one for us to notice it and pull
734
                //      our head out of the sand, and a second for whoever
735
                //      owns the bus to realize their command went through.
736
                spi_hold <= 1'b1;
737 2 dgisselq
                spif_req<= (spif_req) && (i_wb_cyc);
738
                if ((spi_valid)&&(~spi_in[31]))
739
                begin // Single pulse acknowledge and write data out
740
                        o_wb_ack <= spif_req;
741
                        o_wb_stall <= (~spi_wr);
742
                        // adjust endian-ness to match the PC
743 14 dgisselq
                        o_wb_data <= spi_out;
744 2 dgisselq
                        state <= (spi_wr)?`WBQSPI_READ_DATA
745
                                : ((spi_spd) ? `WBQSPI_WAIT_TIL_RDIDLE : `WBQSPI_WAIT_TIL_IDLE);
746
                        spif_req <= spi_wr;
747 4 dgisselq
                        spi_hold <= (~spi_wr);
748 2 dgisselq
                        if (spi_wr)
749
                                spif_addr <= i_wb_addr;
750 4 dgisselq
                end else if (~i_wb_cyc)
751
                begin // FAIL SAFE: If the bus cycle ends, forget why we're
752
                        // here, just go back to idle
753
                        state <= ((spi_spd) ? `WBQSPI_WAIT_TIL_RDIDLE : `WBQSPI_WAIT_TIL_IDLE);
754
                        spi_hold <= 1'b0;
755
                        o_wb_ack <= 1'b0;
756
                        o_wb_stall <= 1'b1;
757 2 dgisselq
                end else begin
758
                        o_wb_ack <= 1'b0;
759
                        o_wb_stall <= 1'b1;
760
                end
761
        end else if (state == `WBQSPI_WAIT_TIL_RDIDLE)
762
        begin // Wait 'til idle, but then go to fast read idle instead of full
763
                spi_wr     <= 1'b0;     // idle
764
                spi_hold   <= 1'b0;
765
                o_wb_stall <= 1'b1;
766
                o_wb_ack   <= 1'b0;
767
                spif_req   <= 1'b0;
768
                if ((~spi_busy)&&(o_qspi_cs_n)&&(~spi_wr)) // Wait for a full
769
                begin // clearing of the SPI port before moving on
770
                        state <= `WBQSPI_RDIDLE;
771
                        o_wb_stall <= 1'b0;
772
                        o_wb_ack   <= 1'b0;// Shouldn't be acking anything here
773
                end
774
        end else if (state == `WBQSPI_READ_ID_CMD)
775
        begin // We came into here immediately after issuing a 0x9f command
776
                // Now we need to read 32 bits of data.  Result should be
777
                // 0x0102154d (8'h manufacture ID, 16'h device ID, followed
778
                // by the number of extended bytes available 8'h4d).
779
                o_wb_ack <= 1'b0;
780
                o_wb_stall<= 1'b1;
781
 
782
                spi_wr <= 1'b1; // No data to send, but need four bytes, since
783
                spi_len <= 2'b11; // 32 bits of data are ... useful
784
                spi_in <= 32'h00; // Irrelevant
785
                spi_spd <= 1'b0; // Slow speed
786
                spi_dir <= 1'b1; // Reading
787
                spi_hold <= 1'b0;
788
                spif_req <= (spif_req) && (i_wb_cyc);
789
                if ((~spi_busy)&&(~o_qspi_cs_n)&&(spi_len == 2'b11))
790
                        // Our command was accepted, now go read the result
791
                        state <= `WBQSPI_READ_ID;
792
        end else if (state == `WBQSPI_READ_ID)
793
        begin
794
                o_wb_ack <= 1'b0; // Assuming we're still waiting
795
                o_wb_stall <= 1'b1;
796
 
797 4 dgisselq
                spi_wr <= 1'b0; // No more writes, we've already written the cmd
798 2 dgisselq
                spi_hold <= 1'b0;
799
                spif_req <= (spif_req) && (i_wb_cyc);
800
 
801
                // Here, we just wait until the result comes back
802
                // The problem is, the result may be the previous result.
803
                // So we use spi_len as an indicator
804
                spi_len <= 2'b00;
805
                if((spi_valid)&&(spi_len==2'b00))
806
                begin // Put the results out as soon as possible
807
                        o_wb_data <= spi_out[31:0];
808
                        o_wb_ack <= spif_req;
809
                        spif_req <= 1'b0;
810 4 dgisselq
                end else if ((~spi_busy)&&(o_qspi_cs_n))
811 2 dgisselq
                begin
812
                        state <= `WBQSPI_IDLE;
813
                        o_wb_stall <= 1'b0;
814
                end
815
        end else if (state == `WBQSPI_READ_STATUS)
816
        begin // We enter after the command has been given, for now just
817
                // read and return
818
                spi_wr <= 1'b0;
819
                o_wb_ack <= 1'b0;
820
                spi_hold <= 1'b0;
821
                spif_req <= (spif_req) && (i_wb_cyc);
822
                if (spi_valid)
823
                begin
824
                        o_wb_ack <= spif_req;
825
                        o_wb_stall <= 1'b1;
826
                        spif_req <= 1'b0;
827
                        last_status <= spi_out[7:0];
828
                        write_in_progress <= spi_out[0];
829
                        if (spif_addr[1:0] == 2'b00) // Local read, checking
830
                        begin // status, 'cause we're writing
831
                                o_wb_data <= { spi_out[0],
832
                                        dirty_sector, spi_busy,
833
                                        ~write_protect,
834
                                        quad_mode_enabled,
835 7 dgisselq
                                        {(29-ADDRESS_WIDTH){1'b0}},
836 2 dgisselq
                                        erased_sector, 14'h000 };
837
                        end else begin
838
                                o_wb_data <= { 24'h00, spi_out[7:0] };
839
                        end
840
                end
841
 
842
                if ((~spi_busy)&&(~spi_wr))
843
                        state <= `WBQSPI_IDLE;
844
        end else if (state == `WBQSPI_READ_CONFIG)
845
        begin // We enter after the command has been given, for now just
846
                // read and return
847
                spi_wr <= 1'b0;
848
                o_wb_ack <= 1'b0;
849
                o_wb_stall <= 1'b1;
850
                spi_hold <= 1'b0;
851
                spif_req <= (spif_req) && (i_wb_cyc);
852
 
853
                if (spi_valid)
854
                begin
855
                        o_wb_data <= { 24'h00, spi_out[7:0] };
856
                        quad_mode_enabled <= spi_out[1];
857
                end
858
 
859
                if ((~spi_busy)&&(~spi_wr))
860
                begin
861
                        state <= `WBQSPI_IDLE;
862
                        o_wb_ack   <= spif_req;
863
                        o_wb_stall <= 1'b0;
864
                        spif_req <= 1'b0;
865
                end
866 7 dgisselq
 
867
//
868
//
869
//      Write/erase data section
870
//
871
`ifndef READ_ONLY
872
        end else if (state == `WBQSPI_WAIT_WIP_CLEAR)
873
        begin
874
                o_wb_stall <= 1'b1;
875
                o_wb_ack   <= 1'b0;
876
                spi_wr <= 1'b0;
877
                spif_req<= (spif_req) && (i_wb_cyc);
878
                if (~spi_busy)
879
                begin
880
                        spi_wr   <= 1'b1;
881
                        spi_in   <= { 8'h05, 24'h0000 };
882
                        spi_hold <= 1'b1;
883
                        spi_len  <= 2'b01; // 16 bits write, so we can read 8
884
                        state <= `WBQSPI_CHECK_WIP_CLEAR;
885
                        spi_spd  <= 1'b0; // Slow speed
886
                        spi_dir  <= 1'b0;
887
                end
888
        end else if (state == `WBQSPI_CHECK_WIP_CLEAR)
889
        begin
890
                o_wb_stall <= 1'b1;
891
                o_wb_ack   <= 1'b0;
892
                // Repeat as often as necessary until we are clear
893
                spi_wr <= 1'b1;
894
                spi_in <= 32'h0000; // Values here are actually irrelevant
895
                spi_hold <= 1'b1;
896
                spi_len <= 2'b00; // One byte at a time
897
                spi_spd  <= 1'b0; // Slow speed
898
                spi_dir  <= 1'b0;
899
                spif_req<= (spif_req) && (i_wb_cyc);
900
                if ((spi_valid)&&(~spi_out[0]))
901
                begin
902
                        state <= `WBQSPI_CHECK_WIP_DONE;
903
                        spi_wr   <= 1'b0;
904
                        spi_hold <= 1'b0;
905
                        write_in_progress <= 1'b0;
906
                        last_status <= spi_out[7:0];
907
                end
908
        end else if (state == `WBQSPI_CHECK_WIP_DONE)
909
        begin
910
                o_wb_stall <= 1'b1;
911
                o_wb_ack   <= 1'b0;
912
                // Let's let the SPI port come back to a full idle,
913
                // and the chip select line go low before continuing
914
                spi_wr   <= 1'b0;
915
                spi_len  <= 2'b00;
916
                spi_hold <= 1'b0;
917
                spi_spd  <= 1'b0; // Slow speed
918
                spi_dir  <= 1'b0;
919
                spif_req<= (spif_req) && (i_wb_cyc);
920
                if ((o_qspi_cs_n)&&(~spi_busy)) // Chip select line is high, we can continue
921
                begin
922
                        spi_wr   <= 1'b0;
923
                        spi_hold <= 1'b0;
924
 
925
                        casez({ spif_cmd, spif_ctrl, spif_addr[1:0] })
926
                        4'b00??: begin // Read data from ... somewhere
927
                                spi_wr     <= 1'b1;     // Write cmd to device
928
                                if (quad_mode_enabled)
929
                                begin
930 14 dgisselq
                                        spi_in <= { 8'heb, w_spif_addr };
931 7 dgisselq
                                        state <= `WBQSPI_QRD_ADDRESS;
932
                                        // spi_len    <= 2'b00; // single byte, cmd only
933
                                end else begin
934 14 dgisselq
                                        spi_in <= { 8'h0b, w_spif_addr };
935 7 dgisselq
                                        state <= `WBQSPI_RD_DUMMY;
936
                                        spi_len    <= 2'b11; // Send cmd and addr
937
                                end end
938
                        4'b10??: begin // Write data to ... anywhere
939
                                spi_wr <= 1'b1;
940
                                spi_len <= 2'b00; // 8 bits
941
                                // Send a write enable command
942
                                spi_in <= { 8'h06, 24'h00 };
943
                                state <= `WBQSPI_WEN;
944
                                end
945
                        4'b0110: begin // Read status register
946
                                state <= `WBQSPI_READ_STATUS;
947
                                spi_wr <= 1'b1;
948
                                spi_len <= 2'b01; // 8 bits out, 8 bits in
949
                                spi_in <= { 8'h05, 24'h00};
950
                                end
951
                        4'b0111: begin
952
                                state <= `WBQSPI_READ_ID_CMD;
953
                                spi_wr <= 1'b1;
954
                                spi_len <= 2'b00;
955
                                spi_in <= { 8'h9f, 24'h00};
956
                                end
957
                        default: begin //
958
                                o_wb_stall <= 1'b1;
959
                                o_wb_ack <= spif_req;
960
                                state <= `WBQSPI_WAIT_TIL_IDLE;
961
                                end
962
                        endcase
963
                // spif_cmd   <= i_wb_we;
964
                // spif_addr  <= i_wb_addr;
965
                // spif_data  <= i_wb_data;
966
                // spif_ctrl  <= (i_wb_ctrl_stb)&&(~i_wb_data_stb);
967
                // spi_wr <= 1'b0; // Keep the port idle, unless told otherwise
968
                end
969
        end else if (state == `WBQSPI_WEN)
970
        begin // We came here after issuing a write enable command
971
                spi_wr <= 1'b0;
972
                o_wb_ack <= 1'b0;
973
                o_wb_stall <= 1'b1;
974
                spif_req<= (spif_req) && (i_wb_cyc);
975
                if ((~spi_busy)&&(o_qspi_cs_n)&&(~spi_wr)) // Let's come to a full stop
976
                        state <= (quad_mode_enabled)?`WBQSPI_QPP:`WBQSPI_PP;
977
                        // state <= `WBQSPI_PP;
978
        end else if (state == `WBQSPI_PP)
979
        begin // We come here under a full stop / full port idle mode
980
                // Issue our command immediately
981
                spi_wr <= 1'b1;
982 14 dgisselq
                spi_in <= { 8'h02, w_spif_addr };
983 7 dgisselq
                spi_len <= 2'b11;
984
                spi_hold <= 1'b1;
985
                spi_spd  <= 1'b0;
986
                spi_dir  <= 1'b0; // Writing
987
                spif_req<= (spif_req) && (i_wb_cyc);
988
 
989
                // Once we get busy, move on
990
                if (spi_busy)
991
                        state <= `WBQSPI_WR_DATA;
992
                if (spif_sector == erased_sector)
993
                        dirty_sector <= 1'b1;
994
        end else if (state == `WBQSPI_QPP)
995
        begin // We come here under a full stop / full port idle mode
996
                // Issue our command immediately
997
                spi_wr <= 1'b1;
998 14 dgisselq
                spi_in <= { 8'h32, w_spif_addr };
999 7 dgisselq
                spi_len <= 2'b11;
1000
                spi_hold <= 1'b1;
1001
                spi_spd  <= 1'b0;
1002
                spi_dir  <= 1'b0; // Writing
1003
                spif_req<= (spif_req) && (i_wb_cyc);
1004
 
1005
                // Once we get busy, move on
1006
                if (spi_busy)
1007
                begin
1008
                        // spi_wr is irrelevant here ...
1009
                        // Set the speed value once, but wait til we get busy
1010
                        // to do so.
1011
                        spi_spd <= 1'b1;
1012
                        state <= `WBQSPI_WR_DATA;
1013
                end
1014
                if (spif_sector == erased_sector)
1015
                        dirty_sector <= 1'b1;
1016
        end else if (state == `WBQSPI_WR_DATA)
1017
        begin
1018
                o_wb_stall <= 1'b1;
1019
                o_wb_ack   <= 1'b0;
1020
                spi_wr   <= 1'b1; // write without waiting
1021 14 dgisselq
                spi_in   <= spif_data;
1022 7 dgisselq
                spi_len  <= 2'b11; // Write 4 bytes
1023
                spi_hold <= 1'b1;
1024
                if (~spi_busy)
1025
                begin
1026
                        o_wb_ack <= spif_req; // Ack when command given
1027
                        state <= `WBQSPI_WR_BUS_CYCLE;
1028
                end
1029
                spif_req<= (spif_req) && (i_wb_cyc);
1030
        end else if (state == `WBQSPI_WR_BUS_CYCLE)
1031
        begin
1032
                o_wb_ack <= 1'b0; // Turn off our ack and stall flags
1033
                o_wb_stall <= 1'b1;
1034
                spi_wr <= 1'b0;
1035
                spi_hold <= 1'b1;
1036
                write_in_progress <= 1'b1;
1037
                spif_req<= (spif_req) && (i_wb_cyc);
1038
                if (~i_wb_cyc)
1039
                begin
1040
                        state <= `WBQSPI_WAIT_TIL_IDLE;
1041
                        spi_hold <= 1'b0;
1042
                end else if (spi_wr)
1043
                begin // Give the SPI a chance to get busy on the last write
1044
                        // Do nothing here.
1045
                end else if ((i_wb_data_stb)&&(i_wb_we)
1046
                                &&(i_wb_addr == (spif_addr+1))
1047 16 dgisselq
                                &&(i_wb_addr[(AW-1):6]==spif_addr[(AW-1):6]))
1048 7 dgisselq
                begin
1049
                        spif_cmd  <= 1'b1;
1050
                        spif_data <= i_wb_data;
1051
                        spif_addr <= i_wb_addr;
1052
                        spif_ctrl  <= 1'b0;
1053
                        spif_req<= 1'b1;
1054
                        // We'll keep the bus stalled on this request
1055
                        // for a while
1056
                        state <= `WBQSPI_WR_DATA;
1057
                        o_wb_ack   <= 1'b0;
1058
                        o_wb_stall <= 1'b0;
1059
                end else if ((i_wb_data_stb|i_wb_ctrl_stb)&&(~o_wb_ack)) // Writing out of bounds
1060
                begin
1061
                        spi_hold <= 1'b0;
1062
                        spi_wr   <= 1'b0;
1063
                        state <= `WBQSPI_WAIT_TIL_IDLE;
1064
                end // Otherwise we stay here
1065 2 dgisselq
        end else if (state == `WBQSPI_WRITE_CONFIG)
1066
        begin // We enter immediately after commanding a WEN
1067
                o_wb_ack   <= 1'b0;
1068
                o_wb_stall <= 1'b1;
1069
 
1070
                spi_len <= 2'b10;
1071
                spi_in <= { 8'h01, last_status, spif_data[7:0], 8'h00 };
1072
                spi_wr <= 1'b0;
1073
                spi_hold <= 1'b0;
1074
                spif_req <= (spif_req) && (i_wb_cyc);
1075
                if ((~spi_busy)&&(~spi_wr))
1076
                begin
1077
                        spi_wr <= 1'b1;
1078
                        state <= `WBQSPI_WAIT_TIL_IDLE;
1079
                        write_in_progress <= 1'b1;
1080
                        quad_mode_enabled <= spif_data[1];
1081
                end
1082
        end else if (state == `WBQSPI_WRITE_STATUS)
1083
        begin // We enter immediately after commanding a WEN
1084
                o_wb_ack   <= 1'b0;
1085
                o_wb_stall <= 1'b1;
1086
 
1087
                spi_len <= 2'b01;
1088
                spi_in <= { 8'h01, spif_data[7:0], 16'h00 };
1089
                // last_status <= i_wb_data[7:0]; // We'll read this in a moment
1090
                spi_wr <= 1'b0;
1091
                spi_hold <= 1'b0;
1092
                spif_req <= (spif_req) && (i_wb_cyc);
1093
                if ((~spi_busy)&&(~spi_wr))
1094
                begin
1095
                        spi_wr <= 1'b1;
1096
                        last_status <= spif_data[7:0];
1097
                        write_in_progress <= 1'b1;
1098
                        if(((last_status[6])||(last_status[5]))
1099
                                &&((~spif_data[6])&&(~spif_data[5])))
1100
                                state <= `WBQSPI_CLEAR_STATUS;
1101
                        else
1102
                                state <= `WBQSPI_WAIT_TIL_IDLE;
1103
                end
1104
        end else if (state == `WBQSPI_ERASE_CMD)
1105
        begin // Know that WIP is clear on entry, WEN has just been commanded
1106
                spi_wr     <= 1'b0;
1107
                o_wb_ack   <= 1'b0;
1108
                o_wb_stall <= 1'b1;
1109
                spi_hold   <= 1'b0;
1110
                spi_spd <= 1'b0;
1111
                spi_dir <= 1'b0;
1112
                spif_req <= (spif_req) && (i_wb_cyc);
1113
 
1114
                // Here's the erase command
1115
                spi_in <= { 8'hd8, 2'h0, spif_data[19:14], 14'h000, 2'b00 };
1116
                spi_len <= 2'b11; // 32 bit write
1117
                // together with setting our copy of the WIP bit
1118
                write_in_progress <= 1'b1;
1119
                // keeping track of which sector we just erased
1120 16 dgisselq
                erased_sector <= spif_data[(AW-1):14];
1121 2 dgisselq
                // and marking this erase sector as no longer dirty
1122
                dirty_sector <= 1'b0;
1123
 
1124
                // Wait for a full stop before issuing this command
1125
                if ((~spi_busy)&&(~spi_wr)&&(o_qspi_cs_n))
1126
                begin // When our command is accepted, move to the next state
1127
                        spi_wr <= 1'b1;
1128
                        state <= `WBQSPI_ERASE_BLOCK;
1129
                end
1130
        end else if (state == `WBQSPI_ERASE_BLOCK)
1131
        begin
1132
                spi_wr     <= 1'b0;
1133
                spi_hold   <= 1'b0;
1134
                o_wb_stall <= 1'b1;
1135
                o_wb_ack   <= 1'b0;
1136
                spif_req <= (spif_req) && (i_wb_cyc);
1137
                // When the port clears, we can head back to idle
1138 16 dgisselq
                //      No ack necessary, we ackd before getting
1139
                //      here.
1140 2 dgisselq
                if ((~spi_busy)&&(~spi_wr))
1141
                        state <= `WBQSPI_IDLE;
1142
        end else if (state == `WBQSPI_CLEAR_STATUS)
1143
        begin // Issue a clear status command
1144
                spi_wr <= 1'b1;
1145
                spi_hold <= 1'b0;
1146
                spi_len <= 2'b00; // 8 bit command
1147
                spi_in <= { 8'h30, 24'h00 };
1148
                spi_spd <= 1'b0;
1149
                spi_dir <= 1'b0;
1150
                last_status[6:5] <= 2'b00;
1151
                spif_req <= (spif_req) && (i_wb_cyc);
1152
                if ((spi_wr)&&(~spi_busy))
1153
                        state <= `WBQSPI_WAIT_TIL_IDLE;
1154
        end else if (state == `WBQSPI_IDLE_CHECK_WIP)
1155
        begin // We are now in read status register mode
1156
 
1157
                // No bus commands have (yet) been given
1158
                o_wb_stall <= 1'b1;
1159
                o_wb_ack   <= 1'b0;
1160
                spif_req <= (spif_req) && (i_wb_cyc);
1161
 
1162
                // Stay in this mode unless/until we get a command, or
1163
                //      the write is over
1164
                spi_wr <= (((~i_wb_cyc)||((~i_wb_data_stb)&&(~i_wb_ctrl_stb)))
1165
                                &&(write_in_progress));
1166
                spi_len <= 2'b00; // 8 bit reads
1167
                spi_spd <= 1'b0;  // SPI, not quad
1168
                spi_dir <= 1'b1;  // Read
1169
                if (spi_valid)
1170
                begin
1171
                        write_in_progress <= spi_out[0];
1172
                        if ((~spi_out[0])&&(write_in_progress))
1173
                                o_interrupt <= 1'b1;
1174
                end else
1175
                        o_interrupt <= 1'b0;
1176
 
1177
                if ((~spi_wr)&&(~spi_busy)&&(o_qspi_cs_n))
1178
                begin // We can now go to idle and process a command
1179
                        o_wb_stall <= 1'b0;
1180
                        o_wb_ack   <= 1'b0;
1181
                        state <= `WBQSPI_IDLE;
1182
                end
1183 7 dgisselq
`endif //       !READ_ONLY
1184 2 dgisselq
        end else // if (state == `WBQSPI_WAIT_TIL_IDLE) or anything else
1185
        begin
1186
                spi_wr     <= 1'b0;
1187
                spi_hold   <= 1'b0;
1188
                o_wb_stall <= 1'b1;
1189
                o_wb_ack   <= 1'b0;
1190
                spif_req   <= 1'b0;
1191
                if ((~spi_busy)&&(o_qspi_cs_n)&&(~spi_wr)) // Wait for a full
1192
                begin // clearing of the SPI port before moving on
1193
                        state <= `WBQSPI_IDLE;
1194
                        o_wb_stall <= 1'b0;
1195
                        o_wb_ack   <= 1'b0; // Shouldn't be acking anything here
1196
                end
1197
        end
1198 4 dgisselq
        end
1199 2 dgisselq
 
1200 4 dgisselq
        // Command and control during the reset sequence
1201 16 dgisselq
        assign  o_qspi_cs_n = (spif_override)?alt_cmd :w_qspi_cs_n;
1202
        assign  o_qspi_sck  = (spif_override)?alt_ctrl:w_qspi_sck;
1203
        assign  o_qspi_mod  = (spif_override)?  2'b01 :w_qspi_mod;
1204
        assign  o_qspi_dat  = (spif_override)?  4'b00 :w_qspi_dat;
1205 2 dgisselq
endmodule

powered by: WebSVN 2.1.0

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