I am often asked in emails and social media such as LinkedIn / (X) Twitter, what projects people learning FPGA should look at that are challenging once they have developed their confidence with their chosen language. I have published in the past a few resources that can help you get started with FPGA development.
![](https://static.wixstatic.com/media/ad48ed_a73badd3694140d389edf92886a0423b~mv2.jpg/v1/fill/w_980,h_551,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/ad48ed_a73badd3694140d389edf92886a0423b~mv2.jpg)
However, once you got to grips with the basics of your chosen languages, the ability to create shift registers, finite state machines etc it is natural to want to consider looking at more complex projects. These projects can be a challenge, as do you try, for example to create more complex solutions using IP and create microprocessors etc. or do you try to build on your skills with the development language.
I would say that ultimately we want to be able to do both however, it is important to build a solid foundation, first. As such I would recommend the following intermediate projects and of course, I have provided a few links to resources which might help you get started with them.
1. Fixed Point Maths - Learn how you do fixed point maths in FPGA, this becomes the basis for so many FPGA applications from simple block average filters to implementing more complex algorithms in signal and image processing filters. Other use cases include robotics and industrial applications where sensor data needs to be converted. If you are unsure how to get started with Fixed point math I wrote a Hackster project on it. I recommend trying to implement a simple rolling / block average filter after that try implementing a transfer function e.g. the Callendar-Van Dusen or Steinhart – hart conversion using polynomial approximation.
2. Finite Impulse Response Filter – This is a great RTL level project to try to create, you can design the filter either low pass high pass etc pretty simply using a program such as TFilter to obtain the filter coefficients. This builds upon the skills learned above for implementing mathematics in using fixed point math. A Starter(ish) project can be found here.
3. AXI Interfacing - Create a application which you write from scratch which converts between AXI Stream and AXI Lite and AXI4. Using a simple protocol on the AXI Stream interface to define the address, data and size of burst. This should work in both directions e.g. it should allow read and writes. This enables you to learn how to implement AXI style interfaces which are commonly used in FPGA modules. Such a module as this is also useful as it enables you to be able to connect a SPI / UART / QSPI / I2C module which has a AXI Stream interface to be able to access an internal AXI Network. This works well for bring up and of course can be useful for interfacing with discrete microprocessors. A starter project can found here.
4. Self Checking Test Bench with Bus functional model – Learn how to develop a self checking test bench which stimulates the units under test and checks the results against those which are expected. It is a good idea to create one of these for each of the examples above. One great advantage for test bench development is understanding how to create not just a test bench but also test cases and bus functional models which enable you to abstract away the interface and use function / procedure calls. Of course, in industry you may leverage UV, UVVM or OSVVM etc but it is important to grasp the basics as there are some safety critical projects where you might need to do it all from scratch. A starter project can be found here.
5. Source / Change Control - Not especially FPGA but an important associated skill, working with source control enables us to ensure our designs are safe and not likely to be lost should a hard drive fail etc. It also allows us to work collaboratively. Getting used to checking files in as we make modifications and improvement is an important aspect of development. This allows us to create baselines for our code and raise issues and track them through to corrective action and closure. An example of how to get started working with git is available here.
You will notice all of these can be implemented without a board, and tested in simulation.
With these skills mastered we can look at pulling these together to create more intermediate projects which create more overall solutions on hardware. We will also look at more intermediate project skills such as timing closure and architecture in another blog.
Until then I hope these are useful suggestions and I would love to know your thoughts on projects previously you have worked developed.
Workshops and Webinars
If you enjoyed the blog why not take a look at the free webinars, workshops and training courses we have created over the years. Highlights include
Professional PYNQ Learn how to use PYNQ in your developments
Introduction to Vivado learn how to use AMD Vivado
Ultra96, MiniZed & ZU1 three day course looking at HW, SW and PetaLinux
Arty Z7-20 Class looking at HW, SW and PetaLinux
Mastering MicroBlaze learn how to create MicroBlaze solutions
HLS Hero Workshop learn how to create High Level Synthesis based solutions
Perfecting Petalinux learn how to create and work with PetaLinux OS
Boards
Get an Adiuvo development board
Adiuvo Spartan 7 / RPi 2040 Embedded System Development Board
Embedded System Book
Do you want to know more about designing embedded systems from scratch? Check out our book on creating embedded systems. This book will walk you through all the stages of requirements, architecture, component selection, schematics, layout, and FPGA / software design. We designed and manufactured the board at the heart of the book! The schematics and layout are available in Altium here Learn more about the board (see previous blogs on Bring up, DDR validation, USB, Sensors) and view the schematics here.
Comments