Шапка

14.6. Параллельные шины и линии связи

14.6.1 Пример: внутриплатная параллельная линия связи

Всем знакомы алфавитно-цифровые ЖК-индикаторы, которые можно встретить во многих электронных устройствах. Они давно стали промышленным стандартом и используют простую параллельную шину ( сейчас есть модели с последовательным интерфейсом ). Шина совсем простая: 8 линий DATA ( «D7...D0» ), 1 (!) линия адреса ( «RS» ), выбор операции ( «R/W'» ) и строб ( «E» ). Линии данных двунаправленные, остальные ожидают управляющего воздействия с внешнего устройства ( рис. 14.34 ). 1-разрядный адрес выбирает внутренний регистр инструкций ( RS=0 ) или данных ( RS=1 ). Этот индикатор встречался в Части 12 ( см., например, рис. 12.78 ).

Рис. 14.34   ЖК-модуль с параллельным интерфейсом. Показан цикл записи. Цифры в ns . Чтение выглядит аналогично, но сигнал «R/W'» имеет ВЫСОКИЙ уровень ( а задатчиком на линиях «D7...D0» является индикатор )

Функционирование - сама простота. Для записи символа надо установить бит адреса ( «RS» - ВЫСОКИЙ ), выбрать операцию ( «R/W'» - НИЗКИЙ ), поместить код символа на линии данных и подать положительный импульс на строб «E». Индикатор переходит в состояние «ЗАНЯТ» ( BUSY=1 ), которое индицируется установленным битом «D7» при чтении по адресу 0 . Когда BUSY=0 индикатор готов к приёму следующего символа.

[* Встречаются индикаторы, которые забивают на бит «BUSY», причём все сигналы индикаторов такого рода имеют масштаб миллисекунд, т.е. ответа на запрос занятости ждать приходится долго, даже если в индикаторе он есть, поэтому при общении проще учитывать программно требуемые временные соотношения и не задавать железке ненужных вопросов. Так, кстати, все линии переводятся в однонаправленный режим, и жизнь программиста/схемотехника заметно упрощается ].

Так происходит передача символа. Кроме неё можно очистить индикатор, изменить положение курсора или задать позицию следующего выводимого символа, для чего надо записать командный байт в регистр инструкций ( RS=0 ). Скажем, 01h очищает индикатор, 10h сдвигает курсор на один символ влево, а 06h задаёт режим записи новых символов справа от уже имеющихся. [* Попытка курсора «выехать» за границу «видимого окна» вызывает соответствующий сдвиг этого окна по видеопамяти размером 80×2 символов ] . Такой же протокол используется в индикаторах, сделанных по самым разным технологиям, включая приятную для глаза вакуумно-флуорисцентную, см. §12.5.3 . Легкомысленный пример показан в §15.10.4 .

14.6.2 Подключение через быструю параллельную шину: два примера

Символьные индикаторы в быстродействии не нуждаются, причём настолько, что интерфейс предусматривает работу через 4-разрядную шину [* используются линии «D7...D4», а процедура инициализации предусматривает обязательный набор действий по выбору ширины шины данных ] . Но случается, что скорость всё-таки требуется, например, при работе с производительными цифро-аналоговыми преобразователями. Один из примеров показан на рис. 14.35 . 8-разрядный ЦАП AD9748 работает со скоростью 210 Msps , т.е. новый байт ему на вход надо подавать каждые 5 ns . Для связи с ИМС нужен 8-разрядный входной порт и строб ( дифференциальный ) с уровнями LVDS. В отличие от алфавитно-цифрового ЖКИ, этот набор проводов шиной не является ни в каком её значении, т.к. здесь нет смены направления передачи или адресации в каком-либо виде, и нет даже вывода выбора кристалла или разрешения. Обратить внимание на временную диаграмму: время предустановки 2.0 ns , а время удержания 1.5 ns .

Рис. 14.35   Быстрый параллельный интерфейс для связи с ЦАПом на 210 Msps

На рис. 14.36 показан другой пример с близкими временными требованиями. Кристалл видеокодека может выдать полную полосу HD-видео, но кроме собственно данных требуются буквально сотни параметров изображения ( формат входного и выходного потока, цветокоррекция, контраст, тестовый сигнал и т.п. ). Поэтому входной порт имеет ширину 16 разрядов и крайне неприятные времена установки-удержания. Но есть и неторопливый последовательный канал I2C/SPI, через который можно получить доступ к ∼250 внутренним информационным регистрам. Гибридная архитектура позволяет получить удобство последовательной шины и скоростные возможности параллельного порта видеоданных. Последовательные шины разбираются в §14.7 .

Рис. 14.36   Видеокодировщик с 16-разрядной параллельной шиной для видеоданных и последовательным конфигурационным портом I2C

14.6.3 Прочие параллельные шины

Ранее отмечалось, что компьютерные шины, связывающие ЦП с памятью и периферией, сильно изменились и продолжают эволюционировать. Современные PCI и PCIe передают данные шириной от 16 до 64 бит со скоростью от 1 до 32 Gb/s . PCIe - гибрид, объединяющий последовательные шины и олицетворяющий тенденцию по переходу на последовательные линии связи. PCIe заменила предшественницу - двунаправленную многоточечную параллельную шину PCI. В параллельном варианте ширина данных 32 или 64 разряда, адреса - 32 разряда, а PCIe имеет от 1 до 16 однонаправленных линий точка-точка, каждая из которых может работать со скоростью 2.5 Gb/s ( PCIe v.1 ), 5 Gb/s ( v.2 ) или 8 Gb/s ( v.3 ). Тактовые сигналы подмешиваются в последовательные данные каждой линии, позволяя восстановить тактовый сигнал из общего потока 44 . При высоких скоростях передачи такой подход - суровая необходимость, позволяющая обойти ограничения скорости, возникающие при скольжении фронтов [* §10.8.2.C ] .

Параллельные шины есть и внутри самих микросхем. Все процессоры имеют внутренние каналы передачи данных для загрузки регистров и АЛУ, взаимодействия с внутренним кэшем, внешней памятью и т.д. В литературе проскакивают имена AMBA и Wishbone. скорость процессоров увеличивается, шинам приходится соответствовать. В настоящее время основной конфигурацией является быстрая и широкая «Линия переднего плана» ( FSB ), на которой сидят микросхемы поддержки, разделяющие шину памяти, быструю периферию ( PCIe ) и более медленные устройства ( SATA, PCI, USB, Ethernet ). Речь идёт о «Северном» и «Южном» мостах, которые постепенно превращаются в единый кристалл.

Ещё одним направлением развития современных компьютеров является усложнение и интеграция периферийных функций на кристалл процессора. В результате получается микроконтроллер со своим спектром «периферии», полностью готовый для встраивания в прибор, где использование шин и интерфейсов затруднено. Микроконтроллеры рассматриваются в Части 15 .

Встроенное вычислительное ядро удачно ложится на программируемую логику ( Часть 11 ) в форме «системы на кристалле» ( SoC ) - гибкой конструкции из «программной процессорной макрофункции», внутренних шин, памяти, периферии и массы быстрых линий ввода-вывода. Примером может служить серия FPGA Virtex фирмы Xilinx, доходящая до нескольких миллионов триггеров, десятков мегабайт оперативной памяти и более чем 500 портов LVDS. За SoC идут заказные кристаллы в форме ASSP ( см. §11.4.2 ), например, BCM7405 фирмы Broadcom – «Многофункциональный HD-видео/аудио SoC для спутниковых, кабельных и IP STB систем «картинка в картинке»» 45 .

14.6.4 Параллельные шины для связи с периферией

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

14.6.4.A PATA ( IDE )

16-разрядный интерфейс PATA ( parallel ATAPI или IDE ) в течение многих лет был стандартным способом подключения внутренних жёстких и оптических дисков. 40-проводный шлейф уже несколько старомоден. Даже после перехода на 80-жильный кабель ( с разделяющими земляными линиями для улучшения условий передачи ) верхний предел скорости остановился на уровне 133 MB/s ( ∼1 Gb/s ). PATA устарел и был заменён на последовательный интерфейс SATA.

14.6.4.B SCSI

8/16-разрядный параллельный «интерфейс для небольших компьютерных систем» ( SCSI ) берёт своё начало в 1980-х. В те времена он улучшал скорость и надёжность передачи ( исходно это были несимметричные линии с 5-вольтовыми сигналами, а затем произошёл переход на дифференциальную передачу 46 ) и до последнего времени был предпочтительным методом для построения дисковых и ленточных систем. Внутренние шины SCSI использовали 68-контактный шлейф с характерными D-образными разъёмами высокой плотности. Внешние устройства подключались экранированными многожильными 50- и 68-проводными кабелями 47 . Пропускная способность SCSI улучшалась с каждым новым поколением интерфейса, но, в конце концов, скорость и удобство последовательных SAS и SATA перевесили.

14.6.4.C GPIB

Интерфейс общего назначения IEEE-488 был предложен HP для управления и съёма данных с тестового и измерительного оборудования. Многие приборы таких фирм, как Agilent, Keithley, National Instruments, Stanford Research Systems и др. продолжают его поддерживать и сейчас. Для соединений используются надёжные 24-выводные соединители, а общая длина может достигать 20 m . Существуют интерфейсные карты под PCI и PCIe, кроме того, можно приобрести переходники Ethernet-GPIB и USB-GPIB.

14.6.4.D Принтерный порт ( “Centronics” )

Последний ( и самый медленный ) параллельный порт – «принтерный» ( LPT ), который был стандартом более 20 лет. Начиная с IBM PC и поныне, для него отводится адрес 378h . Он же используется для аппаратных ключей к программному обеспечению. Оригинальный параллельный интерфейс был однонаправленным ( выходные линии и сигналы квитирования ), но последующие расширения ( IEEE-1284: ECP, EPP ) превратили Centronics в двунаправленный и увеличили его скорость. Интерфейс стал сильнее напоминать шину. В настоящее время исчез из обращения практически полностью, т.к. современные принтеры используют USB и Ethernet. Найти параллельный порт в современной машине сложно, проще отыскать переходник USB-LPT.

Получается, что параллельный порт, в т.ч. эмулируемый через адаптер USB-LPT - самый простой путь переключения битов с PC. Если работа происходит в OS Windows, потребуется драйвер 48 , с помощью которого можно дотянуться до аппаратуры ( современные операционные системы не позволят работать с портами ввода-вывода непосредственно, как это происходило во времена DOS ). С драйвером код получается совсем простым. Вот, например, как он будет выглядеть на Python 49 в режиме терминала:

>>> import parallel
>>> p = parallel.Parallel() # open LPT1
>>> p.setData(0x55) 

Можно использовать компилируемые языки. Некоторые знакомые авторов используют PowerBASIC, который позволяет делать в коде ассемблерные вставки. В таком случае обращение к порту ввода-вывода будет выглядеть следующим образом:

Sub PortOut(ByVal PortNum as word, Byval Value as byte)
    ASM MOV AL, Value
    ASM MOV DX, PortNum
    ASM OUT DX, AL
End Sub 

44 PCIe использует кодировку «8b/10b»: каждый 8-битный блок данных передаётся по каналу в виде 10-битного символа. Набор канальных символов выбирается из соображений «dc-balance» ( число нулей должно быть равно числу единиц ) и «rll» ( ограничение длины непрерывной последовательности одинаковых битов [* чтобы схема восстановления тактового сигнала не вышла из синхронизации ] ). Для кодировки 8b/10b rll=5 [* а в стандартном асинхронном канале 8N1 - rll=9 ( восемь на информационную часть и один на стартовый или стоповый бит ) ] . <-

45 Если интересуют подробности, то вот что сообщает сайт. «BCM7405 - однокристальное решение для построения видеосистем высокого разрешения, кабельных и спутниковых тюнеров. Он объединяет быстрый процессор класса MIPS32/MIPS16e с производительностью 1100 DMIPS, высокоскоростной графический сопроцессор, позволяющий масштабировать изображение и менять кадровую синхронизацию, гибкий транспортный сопроцессор, декодер MPEG-4/VC-1/MPEG-2/AVS, программируемый аудио декодер, шесть видео-ЦАПов, высококачественный звуковой стерео ЦАП, два порта Fast Ethernet, один из которых включает физический уровень, три порта USB 2.0, шину расширения PCI v2.3, 400-мегагерцовый контроллер памяти DDR2 и вспомогательный периферийный модуль, отвечающий за элементы управления устройством в целом. Выполненный по 65-нанометровому техпроцессу BCM7405 предлагает один из самых высоких уровней интеграции в данном сегменте». <-

46 Дифференциальные соединения удваивают число проводов. Зато они сильно снижают взаимное влияние соседних каналов, имеют очень низкую чувствительность к шуму и низкий уровень излучения по земляной и питающей шинам ( из-за взаимной компенсации наводок ). Все указанные параметры позволяют использовать относительно низкие уровни сигналов и небольшие токи выходных каскадов. <-

47 Миниатюрные многопроводные соединители высокой плотности, исходно использовавшиеся в параллельной шине SCSI, оказались очень удобны в качестве линий связи для лабораторного оборудования. Они используются такими производителями, как National Instruments, а выпускаются HRS Hirose и Honda Connectors. <-

48 Например, DirectIO.exe или InpOut32.dll. <-

49 «setData(value)» - одна из нескольких функций, входящих в API pyParallel_API . Документация сообщает, что она «выставляет указанное значение на выводы параллельного порта». <-

Previous part:

Next part: