Skip to content
Michael Gielda edited this page Nov 14, 2019 · 10 revisions

Running MicroPython on LiteX

Building MicroPython

LiteX Build Environment comes with a helper script that configures the environment and automatically clones and builds MicroPython.

Download and Configure the Build Environment

First, clone the LiteX Build Environment repository and set it up:

git clone https://github.com/timvideos/litex-buildenv.git
cd litex-buildenv

# configure target
export CPU=vexriscv
export PLATFORM=arty
export FIRMWARE=micropython

./scripts/download-env.sh

Enter the Build Environment and build MicroPython

Follow the instructions in this section to setup udev rules needed to enable access to the USB device.

Once udev rules are set up and the environment is configured, enter it and build the firmware:

source scripts/enter-env.sh
SKIP_IMAGE=1 ./scripts/build-micropython.sh

MicroPython sources, available for further modification, will be cloned to third_party/micropython.

The script will then build the MicroPython binary.

Setting SKIP_IMAGE to 1 informs the script not to generate the flash image after building the MicroPython binary. Since the flash image contains all necesasary binaries and a gateware, generating it requires to synthetize the project first (which is time consuming and requires the Vivado software). This is not needed, though, when running the simulation in Renode. The gateware can be generated later (if needed) as described in the following section.

As a result you will find firmware.bin in the build/arty_base_vexriscv/software/micropython directory.

Building the bitstream and flashing the FPGA

Note: Steps in this section can be skipped if you are only interested in simulation in Renode.

In order to build the gateware for an Arty board, you will need to have the Xilinx Vivado toolchain installed in your system.

Follow the instructions on the LiteX BuildEnv Wiki to download, install and get a license for Vivado.

Building the gateware

Execute the following command to build the gateware:

make gateware

Note that the above operation might take a while.

Loading the gateware onto the FPGA

Once you have a synthesized gateware, load it onto the FPGA with:

make gateware-load

As a result your FPGA will contain the LiteX+VexRiscv platform preloaded with the LiteX BIOS bootloader.

Running MicroPython

Simulation in Renode

Execute the following command to start the simulation in Renode:

./scripts/build-renode.sh

This will generate startup scripts for Renode based on your current LiteX configuration and start the simulation. As a result two windows will be opened.

The monitor, used to control the simulation:

Monitor

And a UART analyzer displaying messages printed by the software and allowing to interact with the MicroPython shell:

UART

For more information on simulating LiteX in Renode (including advanced usage) see the Renode page on the LiteX BuildEnv wiki.

Running on Arty Board

Execute the following command:

make firmware-load

This will start an flterm tool that connects to the board using /dev/ttyUSB and uploads the binary via the serialboot option in LiteX BIOS.

Now, press red reset button on the board to reset the CPU, reboot LiteX BIOS and start the process of uploading the MicroPython image.

Finally, you should see the prompt of MicroPython shell:

flterm --port=/dev/ttyUSB1 --kernel=build/arty_base_vexriscv.full//software/micropython/firmware.bin --speed=115200
[FLTERM] v2.4-29-g47d3b15 Starting...

        __   _ __      _  __
       / /  (_) /____ | |/_/
      / /__/ / __/ -_)>  <
     /____/_/\__/\__/_/|_|

 (c) Copyright 2012-2019 Enjoy-Digital
 (c) Copyright 2007-2015 M-Labs Ltd

 BIOS built on Oct 23 2019 13:50:35
 BIOS CRC passed (23d0a341)

--============ SoC info ================--
CPU:       VexRiscv @ 100MHz
ROM:       32KB
SRAM:      32KB
L2:        8KB
MAIN-RAM:  262144KB

--========= Peripherals init ===========--
Initializing SDRAM...
SDRAM now under software control
Read leveling:
m0, b0: |11111111110000000000000000000000| delays: 05+-05
m0, b1: |00000000000000111111111111000000| delays: 20+-06
m0, b2: |00000000000000000000000000000001| delays: 31+-00
m0, b3: |00000000000000000000000000000000| delays: -
m0, b4: |00000000000000000000000000000000| delays: -
m0, b5: |00000000000000000000000000000000| delays: -
m0, b6: |00000000000000000000000000000000| delays: -
m0, b7: |00000000000000000000000000000000| delays: -
best: m0, b1 delays: 20+-06
m1, b0: |11111111110000000000000000000000| delays: 05+-05
m1, b1: |00000000000000111111111111000000| delays: 20+-06
m1, b2: |00000000000000000000000000000001| delays: 31+-00
m1, b3: |00000000000000000000000000000000| delays: -
m1, b4: |00000000000000000000000000000000| delays: -
m1, b5: |00000000000000000000000000000000| delays: -
m1, b6: |00000000000000000000000000000000| delays: -
m1, b7: |00000000000000000000000000000000| delays: -
best: m1, b1 delays: 20+-06
SDRAM now under hardware control
Memtest OK

--========== Boot sequence =============--
Booting from serial...
Press Q or ESC to abort boot completely.
sL5DdSMmkekro
[FLTERM] Received firmware download request from the device.
[FLTERM] Uploading kernel (218608 bytes)...
[FLTERM] Upload complete (7.7KB/s).
[FLTERM] Booting the device.
[FLTERM] Done.
Executing booted program at 0x40000000
--============= Liftoff! ===============--
MicroPython v1.9.4-1429-gb856c7a5d on 2019-10-23; litex with riscv32
>>>
Clone this wiki locally