HDMI в ПЛИС платы Марсоход3

Мир не стоит на месте, и взамен морально устаревшего VGA пришли чисто цифровые видеоинтерфейсы, сначала DVI-D , затем HDMI и DisplayPort. Мое знакомство с HDMI началось вот с этой статьи - http://www.fpga4fun.com/HDMI.html.
Там же есть ссылки на всю базовую информацию.
Далее, вкратце, мое видение данной темы.

dvi block
Так-же как в VGA, сигналы управления Hsync, Vsync и Vdе вырабатывает синхрогенератор (VHgen). А сигналы RGB в отличие от VGA поступают не на ЦАПы , а на три TMDS-энкодера, которые преборазуют 8-ми битные сигналы цветности и два управляющих сигнала (с0,с1) в 10-битные. В синем канале в качестве управляющих сигналов передаются Hsync и Vsync. Управляющие сигналы зеленого и красного каналов в DVI не используются.

Цели у TMDS преобразования две - уменьшение количества изменений состояния и баланс постоянной составляющей.

Затем сигналы поступают на сериалайзер и далее на дифференциальный выход. Так-же на диф-выход поступает и пиксель-клок. В принципе все довольно просто и в приведенной выше ссылке есть пример проекта, который можно использовать практически без переделки. Правда разрешение там небольшое - 640х480, зато будет работать на любом мониторе или даже телевизоре.

У большинства современных телевизоров довольно большой список поддерживаемых режимов. Вот например режимы телевизора Samsung , на котором я делал свои эксперименты:
samsung TV res

Меняя частоту пиксель-клока и параметры синхрогенератора можно реализовать любое разрешение, но есть одно "но".
Максимальная частота глобал-клока нашего чипа MAX10 400МГЦ а на сериалайзер нужно подавать частоту в десять раз больше пиксель-клока. Таким образом, будут работать разрешения с частотами до 40МГЦ. Что-же делать если хочется больше?

Можно посмотреть выходной пин нашего чипа в Altera Quartus II "Resourse Property Editor":

altera ddio

В его составе есть элемент "DDIO OUT". Он состоит из двух триггеров, выходы которых подключены к паду через мультиплексор. Практически, это уже встроенный в каждый пин сериалайзер 2х1. Это простое техническое решение позволяет повысить битрейт на выходной ножке относительно клока в два раза. Для его использования в проекте есть библиотечный компонент "altddio_out", но поскольку нам на выходе нужен дифференциальный сигнал, то на каждый канал (в том числе и на клок) нам понадобится по два таких компонента , один для положительного выхода и второй, на котором входные сигналы проинвертированы, для отрицательного.
altddio out
Кроме того в проекте теперь понадобится по два пятибитных сериалайзера вместо каждого десятибитного, и соответственно понизить клок для сериалайзинга в два раза. Теперь , после этих доработок, нам становятся доступными разрешения, с пиксель-клоком до 80МГЦ.

В качестве примера мы взяли из списка самое "телевизионное" разрешение - 1280х720 с клоком 74МГЦ.
В примере на экран выводятся цветные полосы, ну а в принципе можно приделать все что угодно, тот-же "фреймбуффер". Вот загруженное в плату изображение:

photo2

 

Весь проект можно взять вот здесь: 

 


Добавить комментарий