Resources


About

Introduction

In this project, I implemented a digital circuit capable of performing a fundamental image-processing task: combining adjacent pixels with different weights.

Implementation

The work began with an exploration of potential applications and architectural options for the circuit. Then, the circuit was designed and implemented using VHDL, employing a bottom-up approach, i.e., creating basic building blocks (e.g., flip-flops, adders, counters, …) and progressively integrating them to construct a more complex circuit.

Block diagram of the implemented circuit

Block diagram of the implemented circuit

Verification

Once the design was completed, the circuit was thoughtfully validated through the simulation and the analysis the waveform of the input and output ports of every component (done using ModelSim-Intel© FPGAs Standard Edition 2020.1).

Waveform of the input and output ports of the circuit using a simple 2x3 test ROM

Waveform of the input and output ports of the circuit using a simple 2x3 test ROM

Moreover, both to check its correctness and to gain a deeper understanding of its behavior, the circuit was also tested using sample images. This was achieved by simulating the circuit, exporting the waveform of the output port, and, with a scripting language (i.e., python), parsing the pixels and constructing the output image.

Input image (3-3-2 bitmap)

Input image (3-3-2 bitmap)

Output image (3-3-2 bitmap, α = 0.500)

Output image (3-3-2 bitmap, α = 0.500)

Input image (grayscale)

Input image (grayscale)

Output image (grayscale, α = 0.500)

Output image (grayscale, α = 0.500)

Synthesis

Finally, the circuit was synthesized using Vivado 2024.1, and its timing, power consumption, and resource utilization statistics were analyzed, also considering slightly different variations of the circuit’s parameters (e.g., ROM size, precision of α, number of bits per pixel, …).

Timings

Timings

Power consumption

Power consumption

Resource utilization

Resource utilization