Jump to content

    
Sign in to follow this  
Chuh

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

Recommended Posts

Здравствуйте, решил плотно разобраться с тем, как работает шина 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.

 

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

 

 

 

Share this post


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

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

 

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

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

 

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

 

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

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

 

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

 

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

 

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

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

 

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

 

Share this post


Link to post
Share on other sites
..

Кстате, не смог найти в стандарте описания, что должно делать устройство, если у него нет такого адреса, который запрашивает мастер. Должно ли оно в этом случае выдавать мастеру 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 вот этого документа, ну и дальше по тексту

 

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

Share this post


Link to post
Share on other sites
Ну как это нет, а вот это

 

Страница 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'у?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this