|
Синхронизация вывода видео на VGA монитор, Как синхронизировать отмасштабированное видео c VGA монитором |
|
|
|
 |
Ответов
|
Aug 22 2018, 07:45
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Итак господа, провел вчера весь вечер за эксперементами. В качестве эксперемента был применен обычный синхрогенератор и генератор цветных полос. Выводы таковы: Цитата(_4afc_ @ Aug 21 2018, 12:07)  1. Back porch 48 pixel - может быть хоть 148 2. Back porch 33 lines - может быть хоть 133 3. pixel_clk не 25.175 MHz, а 25 175 000 импульсов в секунду, с довольно свободной скважностью. Данное утвержение мной не совсем подтвердилось. Собственно произошло ровно то, о чем я говорил : изменение любого из параметров Back porch в небольших пределах приводит к тому что изображение смещается. Если же изменять это значение в больших пределах - то матрица не определяет синхронизациию и изображение не выводится вообще... Но ! Если изменить соотношение Back porch и Front porch таким образом, чтобы суммарная длина строки оставалась одинаковой (для разрешения 640 x 480 длина линии равна 800 pix) - то изображение нормальное т.е. если мы увеличили значение Back porch на 50 то должны и уменьшить Front porch на 50. В случае если длина строки изменяется: Back porch увеличили на 50 а Front porch не трогали - требуется пререрасчет частоты и в этом случа мы фактиески получаем новое разрешение, которое совместимо с большинством VGA мониторов. Думаю, можно попробовать применить данный способ в качестве синхронизации с источником. Но надо проверять на живой матрице, поймет ли она тайминги, не совпадающие с теми, что указаны в datasheet на неё. Похоже на очень и очень грязный хак. Но может и сработает ! Цитата(_4afc_ @ Aug 21 2018, 12:07)  у меня покупной видеодатчик, когда из 1600х1200 делает 640х480 выдаёт 4 строчных синхры - потом пропуск. Его что тоже никуда не подключишь? А можно узнать параметры выходных синхросигналов которые выдает датчик: Какая частота pixel_clk Каковы параметры Back porch, Front porch, sync pulse, полярность импульсов ? Неужто он выдает 4 строчки с параметрами VESA 640х480, затем делает пропуск в одну строчку. затем опять выдает 4 строчки ? И все это делает с частотой pixel_clk разрешения 1600х1200 ? Цитата(_4afc_ @ Aug 21 2018, 12:07)  Почему сразу не на ЖК матрице 1024х768? А у меня матрица такова, что она работает в точности как монитор. Пока не подашь на неё правильные тайминги - фиг вам, а не работа. Цитата(Plain @ Aug 21 2018, 12:59)  Итого, никакой синхронизации нет вообще, тогда как тема именно о ней. Тема была о том, как сделать такую синхронизацию... Цитата(Plain @ Aug 21 2018, 12:59)  Для работы с вышеописанными минимального размера буферами Вам надо синхронизировать начала видимых областей, т.е. сбрасывать автомат по этому событию на входе. А не будет так работать, поскольку формируя сигнал сброса по началу данных от источника - мы фактически искажаем периоды front_porch нашего выходного сигнала со всеми вытекающими последствиями в виде сдвига изображения. И пока мы передаем сигнал из домена source_data в домен Vga_sync_gen для формирования сброса - мы натыкаемся на 1 такт нестабильности - что приводит к неравномерному периоду front_porch - что приводит к дерганию изображения и сильнейшему искажению. Если интересно могу фотографию сделать, ибо этот вариант я сразу попытался применить. Как мне кажется без буфферизации кадров во внешнем буффере не обойтись. Хотя как в IP ядрах Altera без внешнего буффера работает - пока загадка. Проведу ещё пару экспериментов и скорее всего начну делать двойную или тройную буфферизацию.
|
|
|
|
|
Aug 24 2018, 07:07
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 13-04-17
Из: Зеленоград
Пользователь №: 96 508

