Comments 29
Поэтому процессору разрешается писать в видеопамять только в то время, когда "луч" сканирует невидимую область.
Прямо олдскулы свело, вспомнился "снег" на CGA - там наоборот, процессор имел доступ когда пожелает, а ущемлялись права генератора сигнала. Для эстетов решение было софтовое, тоже ждали vsync.
При переключении эти микросхемы долбят острыми, как катана самурая, фронтами
Чтобы такого не было, около выхода микросхемы, в разрыв дорожки, ставится малоомный резистор, зачастую 47 Ом достаточно. Емкость линии и этот резистор образуют простой ФНЧ, который несколько сглаживает фронты сигнала. Если передача двухсторонняя, то резисторы ставятся у каждого источника/приемника сигнала.
Это помогает против переотражений сигнанла и "звона", а поможет ли от наводок?
Кстати, это уже третье объяснение, почему нужно ставить резистор у передатчика :) Первые два были:
Резистор увеличит сопротивление линии, что сгладит отражения, потому что они низкой мощности.
Резистор согласует импеданс линии с импедансом передатчика, что уберет отражения.
Я не особо в этой высокочастотной магии разбираюсь, но мне кажется, все три объяснения – просто взгляд с разных сторон на один и тот же процесс. Правильно?
Резистор конечно же не увеличит сопротивление линии, но если его собственное сопротивление много больше сопротивления линии, то сигнал у приёмника будет похож на то, как заряжается RC-цепочка, где R -- этот самый резистор, а C -- суммарная емкость линии. Ну разве что будет не чистая экспонента, а ступеньками с длительностью времени прохода сигнала по линии туда-сюда.
Резистор у источника НЕ убирает отражения у приёмника, если там несогласовано. Он эти отражения -- поглощает (если его сопротивление, конечно, равно или близко к волновому сопротивлению линии). Со стороны приёмника (который с т.з. линии -- обрыв) это выглядит как приходящий чистый сигнал без звона, вызванного отражениями.
И от наводок тоже резистор поможет, в случае, если источник на линии преимущественно видит ёмкостную нагрузку (а это случай для несогласованных относительно высокоомных линий, типа как если всё распаяно МГТФом или сделано на 2-слойной плате без полностью залитого одного слоя земли, и оканчиващихся высокоомным входом цифровой микросхемы). Дело в том, что заряд емкости резким фронтом -- это резкий и сильный импульс тока, который течёт и в обратную сторону по земле, связывающей приёмник и источник, получается такой 'виток' с током, который наводит пики напряжения во всех других 'витках', связанных с ним индуктивно (т.е. перекрывающихся с ним частично на плате).
Тут уже дали некоторые ответы. Дополню.
От наводок хорошо поможет минимальное расстояние между прямым и обратным проводником. Обычно обратным проводником является 0V или GND, поэтому есть рекомендация заливать GND полигоном. Вообще есть разные трюки с землей и зеленным полигоном. Например, применяется не только земляной полигон, но и окружение дорожек землей. Я не знаю как у вас разведены слои, но если у вас на верхнем слое, на фото, тоже земля, то это правильно, не хватает разве только переходных отверстий с равным шагом на внутренний (или с обратной стороны) земляной полигон.
Еще один способ уменьшения наводок — применение дифференциальных линий. Ставятся либо спец. преобразователи, либо микросхемы уже в них умеют по-умолчанию.
Еще можно несколько понизить сопротивление линии, чтобы электромагнитным волнам наводок было сложнее навести на ней напряжение, просто соединив резистором линию передачи (в её конце) и землю, скажем 5-47 кОм (выбирается как можно более низким, но при этом с сохранением работоспособности). Но это может вызвать ещё некоторые проблемы, поскольку отдаваемый ток в линию возрастет, то возрастет и потребление, импульсное, поэтому блокировочные емкости возле микросхемы необходимы. Этот способ также описан в согласовании волновых сопротивлений и для некоторых стандартных линий передачи применяют довольно малые сопротивления, около 100 Ом.
Не всякий резистор поможет, нужен обычный в круглом корпусе, он имеет индуктивное сопротивление и гасит вч помеху :)
Очень странно что у вас процессор на 1.5 Мгц может писать в 55нс память только на бордюре, когда оттуда не читаются видеоданные. Казалось бы, память 55 нс, это два ваших такта 25.175 Мгц. Видео читается раз в 8 ваших тактов. Остальные 3 слота по 2 такта совершенно свободны, во время них прекрасно мог бы влезть процессор и не один.
Таким макаром вообще можно было бы всю память расшарить между видео и процессором сразу, и более того, сделать эту память на DRAM (асинхронная, та что в симмах, 70 нс цикл) и получить сразу мегабайты оной 1 чипом.
Прочитал все три статьи. Больше всего собственно видеокарта интересовала, года два вынашиваю мысли по постройке компьютера на базе Zilog Z180, который случайно обнаружил в каком-то телефонном оборудовании, но так как не хотел делать вывод через всякие 1602 или семисегментные индикаторы, а ПЛИС для постройки видеокарты как-то не труъ использовать.
А ваш проект случаем не опенсорс? Можно ли где нибудь посмотреть “исходники”? Думаю многим было бы интересно.
![](https://habrastorage.org/getpro/habr/upload_files/4cb/f43/42e/4cbf4342ee9ea9736e0fbaf4be0b64ab.jpeg)
Да, опенсорс: https://github.com/imihajlow/ccpu/
Если задумаете прикрутить мою видеокарту к Z180, буду рад помочь советом.
Могу предложить идею, что ещё можно сделать. Я начинал своё знакомство с компьютерами с ZX-Spectrum. Точнее и их клонов. И если понять как работает сам компьютер я ещё мог по принципиальной схеме, то самый для меня сложный блок был именно блок формирования изображения.
Почему стоит попробовать? Потому что это уже не дисплей двухстрочный, но ещё и не VGA монитор. Зато можно подключить к любому телевизору, хоть Рекорду В-312 :-D (интересно, есть ли до сих пор работающие экземпляры?) А ещё, мне удавалось получить изображение с видеокарты VGA на телевизоре УПИМЦТ. Пользовался RGB входом для своего ZX-Spectrum и немного поднастроил частоту строчной развёртки. Изображения было так себе и часть терялось, но играть было можно в Command & Concuer.
Это невыносимо круто, пожалуйста, не останавливайтесь.
Если режим - только алфавитно-цифровой, то полезно уж иметь аппаратный курсор - процессор не то, чтобы очень сильный для программного мигания, да и прерываний в нем нет ;). А это сделать поверх уже спроектированного устройства относительно несложно.
Но главное достоинство этого видеоконтроллера - его образовательное значение. Помните книгу «телевидение - это очень просто!», или здешние посты месье @haqreu - Ваш пост по элегантности рассуждений и построений можно отнести к жемчужинам Хабра. Для большинства людей видеоконтроллер - магическая коробочка - мало кто представляет, как в принципе строятся такие устройства.
Как пример в Jupiter ACE.
Видеопамять была отдельной и состояла из двух банков объёмом 1 Кб. Несмотря на то, что компьютер имел только 1 видеорежим — чёрно-белый текст в 24 строки по 32 символа, он мог отображать графику за счёт возможности перепрограммирования знакогенератора. Большинство из 128 доступных ASCII символов могли быть переопределены как произвольный точечный рисунок размером 8 на 8 пикселей.
Jupiter ACE — бытовой компьютер, производившийся в 1980-е годы британской компанией Jupiter Cantab
P.S. Online эмулятор с играми Jupiter ACE
Game — Dark Star
![image hosted on sendpic.org](https://habrastorage.org/getpro/habr/comment_images/ece/2f3/193/ece2f319367a81969ee84c7d3a498fa3.png)
Я не хотел излишне усложнять мою первую видеокарту :) К тому же, если делать полностью переопределяемую таблицу без ПЗУ, шрифт будет отъедать большой кусок от драгоценной памяти для программы.
Знакогенератор это же отдельная аппаратно формируемая часть для отображения текстовых данных.
P.S. Предварительная загрузка знакогенератора может быть, например, по I2C, SPI последовательному каналу по старту программы например из SD карты.
Обратный поток «сырых данных» с памяти к процессору, при выборе зараннее прямоугольной области окна изображения (какого то размера) — так можно тоже улучшить ресурсы по работе с памятью для процессора. (т.е. локальный управляемый кэш уже выведенных данных в видеокарточку и их подмешивания обратно например по SPI интерфейсу)
Под стекло и на стену !)
Как раз таки простой вывод фонта в спектруме был отличный, если не гнаться за тактами:
LD B,8
LOOP:
LD A,(DE)
LD (HL),A
INC H
INC DE
DJNZ LOOP
Всё это вы рассказываете для борьбы за такты, если особо не заморачиваться со скоростью, то вполне всё просто. Вывод символа 6*8 не намного сложней 8*8, писал его сам в безинтернетные времена. А 4*8, как например в аласме, ещё быстрей, там и фонт хранится как правило сдвоенный.
А если уж нужна была скорость, то выводили либо строку целиком, либо для того же фонта 6*8 хранили его в памяти сразу 4 штуки, каждый сдвинут как надо. И выводили если надо не конструкцией LD A,(DE) LD (HL),A, кучкой POP’ов с PUSH’ами.
Расчёт нужной трети производится перед вызовом этой части кода.
Для печати символа высотой 8 пикселей и выровненными по знакоместам не нужно рассчитывать переход через треть.
Ещё писал печать собственного шрифта с символами различной ширины и высотой кратной 8 пикселям, то есть либо 8, либо 16. )) Для экономии места в памяти символы хранил перевернутыми, ещё какие то фишки были, не помню уже. Это было в допутинскую эпоху ещё.
А вообще боль начиналась с графикой. Это и переход через треть, и печать по маске, и теневой экран, и если хочешь красивую картинку по итогу получить, не забывать про этот чёртов клэшинг. ))
А на сколько сложно посадить всю эту конструкцию скажем на ISA шину? Сделать реальную видеокарту? Очень уж хотелось бы аутентичный 8086 собрать.
Вам именно к 8086 видеокарту VGA подцепить? Или вообще как заставить монитор отображать графику?
Если первый вариант, то ищите ISA VGA card по барахолкам.
Если второе, то мы должны пойти глубже, по пути Джеймса Шермана "VGA from scratch"
На текущий момент по этой теме им отснято уже 18 эпизодов.
А на счет сложно это или несложно, каждый решает сам. ;)
Насколько я помню, шина ISA похожа на то, что у меня, но там 20 бит адреса. Мне кажется, если захотеть, можно через несложный адаптер подключить ее прямо так без модификаций.
Видеокарта на дискретной логике