diff options
Diffstat (limited to 'picosoc/spiflash.v')
-rw-r--r-- | picosoc/spiflash.v | 60 |
1 files changed, 55 insertions, 5 deletions
diff --git a/picosoc/spiflash.v b/picosoc/spiflash.v index 18cd68d..63d21dc 100644 --- a/picosoc/spiflash.v +++ b/picosoc/spiflash.v @@ -26,7 +26,7 @@ // updates output signals 1ns after the SPI clock edge. // // Supported commands: -// AB, B9, FF, 03, EB, ED +// AB, B9, FF, 03, BB, EB, ED // // Well written SPI flash data sheets: // Cypress S25FL064L http://www.cypress.com/file/316661/download @@ -60,10 +60,12 @@ module spiflash ( reg powered_up = 0; localparam [3:0] mode_spi = 1; - localparam [3:0] mode_qspi_rd = 2; - localparam [3:0] mode_qspi_wr = 3; - localparam [3:0] mode_qspi_ddr_rd = 4; - localparam [3:0] mode_qspi_ddr_wr = 5; + localparam [3:0] mode_dspi_rd = 2; + localparam [3:0] mode_dspi_wr = 3; + localparam [3:0] mode_qspi_rd = 4; + localparam [3:0] mode_qspi_wr = 5; + localparam [3:0] mode_qspi_ddr_rd = 6; + localparam [3:0] mode_qspi_ddr_wr = 7; reg [3:0] mode = 0; reg [3:0] next_mode = 0; @@ -133,6 +135,31 @@ module spiflash ( end end + if (powered_up && spi_cmd == 'h bb) begin + if (bytecount == 1) + mode = mode_dspi_rd; + + if (bytecount == 2) + spi_addr[23:16] = buffer; + + if (bytecount == 3) + spi_addr[15:8] = buffer; + + if (bytecount == 4) + spi_addr[7:0] = buffer; + + if (bytecount == 5) begin + xip_cmd = (buffer == 8'h a5) ? spi_cmd : 8'h 00; + mode = mode_dspi_wr; + dummycount = latency; + end + + if (bytecount >= 5) begin + buffer = memory[spi_addr]; + spi_addr = spi_addr + 1; + end + end + if (powered_up && spi_cmd == 'h eb) begin if (bytecount == 1) mode = mode_qspi_rd; @@ -269,6 +296,20 @@ module spiflash ( io3_oe = 0; io1_dout = buffer[7]; end + mode_dspi_rd: begin + io0_oe = 0; + io1_oe = 0; + io2_oe = 0; + io3_oe = 0; + end + mode_dspi_wr: begin + io0_oe = 1; + io1_oe = 1; + io2_oe = 0; + io3_oe = 0; + io0_dout = buffer[6]; + io1_dout = buffer[7]; + end mode_qspi_rd: begin io0_oe = 0; io1_oe = 0; @@ -332,6 +373,15 @@ module spiflash ( spi_action; end end + mode_dspi_rd, mode_dspi_wr: begin + buffer = {buffer, io1, io0}; + bitcount = bitcount + 2; + if (bitcount == 8) begin + bitcount = 0; + bytecount = bytecount + 1; + spi_action; + end + end mode_qspi_rd, mode_qspi_wr: begin buffer = {buffer, io3, io2, io1, io0}; bitcount = bitcount + 4; |