|
Цитата(Flip-fl0p @ Aug 22 2018, 10:45)  Данное утвержение мной не совсем подтвердилось. Собственно произошло ровно то, о чем я говорил : изменение любого из параметров Back porch в небольших пределах приводит к тому что изображение смещается. Если же изменять это значение в больших пределах - то матрица не определяет синхронизациию и изображение не выводится вообще... Странно. Я тоже думаю, что вот эти неактивные интервалы между строками и кадрами (front porch, back porch) допускается менять в определенных пределах. Разумеется pixel clock при этом тоже плавает. Но на параметры изображения это не должно влиять, разрешение и частота кадра остаются постоянными (частота строк может при этом совпадать, а может и нет). Я делал вывод изображения на промышленную матрицу, в спецификации на нее было указаны разрешенные диапазоны для всех этих porch-ей. Например, Vertical front porch: min = 7, recomended = 51, max = 100. Правда, horizontal back porch и vertictal back porch по спецификации менять не разрешалось, они были заданы строго. А по задаче, самое универсальное решение это буфер на весь кадр в DDR-памяти.
Сообщение отредактировал lembrix - Aug 24 2018, 07:12
|
|
|
|
|
Aug 28 2018, 15:02
|
Местный
  
Группа: Свой
Сообщений: 236
Регистрация: 28-06-13
Из: Минск, Беларусь
Пользователь №: 77 312

|
Цитата(lembrix @ Aug 24 2018, 10:07)  Странно. Я тоже думаю, что вот эти неактивные интервалы между строками и кадрами (front porch, back porch) допускается менять в определенных пределах. Разумеется pixel clock при этом тоже плавает. Но на параметры изображения это не должно влиять, разрешение и частота кадра остаются постоянными (частота строк может при этом совпадать, а может и нет). Я делал вывод изображения на промышленную матрицу, в спецификации на нее было указаны разрешенные диапазоны для всех этих porch-ей. Например, Vertical front porch: min = 7, recomended = 51, max = 100. Правда, horizontal back porch и vertictal back porch по спецификации менять не разрешалось, они были заданы строго. А по задаче, самое универсальное решение это буфер на весь кадр в DDR-памяти. Решаю аналогичную задачу, только интерфейс HDMI. Действительно porch можно менять в определенных пределах. Масштабирование получилось только если выдавать синхросигналы все на своих местах (кроме datavalid), изменять только datavalid сигнал, причем сначала необходимо выдавать все активные пиксели. Цитата(_4afc_ @ Aug 20 2018, 14:40)  Возьмите картинку 800x600 отскалируйте её до 640x480 и выведите в левом верхнем углу экрана 800х600. Можно поподробней про "отскалируйте". Как я понимаю делаем следующее: прореживаем каждую линию видео кадра, буферизируем полученный масштабированный кадр и выдаем его на экран 800х600. А если необходимо обойтись без внешней памяти для буферизации? менять пиксельклок?
|
|
|
|
|
Aug 29 2018, 05:12
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(Alexey_Rostov @ Aug 28 2018, 18:02)  Можно поподробней про "отскалируйте". Как я понимаю делаем следующее: прореживаем каждую линию видео кадра, буферизируем полученный масштабированный кадр и выдаем его на экран 800х600. А если необходимо обойтись без внешней памяти для буферизации? менять пиксельклок? Прореживание дает уж больно некрасивый результат. Примените тогда уж алгоритм ближайшего соседа... Цитата Если без внешней памяти, то нужна внутренняя память на как минимум на 4*640 точек (может две таких для буферизации двойной) Тогда 800*5 валидных клоков надо заменить на 640*4. Т.е. на каждые 25 входящих выдать 16 наружу. А если не сложно то скажите с какими параметрами идет выходной сигнал ? Частота Pixel_clk как я понимаю соответствует входному разрешению. А полярность кадрового и строчного импульса, их длительность чему должны соответствовать ?
|
|
|
|
|
Aug 29 2018, 06:05
|
Местный
  
