Send video/audio over HDMI on an FPGA
See the codeEnglish | Français | Help translate
SystemVerilog code for HDMI 1.4b video/audio output on an FPGA.
Most free and open source HDMI source (computer/gaming console) implementations actually output a DVI signal, which HDMI sinks (TVs/monitors) are backwards compatible with. To support audio and other HDMI-only functionality, a true HDMI signal must be sent. The code in this repository lets you do that without having to license an HDMI IP block from anyone.

This project is dual-licensed under MIT and Apache 2.0.
SPDX-License-Identifier: MIT OR Apache-2.0
src/ and add them to your own project. If you use hdlmake, you can add this repository itself as a remote module.top/top.sv.hdmi.sv and tailor any instantiations to your situation.You'll need to set up a PLL for producing the two HDMI clocks. The pixel clock for each supported format is shown below:
| Video Resolution | Video ID Code(s) | Refresh Rate | Pixel Clock Frequency | Progressive/Interlaced |
|---|---|---|---|---|
| 640x480 | 1 | 60Hz | 25.2MHz | P |
| 640x480 | 1 | 59.94Hz | 25.175MHz | P |
| 720x480 | 2, 3 | 60Hz | 27.027MHz | P |
| 720x480 | 2, 3 | 59.94Hz | 27MHz | P |
| 720x576 | 17, 18 | 50Hz | 27MHz | P |
| 1280x720 | 4 | 60Hz | 74.25MHz | P |
| 1280x720 | 4 | 59.94Hz | 74.176MHz | P |
| 1280x720 | 19 | 50Hz | 74.25MHz | P |
| 1920x1080 | 16 | 60Hz | 148.5MHz | P |
| 1920x1080 | 16 | 59.94Hz | 148.352MHz | P |
| 1920x1080 | 34 | 30Hz | 74.25MHz | P |
| 1920x1080 | 34 | 29.97Hz | 74.176MHz | P |
| 3840x2160 (not ready) | 97, 107 | 60Hz | 594MHz | P |
| 3840x2160 | 95, 105 | 30Hz | 297MHz | P |
The second clock is a clock 5 times as fast as the pixel clock. Even if your FPGA only has a single PLL, the Altera MegaWizard (or the Xilinx equivalent) should still be able to produce both. See hdl-util/hdmi-demo for example PLLs.
Both audio bitrate and frequency are specified as parameters of the HDMI module. Bitrate can be any value from 16 through 24. Below is a simple mapping of sample frequency to the appropriate parameter
WARNING: the audio can be REALLY LOUD if you use the full dynamic range with hand-generated waveforms! Using less dynamic range means you won't be deafened! (i.e. audio_sample >> 8 )
| Sampling Frequency | AUDIO_RATE value |
|---|---|
| 32 kHz | 32000 |
| 44.1 kHz | 44100 |
| 88.2 kHz | 88200 |
| 176.4 kHz | 176400 |
| 48 kHz | 48000 |
| 96 kHz | 96000 |
| 192 kHz | 192000 |
This code is sent in the Source Product Description InfoFrame via SOURCE_DEVICE_INFORMATION to give HDMI sinks an idea of what capabilities an HDMI source might have. It may be used for displaying a relevant icon in an input list (i.e. DVD logo for a DVD player).
| Code | Source Device Information |
|---|---|
| 0x00 | Unknown |
| 0x01 | Digital Set-top Box |
| 0x02 | DVD Player |
| 0x03 | Digital VHS |
| 0x04 | HDD Videorecorder |
| 0x05 | Digital Video Camera |
| 0x06 | Digital Still Camera |
| 0x07 | Video CD |
| 0x08 | Game |
| 0x09 | PC General |
| 0x0a | Blu-Ray Disc |
| 0x0b | Super Audio CD |
| 0x0c | HD DVD |
| 0x0d | Portable Media Player |
J13, on the Arduino MKR Vivado 4000 schematic, where LVDS IO Standard pins on a Cyclone 10 FPGA have 100nF series capacitorshdmi.tmds_channel[2:0].accJ13 on the Arduino MKR Vivado 4000 schematic)Dual-licensed under Apache License 2.0 and MIT License.
I am NOT a lawyer, the below advice is given based on discussion from a Hacker News post and my research.
HDMI itself is not a royalty free technology, unfortunately. You are free to use it for testing, development, etc. but to receive the HDMI LA's (licensing administration) blessing to create and sell end-user products:
The manufacturer of the finished end-user product MUST be a licensed HDMI Adopter, and The finished end-user product MUST satisfy all requirements as defined in the Adopter Agreement including but not limited to passing compliance testing either at an HDMI ATC or through self-testing.
Becoming an adopter means you have to pay a flat annual fee (~ $1k-$2k) and a per device royalty (~ $0.05). If you are selling an end-user device and DO NOT want to become an adopter, you can turn on the DVI_OUTPUT parameter, which will disable any HDMI-only logic, like audio.
Please consult your lawyer if you have any concerns. Here are a few noteworthy cases that may help you make a decision:
If you know of another good alternative, open an issue and it will be added.
These documents are not hosted here! They are available on Library Genesis and at other locations.
848 followers · starred May 2024
101 followers · starred Apr 2021
5 followers · starred Nov 2021
262 followers · starred Jan 2023
Send video/audio over HDMI on an FPGA
See the codeEnglish | Français | Help translate
SystemVerilog code for HDMI 1.4b video/audio output on an FPGA.
Most free and open source HDMI source (computer/gaming console) implementations actually output a DVI signal, which HDMI sinks (TVs/monitors) are backwards compatible with. To support audio and other HDMI-only functionality, a true HDMI signal must be sent. The code in this repository lets you do that without having to license an HDMI IP block from anyone.

