• Stars
    star
    166
  • Rank 227,748 (Top 5 %)
  • Language Verilog
  • License
    Apache License 2.0
  • Created about 4 years ago
  • Updated over 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

High throughput JPEG decoder in Verilog for FPGA

High throughput JPEG decoder

Github: https://github.com/ultraembedded/core_jpeg

This project is a JPEG decoder core for FPGA written in Verilog.

JPEG Core

Features

  • Baseline JPEG Decoder IP (sequential encoded images).
  • 32-bit AXI Stream input.
  • Input format: JPEG (JPEG File Interchange Format)
  • Output format: 24-bit RGB output in 8x8 blocks (row-major ordering).
  • Support for Monochrome, 4:4:4, 4:2:0 chroma subsampling support.
  • Support for fixed standard Huffman tables (reduced logic usage, fast).
  • Support for dynamic Huffman tables (from JPEG input stream -> slower decode, more logic).
  • Dynamic DQT tables from JPEG input stream.
  • Synthesizable Verilog 2001, Verilator and FPGA friendly.
  • Multipliers and tables / FIFO's map efficiently to FPGA resources (DSP48, blockRAM, etc).
  • Verified using co-simulation against a C-model and tested on FPGA with thousands of images.

Design Aims

  1. Fast decode performance suitable for video playback
  2. Support a minimal JPEG baseline feature set.
  3. Be well tested (with verification against a reference C-model).
  4. Map to FPGA resources such as BlockRAM, DSP macros wherever possible.

FPGA Mapping

The current version of the JPEG decoder uses the following resources on a Xilinx 7 series FPGA (post-implementation);
Resource Usage

The design is also able to meet timing >= 75MHz.

Performance

Peak JPEG decode performance is as follows;

  • Monochrome = 66 cycles per 8x8 pixels (1.0 cycles per pixel)
  • YCbCr 4:2:0 = 137 cycles per 8x8 pixels (2.1 cycles per pixel)
  • YCbCr 4:4:4 = 198 cycles per 8x8 pixels (3.1 cycles per pixel)

Use Case

The purpose of this design was to replace a 3rd party JPEG decoder core used in my Motion JPEG based FPGA video player.
Motion JPEG has worse compression performance than MPEG based video, but the complexity of the HW required is low enough that it can be used on low(-ish)-end FPGAs.

Video playback usually requires at least 25 frames per second, hence there is a budget of less than 40ms per JPEG frame.
This fact drives the design choices taken for this implementation.

Clearly, the higher the resolution, the more pixels that must be produced from the JPEG decoder within that 40ms budget, so this core is designed to have high throughput in the output stages - with additional resources dedicated to the IDCT transform, and output re-ordering stages to facilitate this.

Limitations

The current release does not support;

  • Restart markers
  • 4:2:2 H/V chroma subsampling (only 4:4:4 and 4:2:0 are supported).

Under the GNU Image Manipulation Program, the following 'X' options are not supported currently; Unsupported Opts

Note: Support for 'optimised' Huffman tables is possible when design parameter SUPPORT_WRITABLE_DHT=1.
This functionality increases the core size substantially and reduces performance.

Future Work / TODO

  • Add support for the first layer of progressive JPEG images.
  • Add option to reduce arithmetic precision to reduce design size.
  • Add lightweight variant of the core with reduced performance (for smaller FPGAs).

More Repositories

1

riscv

RISC-V CPU Core (RV32IM)
Verilog
984
star
2

biriscv

32-bit Superscalar RISC-V CPU
Verilog
701
star
3

cores

Various HDL (Verilog) IP Cores
Verilog
598
star
4

core_ddr3_controller

A DDR3 memory controller in Verilog for various FPGAs
Verilog
260
star
5

FPGAmp

720p FPGA Media Player (RISC-V + Motion JPEG + SD + HDMI on an Artix 7)
C
237
star
6

openlogicbit

Open-source Logic Analyzer gateware for various FPGA dev boards/replacement gateware for commercially available logic analyzers.
Verilog
87
star
7

core_usb_host

Basic USB 1.1 Host Controller for small FPGAs
C
77
star
8

riscv_soc

Basic RISC-V Test SoC
Verilog
76
star
9

exactstep

Instruction set simulator for RISC-V, MIPS and ARM-v6m
C++
74
star
10

