13 декабря 2011 г.

Делаем курсач по VMEbus. Часть 3. Шина DTB

Наконец-то добрались до ключевых вещей.

В этой статье рассказывается о DTB - шине пересылки данных, которая играет самую важную роль при проектировании устройства ввода-вывода VME. Реализация взаимодействия нашего устройства с DTB в нашем случае - практически все, что надо сделать из стандарта VMEbus (акромя прерывания).

Объясняется  назначение линий DTB, рассматриваются типы циклов передачи по DTB.



Data Transfer Bus (шина пересылки данных) - одна из четырех шин VME - для нас самая нужная, она используется для передачи адреса, данных и некоторой служебной информации.

Типы циклов

На шине VME происходит 7 типов циклов.

Read cycle (цикл чтения): используется для передачи от одного до четырех байт от слэйва мастеру. Цикл начинается, когда мастер выставляет на шине адрес и модификатор адреса. Каждый слэйв принимает адрес и сравнивает его со своим. Если они совпадают, то слэйв пихает данные на шину и приветственно машет линией DTACK*. Мастер завершает цикл.

Write cycle (цикл записи): используется для передачи от одного до четырех байт от мастера слэйву. Цикл начинается, когда мастер выставляет на шине адрес и модификатор адреса. Каждый слэйв принимает адрес и сравнивает его со своим. Если они совпадают, то слэйв забирает данные себе и подтверждает получение. Мастер завершает цикл.

Block read cycle (цикл блочного чтения): используется для передачи блока размером от одного до двухсот петидесяти шести байт от слэйва мастеру. Такая большая передача состоит из многих маленьких передач по одному, двум, трем или четырем байтам. После начала блочной передачи мастер не освобождает шину, пока не будут прочитаны все байты. Мастер только один раз выставляет адрес и модификатор, а вот бедному слэйву приходится наращивать этот адрес, чтобы данные вытаскивались из следующей ячейки.

Block write cycle (цикл блочной записи): используется для передачи блока размером от одного до двухсот петидесяти шести байт от мастера слэйву. Такая большая передача состоит из многих маленьких передач по одному, двум, трем или четырем байтам. После начала блочной передачи мастер не освобождает шину, пока не будут прочитаны все байты. Мастер только один раз выставляет адрес и модификатор, а вот бедному слэйву приходится наращивать этот адрес, чтобы данные запихивались в следующую ячейку.

Read-modify-write cycle (цикл чтение-модификация-запись): используется, если мастер хочет как единоличник пользоваться ячейкой слэйва. Он будет сам в нее писать, сам из нее читать. Писать-читать-писать-читать... А остальные мастера будут сидеть и унывать. Очень грустный цикл, поэтому мы не будем его использовать

Address-only cycle (цикл только адрес): в этом цикле мастер просто так вещает на всю шину адрес. Слэйвы сидят, занятые своими делами, и ничего не подтверждают - им все по барабану.

Interrupt acknowledge cycle (цикл подтверждения прерываний): инициируется обработчиком прерываний, когда тот ВНЕЗАПНО обнаруживает запрос прерывания.

Линии DTB

Шина - это пучок проводков, иначе называемых линиями. DTB содержит 75 линий, разделенных на три типа (обратите внимание, что DS0* и DS1* входят в 2 типа, поскольку выполняют две функции):

    Линии адресации
        A01-A31
        AM00-AM05
        DS0*
        DS1*
        LWORD*

    Линии данных
        D00-D31

    Линии управления
        AS*
        DS0*
        DS1*
        DTACK*
        WRITE*

          *А01-А31 означает лапшу из 31 провода, то есть А01, А02, А03, А04...А31.

Когда говорят, что устройство выставляет какие-то данные на шину, подразумевают, что оно переводит отдельные линии в высокие (HIGH) или низкие (LOW) уровни, соответствующие логическим единице и нулю.

Звездочка (*) после названия линии означает, что линия подчиняется инверсной логике, то есть активным является низкий уровень. Если в названии линии звездочки нет, то активным уровнем будет высокий.

Назначение линий

Линии адресации
В памяти устройств на шине VME адресуются так называемые байтовые ячейки. Каждая байтовая ячейка имеет свой уникальный двоичный адрес. Байтовые ячейки объединяются в группы по 4 штуки по половым признакам двум младшим разрядам.


Для адресаци группы мастер использует линии A02-A31, а линии DS0*, DS1*, LWORD* и A01 используются для выбора адресуемой ячейки или ячеек из этой группы, а также типа цикла передачи данных.

