Перейти к содержанию
    

Много вопросов по шине Wishbone

Здравствуйте, решил плотно разобраться с тем, как работает шина Wishbone, но после прочтения стандарта многое осталось не ясным. Начну по порядку и опишу, что я понял.

 

Насколько я понял обязательный сигналов шине 10: CLK_I, RST_I, ADR_O, DAT_I, DAT_O, WE_O, SEL_O, STB_O, ACK_I, CYC_O (здесь и далее названия сигналов со стороны мастера).

 

С CLK_I и RST_I вроде все просто — это клок (по переднему фронту) и синхронный ресет. Кстате, насколько важно, чтобы ресет был именно синхронный?

 

Сигнал ADR_O — адрес, который должен быть валиден на момент, когда SLAVE увидит высокий уровень STB_O.

 

Сигнал WE_O — флаг операции (низкий уровень - чтение, высокий — запись), должен быть валиден на момент, когда SLAVE увидит высокий уровень STB_O.

 

Сигнал SEL_O — обязателен, только когда разрядность DAT_I, DAT_O меньше разрядности передаваемых переменных и определяет какой именно байт (при шине 8 бит), слов (при шине 16 бит). Фактически это можно считать младшими битами адреса. Должен быть валиден на момент, когда SLAVE увидит высокий уровень STB_O.

 

DAT_O — данные, которые необходимо записать по данному адресу. ,Должен быть валиден на момент, когда SLAVE увидит высокий уровень STB_O.

 

ACK_I — флаг того, SLAVE успешно принял команду от MASTERа и сформировал валидный ответ или произвел валидную запись. Это первый сигнал, с которым возникли вопросу.

1) Правильно ли я понимаю, что Standart и Pipelinded — это два разных режима работы шины, и в каком режиме шина будет работать фактически определяет разряботчик.

2) Правильно ли я понимаю, что в Standart режиме максимальная частота передачи данных не более 1 слова за 2 такта CLK_I?

3) Допустим в Pipelined режиме MASTER решил передать 3 слова. Он выставляет STB_O и судя по временным диаграммам, если SLAVE работает с той же частотой, то на следующем (втором) такте он выставит ACK_I в высокий уровень. Но вот вопрос, если все синхронно, то MASTER увидит ACK_I только на третьем такте. При этом ему надо уже на втором такте поменять адрес и данные, а он еще не получил сигнал ACK_I. Или в этом случае ACK_I должен быть асинхронно приравнен STB_O и CYC_O?

4) Аналогичная ситуация Pipelined режим и надо прочитать 3 слова. MASTER выставляет STB_O, ADR_O и WE_O=0. На следующем такте SLAVE видит эти сигналы и выставляет ACK_I и DAT_I мастеру. MASTER получит эти значения еще через такт. Вопрос может ли он менять ADR_O при сохранении STB_O=1 или он должен ждать ACK_I . И если должен ждать, то как обеспечивается частота передачи 1 слово за 1 CLK_I?

 

DAT_I — данные, переданные SLAVE при операции чтения. Валидны в момент, когда ACK_I=1.

 

STB_O — строб выполнения операции. Второй сигнал по которому вопрос:

В Standart режиме STB_O держится до тех пор пока не увидится ACK_I , а в Pipelined режиме столько тактов CLK_I, сколько надо передать?

 

STALL_I — необязательный сигнал, как я понял при его получении мастер должен оставлять данные ADR_O, WE_O, DAT_O постоянными до ближайшего сигнала ACK, а после хотя бы на 1 такт сделать STB_O=0.

 

CYC_O — сигнал захвата шины. Пока CYC_O=1 MASTER собирается занимать шину. Не понятно, где сигнал от INTERCONNECT, который сообщает мастеру, что он имеет право занять шину. Т.е. во всех примерах CYC_O и STB_O поднимаются одновременно, а что делать, если MASTER решил передать, а другой MASTER в этот момент уже занимает шину?

 

Вообще, вопрос объединения более 2 устройств по шине Wishbone для меня до сих пор остается не ясен.

 

Допустим у нас один MASTER и 4 SLAVE. Мы подали выходы мастера на всех SLAVE и объединив выходы SLAVE через ИЛИ подали их на вход MASTER?

 

Как мастер определяет с каким SLAVE ему сейчас общаться. Видимо по адресу. Т.е. INTERCONNECT должен разбирать какую-то часть адреса из которой выбирать какому из SLAVE устройств передать CYC_O от мастера? Есть ли другие способы?

 

Кстате, не смог найти в стандарте описания, что должно делать устройство, если у него нет такого адреса, который запрашивает мастер. Должно ли оно в этом случае выдавать мастеру ACK_I?

 