core_ft60x_axi

FTDI FT600 SuperSpeed USB3.0 to AXI bus master
C++
73
star
11

libhelix-mp3

Fixed-point MP3 decoder (RISC-V port)
C
66
star
12

core_dvi_framebuffer

Minimal DVI / HDMI Framebuffer
Verilog
65
star
13

core_audio

Audio controller (I2S, SPDIF, DAC)
Verilog
64
star
14

core_usb_cdc

Basic USB-CDC device core (Verilog)
Verilog
61
star
15

core_sdram_axi4

SDRAM controller with AXI4 interface
C++
59
star
16

usb_sniffer

High Speed USB 2.0 capture device based on miniSpartan6+
C
56
star
17

core_soc

Basic Peripheral SoC (SPI, GPIO, Timer, UART)
Verilog
51
star
18

core_uriscv

Another tiny RISC-V implementation
Verilog
49
star
19

fat_io_lib

Small footprint, low dependency, C code implementation of a FAT16 & FAT32 driver.
C
48
star
20

usb2sniffer

USB2Sniffer: High Speed USB 2.0 capture (for LambdaConcept USB2Sniffer hardware)
Verilog
42
star
21

core_dbg_bridge

UART -> AXI Bridge
Verilog
41
star
22

riscv-linux-boot

Trivial RISC-V Linux binary bootloader
C
38
star
23

core_usb_fs_phy

USB Full Speed PHY
Verilog
35
star
24

core_spiflash

SPI-Flash XIP Interface (Verilog)
Verilog
33
star
25

core_usb_bridge

USB -> AXI Debug Bridge
Verilog
32
star
26

core_usb_uart

USB serial device (CDC-ACM)
Verilog
27
star
27

core_jpeg_decoder

HW JPEG decoder wrapper with AXI-4 DMA
Verilog
24
star
28

core_axi_cache

128KB AXI cache (32-bit in, 256-bit out)
Verilog
24
star
29

riscv_sbc

A RISC-V SBC based around the LambdaConcept USB2Sniffer FPGA board.
Verilog
24
star
30

fpga_test_soc

A small test SoC for various soft-CPUs (Cortex-M0, RISC-V)
C
22
star
31

core_enet

Ethernet MAC 10/100 Mbps
Verilog
21
star
32

core_mmc

MMC (and derivative standards) host controller
Verilog
21
star
33

minispartan6-audio

miniSpartan6+ (Spartan6) FPGA based MP3 Player
Verilog
21
star
34

core_ftdi_bridge

FTDI FT245 Style Synchronous/Asynchronous FIFO Bridge
Verilog
20
star
35

core_ulpi_wrapper

ULPI Link Wrapper (USB Phy Interface)
C++
19
star
36

core_usb_sniffer

USB capture IP
Verilog
18
star
37

riscv32_linux_from_scratch

RISC-V 32-bit Linux From Scratch
Makefile
18
star
38

librtos

Very basic real time operating system for embedded systems...
C
14
star
39

ecpix-5

Projects for the ECPiX-5 - a ECP5 FPGA board.
Verilog
12
star
40

minispartan6

Projects for the Scarab Minispartan6+ FPGA board
VHDL
12
star
41

core_ram_tester

AXI-4 RAM Tester Component
Verilog
11
star
42

altor32

AltOr32 - Alternative Lightweight OpenRisc CPU
Verilog
11
star
43

armv6m-sim

Simple instruction set simulator for ARMv6-M (Cortex M0)
C++
10
star
44

core_mpx

MPX is a open-source CPU which can execute code compiled for MIPS-I ISA
Verilog
9
star
45

xc6_bus_pirate

XC6 Bus Pirate (FPGA based multi-tool)
Verilog
7
star
46

orangecrab

Test projects for the OrangeCrab ECP5 FPGA board
Verilog
6
star
47

ecpix5-test

Test code / bitstreams for the LambdaConcept ECPIX-5 FPGA board
Verilog
6
star
48

riscv-sw-test

C++
5
star
49

riscv-linux-prebuilt

RISC-V Linux prebuilt images
5
star
50

embedded_httpd

Embedded HTTP Server
C
3
star
51

rp2040_blinky

Simple blinky example for the RP2040 that does not require cmake
C++
3
star