AM00-AM05 называются модификаторами адреса. Они используются для передачи дополнительной информации вместе с адресом.

Линии данных
Объединительная плата может иметь 16 (D00-D15) линий данных или 32 (D00-D31). Если линий 16, то устройства могут одновременно пересылать по шине не более двух байт. Понятно, что если линий 32, то данные уже будут бегать толпами по четыре байта.

Линии управления
AS* - линия адресного строба. Отрицательный фронт сообщает всем слэйвам, что мастер выставил адрес и его можно читать.
DS0* - линия строба данных 0. Первая функция уже была описана (выбор адресуемой ячейки или ячеек из группы). Вторая: при записи первый отрицательный перепад означает, что мастер установил данные, при чтении первый положительный перепад говорит слэйву, что пора бы освободить шину от его данных.
DS1* - линия строба данных 1. Она делает то же самое, что и линия DS0*, обычно стробы этих двух линий мониторят одновременно.
BERR* - линия сигнала ошибки магистрали. Устанавливается в низкий уровень при безуспешной передаче.
DTACK* - линия сигнала подтверждения пересылки данных. При записи слэйв ставит на линии низкий уровень, подтверждая прием данных. При чтении слэйв ставит высокий уровень, чтобы показать готовность отдавать данные.
WRITE* - линия сигнала считывания/записи. Показывает направление пересылки данных: низкий - от мастера к слэйву, высокий: от слэйва к мастеру.

Уровни сигналов для адресации байтов в группе
 
        *even byte - четный байт, odd byte - нечетный байт


Использование линий данных для передачи во всех типах циклов


P.S. 

Жду ваших вопросов, замечаний и предложений в комментариях. Они точно оставляются, у меня получилось через openID. Узнайте, какой у вас openID в яндексе, майлру, рамблере или на гугал+ простым поисковым запросом типа "yandex openID".

Список статей

Часть 1. Введение. Евромеханика
Часть 2. Шины и устройства
Часть 3. Шина DTB
Часть 4. Slave-устройство на шине DTB. Циклы записи и чтения
Часть 5. Чтение адреса slave-устройством. Типы адресации. Регистр-защелка и компаратор
Часть 6. Программное управление slave-устройством. Дешифратор, D-триггер и свичи
Часть 7. Прерывания, прерыватели, шина приоритетных прерываний,вектор прерывания
Часть 8. Шинные формирователи
Часть 9. Рисуем схему по ЕСКД. Schemagee. Автоматическое создание списка элементов
Часть 10.Добавляем собственную микросхему в Schemagee
Часть 11. Импорт микросхемы из P-CAD в SchemaGee с последующим допиливанием

4 комментария:

  1. не понял, у нас в итоге управляющий сигнал будет поступать на мастера, и будет состоять из адреса и данных, например, адрес мастер будет выставлять, после подтверждения пихать данные, которые слейвы будут кушать, выдавая нам нужную "работу", типа ацп цап сирена космического корабля etc. ?

    ОтветитьУдалить
  2. Управляющий код поступает с мастера на слэйв.
    Слэйв его дешифрирует и понимает, что куда он должен писать.

    По адресному стробу с помощью адреса производится выбор регистра, в который будут записываться (или из которого читаться) данные. Например: регистр базового вектора прерывания (тебе его надо записывать), регистр выбора диапазона АЦП.

    А когда данные записываются в эти регистры по стробу данных, слэйв делает соответствующую работу. Например: если в регистр выбора диапазона АЦП записалась 1 из D00, то выбирается диапазон 0-5мА, если в регистр выбора диапазона АЦП записался 0 из D00, то выбирается диапазон 5-20мА.

    ОтветитьУдалить
  3. низуя не понял, управляющий код, сколько байт куда идет, можно ли ответвления etc.?

    ОтветитьУдалить
  4. Посчитай сколько тебе регистров надо адресовать и надо ли тебе что-то запускать. Приведу пример: пусть есть два канала АЦП. Измерение запускается командой. И еще есть прерыватель. Считаем, сколько регистров надо адресовать:

    1. регистр выбора канала
    2. регистр вектора прерывания
    3. регистр ПУСКа

    всего тебе надо адресовать 3 регистра, 2^2=4, 4>3. тебе надо 2 линии адреса отделить от шины и запихнуть их в двухбитный дешифратор, на выходе которого ты получишь 4 адреса регистра.

    Потом ты в эти регистры будешь писать данные (или читать оттудова).

    ОтветитьУдалить