This project is dual-licensed under MIT and Apache 2.0.
SPDX-License-Identifier: MIT OR Apache-2.0
src/ and add them to your own project. If you use hdlmake, you can add this repository itself as a remote module.top/top.sv.hdmi.sv and tailor any instantiations to your situation.You'll need to set up a PLL for producing the two HDMI clocks. The pixel clock for each supported format is shown below:
| Video Resolution | Video ID Code(s) | Refresh Rate | Pixel Clock Frequency | Progressive/Interlaced |
|---|---|---|---|---|
| 640x480 | 1 | 60Hz | 25.2MHz | P |
| 640x480 | 1 | 59.94Hz | 25.175MHz | P |
| 720x480 | 2, 3 | 60Hz | 27.027MHz | P |
| 720x480 | 2, 3 | 59.94Hz | 27MHz | P |
| 720x576 | 17, 18 | 50Hz | 27MHz | P |
| 1280x720 | 4 | 60Hz | 74.25MHz | P |
| 1280x720 | 4 | 59.94Hz | 74.176MHz | P |
| 1280x720 | 19 | 50Hz | 74.25MHz | P |
| 1920x1080 | 16 | 60Hz | 148.5MHz | P |
| 1920x1080 | 16 | 59.94Hz | 148.352MHz | P |
| 1920x1080 | 34 | 30Hz | 74.25MHz | P |
| 1920x1080 | 34 | 29.97Hz | 74.176MHz | P |
| 3840x2160 (not ready) | 97, 107 | 60Hz | 594MHz | P |
| 3840x2160 | 95, 105 | 30Hz | 297MHz | P |
The second clock is a clock 5 times as fast as the pixel clock. Even if your FPGA only has a single PLL, the Altera MegaWizard (or the Xilinx equivalent) should still be able to produce both. See hdl-util/hdmi-demo for example PLLs.
Both audio bitrate and frequency are specified as parameters of the HDMI module. Bitrate can be any value from 16 through 24. Below is a simple mapping of sample frequency to the appropriate parameter
WARNING: the audio can be REALLY LOUD if you use the full dynamic range with hand-generated waveforms! Using less dynamic range means you won't be deafened! (i.e. audio_sample >> 8 )
| Sampling Frequency | AUDIO_RATE value |
|---|---|
| 32 kHz | 32000 |
| 44.1 kHz | 44100 |
| 88.2 kHz | 88200 |
| 176.4 kHz | 176400 |
| 48 kHz | 48000 |
| 96 kHz | 96000 |
| 192 kHz | 192000 |
This code is sent in the Source Product Description InfoFrame via SOURCE_DEVICE_INFORMATION to give HDMI sinks an idea of what capabilities an HDMI source might have. It may be used for displaying a relevant icon in an input list (i.e. DVD logo for a DVD player).
| Code | Source Device Information |
|---|---|
| 0x00 | Unknown |
| 0x01 | Digital Set-top Box |
| 0x02 | DVD Player |
| 0x03 | Digital VHS |
| 0x04 | HDD Videorecorder |
| 0x05 | Digital Video Camera |
| 0x06 | Digital Still Camera |
| 0x07 | Video CD |
| 0x08 | Game |
| 0x09 | PC General |
| 0x0a | Blu-Ray Disc |
| 0x0b | Super Audio CD |
| 0x0c | HD DVD |
| 0x0d | Portable Media Player |
J13, on the Arduino MKR Vivado 4000 schematic, where LVDS IO Standard pins on a Cyclone 10 FPGA have 100nF series capacitorshdmi.tmds_channel[2:0].accJ13 on the Arduino MKR Vivado 4000 schematic)Dual-licensed under Apache License 2.0 and MIT License.
I am NOT a lawyer, the below advice is given based on discussion from a Hacker News post and my research.
HDMI itself is not a royalty free technology, unfortunately. You are free to use it for testing, development, etc. but to receive the HDMI LA's (licensing administration) blessing to create and sell end-user products:
The manufacturer of the finished end-user product MUST be a licensed HDMI Adopter, and The finished end-user product MUST satisfy all requirements as defined in the Adopter Agreement including but not limited to passing compliance testing either at an HDMI ATC or through self-testing.
Becoming an adopter means you have to pay a flat annual fee (~ $1k-$2k) and a per device royalty (~ $0.05). If you are selling an end-user device and DO NOT want to become an adopter, you can turn on the DVI_OUTPUT parameter, which will disable any HDMI-only logic, like audio.
Please consult your lawyer if you have any concerns. Here are a few noteworthy cases that may help you make a decision:
If you know of another good alternative, open an issue and it will be added.
These documents are not hosted here! They are available on Library Genesis and at other locations.
848 followers · starred May 2024
101 followers · starred Apr 2021
5 followers · starred Nov 2021
262 followers · starred Jan 2023