Группа: Свой
Сообщений: 236
Регистрация: 28-06-13
Из: Минск, Беларусь
Пользователь №: 77 312

|
Цитата(Flip-fl0p @ Aug 29 2018, 08:12)  Прореживание дает уж больно некрасивый результат. Примените тогда уж алгоритм ближайшего соседа...
А если не сложно то скажите с какими параметрами идет выходной сигнал ? Частота Pixel_clk как я понимаю соответствует входному разрешению. А полярность кадрового и строчного импульса, их длительность чему должны соответствовать ? У меня задача попроще чем у ТС. Входной поток 1280х720 60 Гц (74.25 МГц пиксельклок). Необходимо масштабировать с коэффициентом равным 2, т.е. получить 640х360 разрешение. При этом алгоритм использует только внутреннюю память ПЛИС, т.е. места для хранения всего кадра нет. Решение вижу следующее: 1. Генерировать пиксельклок ниже чем 74.25 (при этом как прочитал выше значение частоты выбирается согласно стандарта VESA), использовать буферизацию только по одной линии и расставлять согласно стандарта vsync, hsync со своими back\front porch'ами и длительностями. При этом в буфер записывать каждый второй пиксель. Кто нибудь реализовывал аналогичным способом или есть другой вариант? Цитата(_4afc_ @ Aug 28 2018, 18:53)  Если без внешней памяти, то нужна внутренняя память на как минимум на 4*640 точек (может две таких для буферизации двойной)
Тогда 800*5 валидных клоков надо заменить на 640*4. Т.е. на каждые 25 входящих выдать 16 наружу. Собрал свой источник видеосигнала 1280х720 60 Гц, уменьшал зону active pixel в несколько раз, монитор кадры отображает. Если в зоне active pixel бланкировать через линию и в линии через пиксель (для масштабирования на 2), то монитор не отображает видео кадр. Отсюда вывод: зона active pixel должна быть без разрывов.
|
|
|
|
|
Aug 29 2018, 09:47
|
Местный
  
Группа: Свой
Сообщений: 236
Регистрация: 28-06-13
Из: Минск, Беларусь
Пользователь №: 77 312

|
Цитата(Plain @ Aug 29 2018, 09:21)  Надо усреднять 2х2 точки, разбирать входной кадр и синхронизироваться с ним вышеописанным способом, потому что интервалы гашения имеют право быть произвольными. Соответственно, для усреднения достаточно буфера на одну строку длиной 640 точек и чередования, но размер FIFO будет определяться качеством синхронизации. Данное усреднение или прореживание актуально только по горизонтальной развертке, тогда действительно пару буферов на 640 точек будет достаточно. Но как быть с вертикальной разверткой? Просто бланкировать каждую вторую линию для получения 360-ти линий не получится: зона active pixels должна быть без пропусков.
|
|
|
|
|
Aug 29 2018, 10:26
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(Alexey_Rostov @ Aug 29 2018, 12:47)  Данное усреднение или прореживание актуально только по горизонтальной развертке, тогда действительно пару буферов на 640 точек будет достаточно. Но как быть с вертикальной разверткой? Просто бланкировать каждую вторую линию для получения 360-ти линий не получится: зона active pixels должна быть без пропусков. Берем 4 буфера: buff0 - на пол строки. buff1 - на пол строки. buff2 - на 1 пиксель. (Фактически обычный регистр с сигналом разрешения) buff3 - на 1 пиксель. (Фактически обычный регистр с сигналом разрешения) Начинаем писать видеоданные первой строки: В buff0 - пишем нечетные пиксели. В Buff1 - пишем четные пиксели. В итоге мы имеем всю строку записанную в буфер. Когда пошла вторая строка - опять записываем сначала четные пиксели но уже в buff2 , и нечетные пиксели в buff3. Как только у вас будут записаны данные в buff3 вы фактически получили 4 пикселя в буфферах из которых можно будет рассчитать банальным усреднением новый пиксель. Выглядит это так (цифра- номер буфера куда пишутся пиксели): Код -- | | Верхняя строка: 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 -- | | Нижнняя строка: 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 Соответственно у вас по горизонтали и по вертикали картинка будет в 2 раза меньше. Качество выходного видео- вполне нормальное. Не билинейная интерполяция конечно. Но и алгоритм с математикой простейшие.
|
|
|
|
|
Aug 29 2018, 10:46
|
Местный
  
