Jump to content

    
Sign in to follow this  
Flip-fl0p

Синхронизация вывода видео на VGA монитор

Recommended Posts

Сигнал valid в HDMI в течении линии будет прерываться, если я правильно понял. То есть записали в buf3 данные рассчитали первый выходной пиксель, как сумму четного, нечетного пикселя 1-ой и 2-ой строки, деленную на 4. Ждем пока запишется в buf3 четный пиксель второй строки, рассчитываем второй выходной пиксель. Когда ожидаем в сигнале valid разрыв. Кадр не отобразится на мониторе.

Выдавайте через промежуточный буфер. Иначе никак....

Share this post


Link to post
Share on other sites
Суммируете входную точку с буфером, если это чётная строка, либо с нулём, если нечётная, и записываете сумму в тот же буфер, суммируете следующую точку с этим же буфером и записываете сумму в него же, увеличиваете указатель буфера, по окончании работы входного и выходного буферов, т.е. по началу обоих строчных интервалов гашения, меняете буферы местами.

 

Приходит кадр из 720 строк, за длительность кадра необходимо выдать подряд 360 строк. Причем 360-ую строку буду формировать во время прихода 719 и 720. То есть в любом случае необходимо копить линии, т.к. нельзя выдать одну линию, следующую не выдавать (сигналы hsync и valid бланкированы).

 

VESA стандарт pdf

VESA_standart.pdf

Share this post


Link to post
Share on other sites
360-ую строку буду формировать во время прихода 719 и 720

Нет, во время Вы не можете, только по прошествии — я же сразу сказал, что входной кадр сперва надо разобрать, а выходной затем собрать, потому что все синхросигналы по определению не совместимы, Вы не можете непосредственно использовать ни один входной сигнал в качестве выходного.

 

Также, всё в том же одном абзаце чуть выше я показал, что здесь достаточно всего двух буферов, на 640 точек каждый, входной и выходной соответственно, и рассказал, в какой момент они должны меняться местами.

Share this post


Link to post
Share on other sites
Нет, во время Вы не можете, только по прошествии — я же сразу сказал, что входной кадр сперва надо разобрать, а выходной затем собрать, потому что все синхросигналы по определению не совместимы, Вы не можете непосредственно использовать ни один входной сигнал в качестве выходного.

 

Также, всё в том же одном абзаце чуть выше я показал, что здесь достаточно всего двух буферов, на 640 точек каждый, входной и выходной соответственно, и рассказал, в какой момент они должны меняться местами.

 

Собираемый выходной кадр необходимо хранить во внешней памяти, а у меня условие использовать только внутренние ресурсы ПЛИС.

Share this post


Link to post
Share on other sites
Собираемый выходной кадр необходимо хранить во внешней памяти

С чего вдруг? Создание кадра — всего лишь создание трёх сигналов синхронизации.

Share this post


Link to post
Share on other sites
С чего вдруг? Создание кадра — всего лишь создание трёх сигналов синхронизации.

 

Нет, во время Вы не можете, только по прошествии — я же сразу сказал, что входной кадр сперва надо разобрать, а выходной затем собрать...

Share this post


Link to post
Share on other sites

Извлечение из поступающих сигналов полезной информации и создание из полезной информации исходящих сигналов — так понятнее?

 

Если Вы не способны создать синхронизацию, о чём собственно эта тема, то Вам, как и её автору, придётся делать послабление — сперва создание полного кадра в памяти, для эмоционального ощущения его целостности.

Share this post


Link to post
Share on other sites
Извлечение из поступающих сигналов полезной информации и создание из полезной информации исходящих сигналов — так понятнее?

 

Если Вы не способны создать синхронизацию, о чём собственно эта тема, то Вам, как и её автору, придётся делать послабление — сперва создание полного кадра в памяти, для эмоционального ощущения его целостности.

 

Так тема была создана для того, чтобы уважаемые гуру помогли помочь разобраться как правильно реализовать такую синхронизацию. И есть есть такой способ - то без применения внешнего кадрового буфера. И если мы не понимаем - чтобы нам дали пинка и разъяснили в чем мы не правы, и почему надо делать именно так, а не иначе, и данный процесс повторялся пока не наступит просветление в наших головах. Тогда и нам хорошо - мы поймем и будем знать как делать, и вам плюсик в карму. И база знаний накопится ещё одной толикой мудрости гуру(а форум я считаю в первую очередь отличной базой знаний), и вновь пришедшим и непросветлённым будет дана возможность созерцая эти страницы тоже наполниться мудростью...

Но уважаемые гуру лишь упрекают нас в неспособности создать такую синхронизацию....

 

Вот вы писали что:

 

На вход подано неизвестных размеров изображение, следовательно:

1) измерить его размеры, для чего посчитать в его CLK длину его DE и количество DE за интервал его VS;

2) на основе этих данных пересчитать коэффициенты интерполятора и задать длину всех буферов;

3) измерить интервал от VS до DE и посчитать требуемую положительную или отрицательную задержку для получения в требуемый, т.е. с учётом задержки на FIFO, момент аналогичных выходных сигналов;

4) по очередному входному VS зафиксировать собранные данные в качестве новых настроек выходного автомата и начать выдачу им сигналов;

5) продолжать измерять всё вышеперечисленное.

Тут понятно все кроме пункта 4.

