Projects on real boards
Each project is small enough to finish in an evening or a weekend, and complete enough to actually run: HDL, constraints, build steps, and what to look for when it works.
From blinky to PWM breathing LEDs on the Tang Nano 9K with open-source tools
Install Yosys, nextpnr-himbaechel and openFPGALoader, then make the six LEDs on the Tang Nano 9K breathe with a triangle wave, a gamma lookup and a PWM module you write yourself.
UART echo on the Basys 3
Build a 115200-baud UART receiver and transmitter in Verilog, echo typed characters back with their case toggled, simulate it, then test it from a serial terminal.
VGA test pattern on the iCEBreaker
Generate 640x480 at 60 Hz from an iCE40 UP5K with the open-source flow, with a PLL-derived pixel clock, a sync generator, colour bars, a chequerboard and a bouncing block on a 12-bit VGA Pmod.
Your first custom AXI peripheral on the PYNQ-Z2 (or Zybo Z7)
Write an AXI4-Lite slave with four registers by hand, drop it into a Zynq block design, export the hardware, and drive it from Python on PYNQ or from bare-metal C in Vitis.