Второй пример: 2 MASTER и 2 SLAVE. Как их объеденять? Тоже через ИЛИ? Как MASTERы узнают, что шина занята и они не имеют права выставлять CYC_O? Может ли INTERCONNECT вежливо попросить MASTERа освободить шину, если тот слишком долго ее занимает (чтобы обеспечить равные права по доступу к шине)? Правильно ли я понимаю, что сигнал MASTER LOCK_O нужен, чтобы показать INTERCONNECT, что CYC_O он будет держать до конца и шину не отдаст? Зачем тогда у SLAVE есть LOCK_I, когда по-идее этот сигнал нужен только INTERCONNECT?

 

На некоторые из поставленных вопросов я нашел частичные ответы в стандарте, но я до конце не уверен, что правильно все понял, поэтому решил их задать людям, которые имеют опыт разработки на основе шины Wishbone.

 

Заранее спасибо, тем кто осилит это прочитать и помочь мне ответить на возникшие вопросы. Также прошу меня поправить, если где то выше я что-то понял или изложил не верно?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Допустим у нас один MASTER и 4 SLAVE. Мы подали выходы мастера на всех SLAVE и объединив выходы SLAVE через ИЛИ подали их на вход MASTER?

выше я что-то понял или изложил не верно?

 

В шинной архитектуре применяется селекция устройств.

В процессорах обычно производится дешифрация старших адресов.

 

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

 

При передаче данных к процессору все слейвы удерживают выход данных в

третьем состоянии и процессор считывает данные с выбраного дешифратором.

 

В виртуальных процессорах данные на вход процессора подает мультиплексор управляемый дешифратром.

 

Кстате, не смог найти в стандарте описания, что должно делать устройство, если у него нет такого адреса, который запрашивает мастер. Должно ли оно в этом случае выдавать мастеру ACK_I?

 

Не знаю как в Wishbone, но подозреваю что не должно.

Второй пример: 2 MASTER и 2 SLAVE. Как их объеденять? Тоже через ИЛИ? Как MASTERы узнают, что шина занята и они не имеют права выставлять CYC_O?

 

Для этого есть такое устройство как "арбитр шины".

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

..

Кстате, не смог найти в стандарте описания, что должно делать устройство, если у него нет такого адреса, который запрашивает мастер. Должно ли оно в этом случае выдавать мастеру ACK_I?

..

Ну как это нет, а вот это

● The handshaking mechanism allows a participating SLAVE to accept a data transfer,

reject a data transfer with an error or ask the MASTER to retry a bus cycle. The

SLAVE does this by generating the [ACK_O], [ERR_O] or [RTY_O] signals

respectively. Every interface must support the [ACK_O] signal, but the error and

retry acknowledgement signals are optional.

Страница 96 вот этого документа, ну и дальше по тексту

 

Нужное специально выделил ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну как это нет, а вот это

 

Страница 96 вот этого документа, ну и дальше по тексту

 

Нужное специально выделил ;)

 

Тогда остается такой вопрос: Если у меня есть сигналы ERR_O или RTY_O, то все вроде понятно. SLAVE не поднимает ACK_O, вместо этого он в зависимости от ситуации поднимает ERR_O или RTY_O. Правильно ли я понял, что если этих сигналов в шине нет, то в случае отсутствия адреса SLAVE держит все свои выходы в низком уровне.

 

Если это так, то для случая когда у всех SLAVE не пересекаются адресные зоны можно их выходы объеденять просто через ИЛИ, а и соответственно на их выходы CYC подавать CYC_O от MASTER без какой-либо логики, т.к. те кому данный адрес не соответсвует будут по всем выходным шинам держать низкий уровень. Так ли это?

 

В шинной архитектуре применяется селекция устройств.

В процессорах обычно производится дешифрация старших адресов.

 

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

 

При передаче данных к процессору все слейвы удерживают выход данных в

третьем состоянии и процессор считывает данные с выбраного дешифратором.

 

В виртуальных процессорах данные на вход процессора подает мультиплексор управляемый дешифратром.

 

 

 

Не знаю как в Wishbone, но подозреваю что не должно.

 

 

Для этого есть такое устройство как "арбитр шины".

Это вроде понятно. Но вопрос такой. Пытаясь занять шину MASTER поднимает сигнал CYC_O, далее арбитр шины по какому-то алгоритму определяет разрешить ли мастеру занять шину. Если разрешить, то сигнал MASTER'a CYC_O транслируется нужному SLAVE'у. Вопрос как арбитр может показать MASTER'у, что шину занимать нельзя? Или, что пора передать доступ к шине более преоритеному MASTER'у?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...