Приведу картину для наглядности:

VGA_SYNC_PULSE.png

Из неё следует что одна строка состоит из:

1. Периода строчного импульса горизонтальной синхронизации(HSYNC)

2. Периода задней границы (Horisontal back porch).

3. Периода активных даных (data_enable).

4. Периода передней границы (Horisontal front porch).

Допустим я измерил интервал интервал времени источника от конца импульса VS до начала активных данных.

Получил некую константу. Что мне с ней делать ? Расскажите поподробнее про это, если Вас не затруднит...

Я изучаю исходники альтеры, и мне кажется скоро я плюну на это. Жуть жуткая. Несколько тысяч строк кода без комментариев и какой-либо логики...

PS UPD

А вообще тут правильно подметили, что такая синхронизация без применения внешнего буфера невозможна. Тому подтверждение найдено в xilinx appnote: https://www.xilinx.com/support/documentatio...g-with-vpss.pdf

Share this post


Link to post
Share on other sites
измерил интервал времени источника от конца импульса VS до начала активных данных

Измерить реальный интервал (т.е. непрерывными собственными (выходными) тактами) от начала входного VS до конца первого входного DE и прибавить к этому задержку на FIFO, т.е. измеренный теми же единицами интервал DE, умноженный на размер FIFO — получится задержка готовности входных данных (т.е. завершения принятия N входных строк, требуемых для вычисления первой выдаваемой строки) от фронта кадрового синхроимпульса.

 

В соответствии с заданным форматом выходного изображения, требуемая задержка от фронта создаваемого выходного кадрового синхроимпульса до требуемой предустановки выходных данных перед началом их выдачи известна и однозначна — вычитаете первую задержку из этой и получаете положительную или отрицательную фазу выходного автомата (состояния всех его счётчиков), с которой его надо устанавливать по фронтам входного кадрового синхроимпульса.

 

П.4 и п.5. напоминают о том, что о формате входного изображения всегда требуется знать всё, и он имеет право в любой момент смениться на другой, тупая молотилка захлебнётся.

Share this post


Link to post
Share on other sites

Огромное и Человеческое спасибо за то что вы пытаетесь нам помочь !

Но всё-же хотелось бы немного уточнить про выходной автомат.

Что понимается под термином "выходной автомат" ?

 

В моем случае в качестве автомата, который задает выходные синхроимпульсы - является пара автоматов:

Один прыгает по состояниям back_porch_st => visible_area_st => front_porch_st => HS_st => back_porch_st ... и.т.д. Он генерирует сигнал DE для горизонтальных линий, он генерирует сигнал строчной синхронизации, и генерирует сигнал окончания строки для второго автомата.

Другой автомат точно также прыгает по состояниям: back_porch_st => visible_area_st => front_porch_st => VS_st => back_porch_st ... И.Т.Д. Он принимает сигнал окончания строки от первого автомата считает строки и генерирует DE для вертикальных линий, генерирует сигнал кадровой синхронизации.

Фактически пара автоматов - реализуют классический синхрогенератор для генерации таймингов в соответствии с VESA.

Я могу запустить мой "синхрогенератор" в нужное мне время за счет того, что у меня автоматы начинают работу с состояния IDLE (которое нужно для первичной инициализации счетчиков, и возможности сброса синхрогенератора).

 

Я всё пытаюсь понять сказанное Вами, и никак не могу взять в толк, а что я должен делать с автоматом, чтобы добиться синхронности ?

Допустим я посчитал положительную или отрицательную задержку и запустил автомат в нужное время и первый кадр нового изображения вывелся как положено.

Но потом у нас получается, что в реальности новый кадр может начать генерироваться либо чуть раньше (относительно прошлого кадра, т.е мой синхрогенератор ещё не завершил работу - досчитывает длительность кадрового импульса), либо чуть позже (т.е выходной автомат начал рассчет back_porch_st нового кадра). Я могу даже величину этой рассинхронизации посчитать в pixel_clk нового изображениея. И для того чтобы синхронность не нарушилась я должен:

1. Либо раньше начать генерировать изображение, в случае если у нас входные кадры идут чуть чаще чем выходные. т.е не выдать полную длительность VSYNC а начать генерировать back_porch_st нового кадра.

2. Либо я должен чуть подождать при генерации нового изображения случае если у нас выходные кадры идут чуть медленнее чем выходные - т.е удлинить длительность back_porch_st нового кадра.

Но в обоих вариантах ожидание или "опережение" приводит к тому, что фактически искажается back_porch_st (в первой строке) что неминуемо ведет к искажению всего изображения (проверено на практике).

Share this post


Link to post
Share on other sites

Для любой синхронизации естественно должен быть запас (на опережение/отставание) — в данном случае, запас по фазе.

 

Я не в курсе, может мониторы и в самом деле зачем-то считают CLK, тогда этот запас, например, должен быть в виде большей частоты этого CLK, т.е. требуемый фиксированный интервал реального времени, в нём фиксированная пачка импульсов и изменяемая пауза, чтобы количество CLK в каждом интервале гашения не менялось. Ну или сделать простецкую цифровую ФАПЧ, т.е. дискретно менять частоту CLK (неактивный его перепад), управляя его делителем измеренной фазовой ошибкой, запас будет гораздо больше, т.е. уже можно будет менять частоту кадров.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this