picorv32/picosoc
Claire Wolf fb34c8aca9
Merge pull request #148 from splinedrive/disable_memory_test
Workarround: Disable cmd_memtest() when starting firmware.
2020-04-22 17:25:05 +02:00
..
.gitignore picosoc: use preprocessor for generating target-specific linker script 2019-02-11 23:44:47 +01:00
Makefile added CROSS prefix and CFLAGS to the picsoc/Makefile 2019-11-14 12:31:20 +01:00
README.md Add icebreaker example PicoSoC implementation 2018-08-19 13:38:59 +02:00
firmware.c Workarround: Disable cmd_memtest() when starting firmware. 2020-01-27 02:19:56 +01:00
hx8kdemo.core Add FuseSoC .core file for hx8kdemo 2018-07-27 23:23:41 +02:00
hx8kdemo.pcf Update PicoSoC hx8kdemo 2017-09-15 15:34:45 +02:00
hx8kdemo.v Enable a bunch of PicoRV32 features in PicoSoC 2017-09-22 04:52:44 +02:00
hx8kdemo_tb.v Add rs232 decode to picosoc hx8kdemo test bench 2018-08-14 14:27:09 +02:00
ice40up5k_spram.v picosoc: increase available memory by using SPRAM instead of BRAM for the Icebreaker example 2019-02-11 23:13:05 +01:00
icebreaker.core Add FuseSoC support for icebreaker 2018-09-02 22:48:47 +02:00
icebreaker.pcf Add PicoSoC IceBreaker demo 2018-08-18 20:17:21 +02:00
icebreaker.v Short modification in the error string 2019-10-29 16:42:24 +01:00
icebreaker_tb.v icebreaker: artificially limit available RAM to speed-up simulation 2019-02-12 00:13:33 +01:00
overview.svg Improve PicoSoC overview.svg 2017-09-22 05:09:03 +02:00
performance.png Enable a bunch of PicoRV32 features in PicoSoC 2017-09-22 04:52:44 +02:00
performance.py Enable a bunch of PicoRV32 features in PicoSoC 2017-09-22 04:52:44 +02:00
picosoc.core picosoc: increase available memory by using SPRAM instead of BRAM for the Icebreaker example 2019-02-11 23:13:05 +01:00
picosoc.v picosoc: increase available memory by using SPRAM instead of BRAM for the Icebreaker example 2019-02-11 23:13:05 +01:00
sections.lds picosoc: use preprocessor for generating target-specific linker script 2019-02-11 23:44:47 +01:00
simpleuart.v added default clk divider parameter to simpleuart 2020-04-15 13:25:57 +02:00
spiflash.core Add FuseSoC .core file for SPI Flash model 2018-07-26 23:26:43 +02:00
spiflash.v Add icebreaker example PicoSoC implementation 2018-08-19 13:38:59 +02:00
spiflash_tb.v Fix spiflash_tb 2018-05-11 22:56:52 +02:00
spimemio.v Add PicoSoC spimem Dual I/O support 2017-09-21 15:50:50 +02:00
start.s Fix picosoc quad spi mode (flashio_worker must be multiple of 4 bytes) 2018-08-14 14:26:49 +02:00

README.md

PicoSoC - A simple example SoC using PicoRV32

This is a simple PicoRV32 example design that can run code directly from an SPI flash chip. It can be used as a turn-key solution for simple control tasks in ASIC and FPGA designs.

An example implementation targeting the Lattice iCE40-HX8K Breakout Board is included.

The flash is mapped to the memory regions starting at 0x00000000 and 0x01000000, with the SRAM overlayed for the mapping at 0x00000000. The SRAM is just a small scratchpad memory (default 256 words, i.e. 1 kB).

The reset vector is set to 0x00100000, i.e. at 1MB into in the flash memory.

See the included demo firmware and linker script for how to build a firmware image for this system.

Run make hx8ksim or make icebsim to run the test bench (and create testbench.vcd).

