Connecting your design to GPIOs in the Caravel user project

In this article, we'll explore how to effectively connect your design to GPIOs, with a special focus on using the Output Enable Bar (OEB) signal to manage the direction and behavior of the GPIOs.

When designing a custom project within the Caravel user project, connecting your design to General Purpose Input/Output (GPIO) pins is essential for interfacing with the external world. GPIOs are versatile and can be configured as inputs, outputs, or even bidirectional pins, depending on your design’s needs.

Understanding GPIOs in the Caravel User Project

GPIOs in the Caravel user project are flexible pins that allow your design to interact with external components such as sensors, LEDs, switches, and more.

Each GPIO pin can be:

  • Input: Reading signals from external components.
  • Output: Sending signals from your design to external components.
  • Bidirectional: Dynamically switching between input and output, allowing for versatile communication with other devices.

Connecting Your Design to GPIOs

Connecting your design to GPIOs involves mapping your internal signals to the GPIOs in your Verilog or VHDL code. Let’s start with the basics: how to configure a GPIO as either an input or an output.

Configuring GPIOs as Inputs

To configure a GPIO as an input, you need to ensure that the OEB (Output Enable Bar) signal for that GPIO is set high. This puts the GPIO in a high-impedance state, allowing it to receive external signals without interference from the internal logic.

Configuring GPIOs as Outputs

To use a GPIO as an output, the OEB signal must be set low. This enables the internal logic to drive the GPIO pin, allowing your design to send signals to external components.

Using GPIOs as Bidirectional Pins

Sometimes, you need a GPIO pin to act as both an input and an output, depending on the operation mode. This is where bidirectional GPIOs come into play, allowing you to dynamically control the direction of the signal.

How Bidirectional GPIOs Work

A bidirectional GPIO pin can switch between input and output modes based on the state of the OEB signal:

  • OEB LOW (0): The GPIO acts as an output, and the pin is driven by your design.
  • OEB HIGH (1): The GPIO acts as an input, and the pin is in a high-impedance state, allowing it to receive signals from external components.

Configuring GPIOs in Your Design

To connect your design to GPIOs, you will typically need to define the signal connections and set the OEB signal according to whether the pin should function as an input, output, or bidirectional pin.

The following truth table summarizes the behavior of a GPIO pin based on the OEB signal and your design's output:

Mode OEB Signal GPIO Pin State Description
Input 1 (HIGH) Hi-Z GPIO is configured as an input, reading external signals.
Output 0 (LOW) Driven by design     GPIO is configured as an output, driving external components.
Bidirectional Varies Hi-Z or Driven     GPIO can switch between input and output based on OEB signal.