top
Oculus V1.0 PCB

Oculus



Oculus Altium Render

About This Board

(my third ever PCB design!)

This is Oculus, an 8-layer FPGA accelerator board created in Altium intended to serve as a companion processor on the UAVs@Berkeley competition hexacopter. I did the schematic design and the majority of the layout for this board in the Spring 2025 offering of APE, a UC Berkeley Decal, while my partner worked on the firmware and RTL. One of UAVs@Berkeley's projects used the OpenCV implementation of ORB, a computer vision algorithm that is used to help match points in images together. Unfortunately, it runs at about 2 frames per second on our onboard computer, so I thought it would be an awesome experience to create a PCB to run a hardware implementation of it. Video data is streamed over RTSP into the ethernet port, processed on the FPGA, and output to the main onboard computer through USB 2.0. This particular form factor is compact and light, which is good for use aboard our drone where space and weight are at a premium.


3D Render

Fullscreen (opens in new tab)



Design Choices


Zynq-7000 SoC

XC7Z020 400-BGA with two ARM cores and 85K PL cells for FPGA fabric. This was the cheapest FPGA that satisfied the requirements for the project, considering I was on a tight budget. This was also my first complex PCB design project, so I wanted something that had readily accessible example designs in case I couldn't figure something out on my own.


512MB DDR3 SDRAM

Intended to hold images while processing them in the FPGA. DDR3 is the fastest memory supported on this FPGA, and I was fine with an extra voltage level on the board.


Gigabit Ethernet

DP83867CR ethernet PHY for RTSP video stream input. The camera on the UAVs@Berkeley competition hexacopter sends video data as an RTSP stream, so this was needed. It also opens the board up to more applications for use as a development tool. This particular PHY was chosen because of its clear documentation and availability.


USB 2.0

USB3320 USB 2.0 PHY with user-selectable host/peripheral mode. This is the fastest USB data protocol the FPGA supports, and it has pretty solid data transfer rates (480Mbps). That is more than enough to transfer low-resolution images and key point information to the onboard computer.


3 selectable boot modes

JTAG, QSPI, and SD card for large boot images.


Raspberry Pi-style IO header

GPIO pins connected to FPGA fabric to expand functionality of the board.

Oculus board closeups

Bringup


What worked?

  • DDR3 at 1600MHz with 0 errors across all byte lanes
  • Gigabit ethernet and USB 2.0 fully functional
  • All voltage levels stable (1V0, 1V5, 1V8, 2V5, 3V3)
  • Fully programmable over USB through FT2232H
  • UART interface and GPIO pins functional

What didn't work?

  • Power sequencing (circular logic problem with 1V0 and 3V3) - fixed
  • Host and GPIO LED driver circuits - fixed
  • 1V5 LDO wired backwards - fixed
  • UVLO threshold too low - bypassed

What still needs to be tested?

  • Alternate boot modes (QSPI and SD) are undergoing testing
Oculus board closeups

Takeaways


This was a huge yet very rewarding project for me, and I am very proud that the board powered on and was able to be programmed! In the past, I have only designed two-layer boards in KiCAD, so making the jump all the way to 8 layers in Altium was a bit daunting at first. If I were to redesign the board, I would make several changes. First off, the DDR3 layout can definitely be optimized to potentially fit on 6 layers. To minimize the footprint of the board, I would remove the FTDI chip and spare USB port, and move more components to the back of the board. I would also completely rework the voltage levels with a programmable converter, which would make setting power up and power down sequences significantly easier.

Copper Layers


1 / 8
Top layer (signal)
2 / 8
Inner layer 1 (ground)
3 / 8
Inner layer 2 (signal)
4 / 8
Inner layer 3 (power)
5 / 8
Inner layer 4 (ground)
6 / 8
Inner layer 5 (signal)
7 / 8
Inner layer 6 (power)
8 / 8
Bottom layer (signal)