Learning SoC

Learning how to develop embedded systems based on system-on-chip devices.

Context

I haven’t worked on a proper electronics design for years, but I’m feeling the need to come back to my roots and get an update.

I found a motivating and challenging project to develop and decided to put some time into it. So, investigating current options for signal processing, control and user interface, I realised that many commercial electronic instruments are built over FPGAs with an integrated ARM processor. I haven’t explored this platform before, but I’m curious how it works.

In addition, I have observed that user interfaces are now frequently presented as a website hosted locally on the device. I like the idea because it creates a closed system, independent of external software to control it, which translates into better compatibility and more control over deployment and updates.

For these reasons, I decided to jump into learning to program FPGAs and ARM microprocessors, which I will do using an SoC developing board.

So, this project follows the process of learning to design an SoC system, programming FPGAs in VHDL and ARM microprocessor in C. First, I want to do it bare-metal and then build a Linux-embedded system.

Aim

The idea is to build a digital pattern generator.

I will start by learning how to program the basic components of the system in a bare-metal approach. Then, I will build a simple, bare-metal arbitrary pulse generator controlled through serial communication. Finally, I will install Linux on the ARM core, move the control and communication to it and create a web user interface.

Plan

The first phase is about learning. I want to do this using a tutorial approach. For that, I created a list of the basic components I have to master, and I organised them in a progressive step-by-step sequence. My focus here is taking control of the microprocessor.

  1. Control of the GPIOs from the PS.
  2. PS interrupts.
  3. PS Timers.
  4. UART communication with the PS.

The second phase is about PL-PS bare-metal integration. Now, I change the attention to the FPGA while using the microprocessor for communication and control.

  1. PL state machines
  2. PL signal routing
  3. PL-PS interaction

:white_flag: At this point, a simple pulse generator is working.

The third phase is about Linux-embedded.

  1. Installation and boot of a Linux distribution on the processor
  2. Enabling serial communication
  3. Write a library with functions to control the device

The last phase is building the user interface. Previously, a set of serial commands should have been implemented to control the device. Now, the web interface is programmed.

  1. Translate serial RS232 communication to Ethernet.
  2. Install and start a web server and dependencies.
  3. Build the web interface

:checkered_flag: After finishing the four phases, the digital pattern generator should be implemented on a development board. The follow-up project will be designing the PCB for the pattern generator.

Developing framework

I will build this project on a Cora Z7-07S development board from Digilent. The board has a single-core Zynq-7000 SoC device made by AMD (Xilinx). The development software platform from Xilinx includes Vivado for programming and configuring the hardware and Vitis for developing the application running on the ARM core.