# Hello World Example ## Introduction The Hello World example is a bare-metal application that uses the UART controller of RVX to send a Hello World message to a host computer. ## Prerequisites To run this example, you need an FPGA board that has a UART-USB bridge, a common feature on most FPGAs. Additionally, you need to have the [RISC-V GNU Toolchain](https://github.com/riscv-collab/riscv-gnu-toolchain) installed on your machine to build the example. You can find instructions on how to install the RISC-V GNU Toolchain in the [User Guide](../userguide.md#prerequisites). ## Building the example Run the commands below to build the Hello World example: ```bash title="1. Clone RVX repository" git clone https://github.com/rafaelcalcada/rvx ``` ```bash title="2. Build the software for the Hello World example" cd rvx/examples/hello_world/software && make PREFIX=/opt/riscv ``` The `PREFIX` variable must specify the folder where the [RISC-V GNU Toolchain](../userguide.md#prerequisites) is installed. A successfull build ends with a message like this: ```title="Successful build report" Memory init file: build/hello_world.hex Binary executable: build/hello_world.elf Disassembly: build/hello_world.objdump Memory usage report (MEMORY_SIZE = 8K) text data bss total filename 240 0 0 240 hello_world.elf ``` The `hello_world.hex` file generated by the build process will be used in the next step to initialize the memory of RVX. ## Implementing on an FPGA

Creating the Hello World module

Using your preferred text editor, create a Verilog file name `hello_world.v` and add the source code below. Make sure to modify `hello_world.v` as follows: - Change the `MEMORY_INIT_FILE` parameter to the absolute path of the `hello_world.hex` file you generated in the previous step. - Change the `CLOCK_FREQUENCY` parameter to the frequency (in Hertz) of the `clock` input. ```verilog title="hello_world.v" module hello_world ( input wire clock, input wire reset, output wire uart_tx ); // Reset button debouncing reg reset_debounced; always @(posedge clock) begin reset_debounced <= reset; end rvx #( // Please adjust these two parameters accordingly .CLOCK_FREQUENCY (50000000 ), .MEMORY_INIT_FILE ("/path/to/hello_world.hex" ) ) rvx_instance ( .clock (clock ), .reset (reset_debounced ), .uart_tx (uart_tx ), // Unused inputs need to be hardwired to zero .halt (1'b0 ), .uart_rx (1'b0 ), .gpio_input (1'b0 ), .poci (1'b0 ), // Unused outputs can be left open .gpio_oe ( ), .gpio_output ( ), .sclk ( ), .pico ( ), .cs ( )); endmodule ``` ---

Synthesizing the Hello World module

To implement the `hello_world.v` module on your FPGA, follow the steps below: 1. Open the EDA tool provided by your FPGA vendor (e.g., AMD Vivado, Intel Quartus, Lattice iCEcube). 2. Include `hello_world.v` to the project and all files in the `hardware/` folder of RVX repository. 3. Create a design constraints file and map the ports of `hello_world.v` to the corresponding devices on the FPGA board. - Map the `uart_tx` output to the UART-USB bridge - Map the `reset` input to a push-button or switch - Map the `clock` input to the clock source 4. Run the synthesis process. 4. Generate the bitstream and, once completed, program the FPGA with it. ## Running the application Now that the FPGA is programmed, you can see the Hello World message on a host computer with the help of a serial terminal emulator like PySerial: - Connect the FPGA board to your computer - Install PySerial (or other serial terminal emulator): ``` python3 -m pip install pyserial ``` - Open a serial terminal With PySerial, a serial terminal can be opened by running: ``` python3 -m serial.tools.miniterm ``` PySerial will show the available serial ports, one of which is the UART-USB bridge of the FPGA board. Choose it to connect. - Finally, press the reset button. You should now see the Hello World message! ## Featured boards We provide project files for some featured FPGA boards. If you have one of the boards listed below, please follow the specific steps for your board: ### Arty A7 - Build the Hello World application as instructed in [Building the example](#building-the-example) - On AMD Vivado, click __Tools / Run Tcl Script__ Select `examples/hello_world/boards/arty_a7/create_project_arty_a7_.tcl`, where `` is the variant of your board (either 35T or 100T). - Click **Generate Bitstream** and program the FPGA as usual - Run the example as instructed in [Running the application](#running-the-application) ### Cmod A7 - Build the Hello World application as instructed in [Building the example](#building-the-example) - On AMD Vivado, click __Tools / Run Tcl Script__ Select `examples/hello_world/boards/cmod_a7/create_project_cmod_a7.tcl`. - Click **Generate Bitstream** and program the FPGA as usual - Run the example as instructed in [Running the application](#running-the-application)