Группа: Свой
Сообщений: 236
Регистрация: 28-06-13
Из: Минск, Беларусь
Пользователь №: 77 312

|
Цитата(Flip-fl0p @ Aug 29 2018, 13:26)  Берем 4 буфера: buff0 - на пол строки. buff1 - на пол строки. buff2 - на 1 пиксель. (Фактически обычный регистр с сигналом разрешения) buff3 - на 1 пиксель. (Фактически обычный регистр с сигналом разрешения) Начинаем писать видеоданные первой строки: В buff0 - пишем нечетные пиксели. В Buff1 - пишем четные пиксели. В итоге мы имеем всю строку записанную в буфер. Когда пошла вторая строка - опять записываем сначала четные пиксели но уже в buff2 , и нечетные пиксели в buff3. Как только у вас будут записаны данные в buff3 вы фактически получили 4 пикселя в буфферах из которых можно будет рассчитать банальным усреднением новый пиксель. Выглядит это так (цифра- номер буфера куда пишутся пиксели): Код -- | | Верхняя строка: 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 -- | | Нижнняя строка: 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 Соответственно у вас по горизонтали и по вертикали картинка будет в 2 раза меньше. Сигнал valid в HDMI в течении линии будет прерываться, если я правильно понял. То есть записали в buf3 данные рассчитали первый выходной пиксель, как сумму четного, нечетного пикселя 1-ой и 2-ой строки, деленную на 4. Ждем пока запишется в buf3 четный пиксель второй строки, рассчитываем второй выходной пиксель. Когда ожидаем в сигнале valid разрыв. Кадр не отобразится на мониторе.
|
|
|
|
Сообщений в этой теме
Flip-fl0p Синхронизация вывода видео на VGA монитор Aug 20 2018, 08:01 warrior-2001 Берем 3 буффера.
В один пишем, из другого читаем, ... Aug 20 2018, 08:43 Flip-fl0p Цитата(warrior-2001 @ Aug 20 2018, 11... Aug 20 2018, 09:08 prostoRoman Цитата(Flip-fl0p @ Aug 20 2018, 11:0... Aug 20 2018, 09:34 Flip-fl0p Цитата(prostoRoman @ Aug 20 2018, 12:34) ... Aug 20 2018, 09:50  _4afc_ Цитата(Flip-fl0p @ Aug 20 2018, 13:5... Aug 20 2018, 11:40   Flip-fl0p Цитата(_4afc_ @ Aug 20 2018, 14:40) С как... Aug 20 2018, 12:11    _4afc_ Цитата(Flip-fl0p @ Aug 20 2018, 16:1... Aug 20 2018, 13:56    _4afc_ Цитата(Flip-fl0p @ Aug 20 2018, 16:1... Aug 21 2018, 09:24 _4afc_ Цитата(Flip-fl0p @ Aug 20 2018, 12:0... Aug 20 2018, 09:38 Plain 1080 / 768 = 1,4 строки FIFO, округляется до 2, пл... Aug 20 2018, 20:51 warrior-2001 Я вот так и не понять сути проблемы.
Указал выше, ... Aug 21 2018, 07:16 Flip-fl0p Мне стыдно признаться, но даже сейчас я не совсем ... Aug 21 2018, 08:01 _4afc_ А я считаю, что
1. Back porch 48 pixel - може... Aug 21 2018, 08:45  warrior-2001 Цитата(_4afc_ @ Aug 21 2018, 11:45) у мен... Aug 21 2018, 08:48  ikm Цитата(_4afc_ @ Aug 21 2018, 11:45) у мен... Aug 21 2018, 09:02 _4afc_ Цитата(Flip-fl0p @ Aug 21 2018, 12:0... Aug 21 2018, 09:07 prostoRoman Цитата(Flip-fl0p @ Aug 21 2018, 11:0... Aug 21 2018, 09:14  Flip-fl0p Цитата(prostoRoman @ Aug 21 2018, 12:14) ... Aug 21 2018, 09:32 Plain Цитата(Flip-fl0p @ Aug 21 2018, 11:0... Aug 21 2018, 09:59 Sergey_Bekrenyov По-моему, у TC в голове все смешалось. Scaler толь... Aug 21 2018, 19:39 Flip-fl0p Цитата(Sergey_Bekrenyov @ Aug 21 2018, 22... Aug 22 2018, 03:51  Sergey_Bekrenyov Цитата(Flip-fl0p @ Aug 22 2018, 06:5... Aug 23 2018, 13:45   Flip-fl0p Цитата(Sergey_Bekrenyov @ Aug 23 2018, 16... Aug 23 2018, 15:33    Sergey_Bekrenyov Цитата(Flip-fl0p @ Aug 23 2018, 18:3... Aug 23 2018, 18:52     Flip-fl0p Цитата(Sergey_Bekrenyov @ Aug 23 2018, 21... Aug 23 2018, 19:07      Sergey_Bekrenyov Цитата(Flip-fl0p @ Aug 23 2018, 22:0... Aug 24 2018, 11:37 Plain Цитата(Flip-fl0p @ Aug 22 2018, 10:4... Aug 22 2018, 18:17   _4afc_ Цитата(Alexey_Rostov @ Aug 28 2018, 18:02... Aug 28 2018, 15:53    _4afc_ Цитата(Flip-fl0p @ Aug 29 2018, 08:1... Aug 29 2018, 05:49         Flip-fl0p Цитата(Alexey_Rostov @ Aug 29 2018, 13:46... Aug 29 2018, 10:51     Flip-fl0p Цитата(Alexey_Rostov @ Aug 29 2018, 09:05... Aug 29 2018, 06:23     _4afc_ Цитата(Alexey_Rostov @ Aug 29 2018, 09:05... Aug 29 2018, 10:21      Alexey_Rostov Цитата(_4afc_ @ Aug 29 2018, 13:21) Вот п... Aug 29 2018, 10:29 warrior-2001 Ну я же скинул ссылку на проект рабочий от Альтеры... Aug 22 2018, 08:33 Flip-fl0p Цитата(warrior-2001 @ Aug 22 2018, 11... Aug 22 2018, 09:02 Plain Цитата(Alexey_Rostov @ Aug 29 2018, 12:47... Aug 29 2018, 10:40 Alexey_Rostov Цитата(Plain @ Aug 29 2018, 13:40) Суммир... Aug 29 2018, 10:53  Plain Цитата(Alexey_Rostov @ Aug 29 2018, 13:53... Aug 29 2018, 12:31   Alexey_Rostov Цитата(Plain @ Aug 29 2018, 15:31) Нет, в... Aug 29 2018, 13:23    Plain Цитата(Alexey_Rostov @ Aug 29 2018, 16:23... Aug 29 2018, 13:48     Alexey_Rostov Цитата(Plain @ Aug 29 2018, 16:48) С чего... Aug 30 2018, 05:05 Plain Извлечение из поступающих сигналов полезной информ... Aug 30 2018, 05:31 Flip-fl0p Цитата(Plain @ Aug 30 2018, 08:31) Извлеч... Aug 31 2018, 07:47 Plain Цитата(Flip-fl0p @ Aug 31 2018, 10:4... Aug 31 2018, 09:37  Flip-fl0p Цитата(Plain @ Aug 31 2018, 12:37)
Огром... Sep 18 2018, 08:19 Plain Для любой синхронизации естественно должен быть за... Sep 18 2018, 09:29
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|