Run make hx8kprog to build the configuration bit-stream and firmware images and upload them to a connected iCE40-HX8K Breakout Board.

Run make icebprog to build the configuration bit-stream and firmware images and upload them to a connected iCEBreaker Board.

File Description
picosoc.v Top-level PicoSoC Verilog module
spimemio.v Memory controller that interfaces to external SPI flash
simpleuart.v Simple UART core connected directly to SoC TX/RX lines
start.s Assembler source for firmware.hex/firmware.bin
firmware.c C source for firmware.hex/firmware.bin
sections.lds Linker script for firmware.hex/firmware.bin
hx8kdemo.v FPGA-based example implementation on iCE40-HX8K Breakout Board
hx8kdemo.pcf Pin constraints for implementation on iCE40-HX8K Breakout Board
hx8kdemo_tb.v Testbench for implementation on iCE40-HX8K Breakout Board
icebreaker.v FPGA-based example implementation on iCEBreaker Board
icebreaker.pcf Pin constraints for implementation on iCEBreaker Board
icebreaker_tb.v Testbench for implementation on iCEBreaker Board

Memory map:

Address Range Description
0x00000000 .. 0x00FFFFFF Internal SRAM
0x01000000 .. 0x01FFFFFF External Serial Flash
0x02000000 .. 0x02000003 SPI Flash Controller Config Register
0x02000004 .. 0x02000007 UART Clock Divider Register
0x02000008 .. 0x0200000B UART Send/Recv Data Register
0x03000000 .. 0xFFFFFFFF Memory mapped user peripherals

Reading from the addresses in the internal SRAM region beyond the end of the physical SRAM will read from the corresponding addresses in serial flash.

Reading from the UART Send/Recv Data Register will return the last received byte, or -1 (all 32 bits set) when the receive buffer is empty.

The UART Clock Divider Register must be set to the system clock frequency divided by the baud rate.

The example design (hx8kdemo.v) has the 8 LEDs on the iCE40-HX8K Breakout Board mapped to the low byte of the 32 bit word at address 0x03000000.

SPI Flash Controller Config Register:

Bit(s) Description
31 MEMIO Enable (reset=1, set to 0 to bit bang SPI commands)
30:23 Reserved (read 0)
22 DDR Enable bit (reset=0)
21 QSPI Enable bit (reset=0)
20 CRM Enable bit (reset=0)
19:16 Read latency (dummy) cycles (reset=0)
15:12 Reserved (read 0)
11:8 IO Output enable bits in bit bang mode
7:6 Reserved (read 0)
5 Chip select (CS) line in bit bang mode
4 Serial clock line in bit bang mode
3:0 IO data bits in bit bang mode

The following settings for CRM/DDR/QSPI modes are valid:

CRM QSPI DDR Read Command Byte Mode Byte
0 0 0 03h Read N/A
0 0 1 BBh Dual I/O Read FFh
1 0 1 BBh Dual I/O Read A5h
0 1 0 EBh Quad I/O Read FFh
1 1 0 EBh Quad I/O Read A5h
0 1 1 EDh DDR Quad I/O Read FFh
1 1 1 EDh DDR Quad I/O Read A5h

The following plot visualizes the relative performance of the different configurations:

Consult the datasheet for your SPI flash to learn which configurations are supported by the chip and what the maximum clock frequencies are for each configuration.

For Quad I/O mode the QUAD flag in CR1V must be set before enabling Quad I/O in the SPI master. Either set it by writing the corresponding bit in CR1NV once, or by writing it from your device firmware at every bootup. (See set_flash_qspi_flag() in firmware.c for an example for the latter.)

Note that some changes to the Lattice iCE40-HX8K Breakout Board are required to support the faster configurations: (1) The flash chip must be replaced with one that supports the faster read commands and (2) the IO2 and IO3 pins on the flash chip must be connected to the FPGA IO pins T9 and T8 (near the center of J3).