Chuh 0 25 января, 2014 Опубликовано 25 января, 2014 · Жалоба Здравствуйте, решил плотно разобраться с тем, как работает шина 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. Заранее спасибо, тем кто осилит это прочитать и помочь мне ответить на возникшие вопросы. Также прошу меня поправить, если где то выше я что-то понял или изложил не верно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
misyachniy 0 25 января, 2014 Опубликовано 25 января, 2014 · Жалоба Допустим у нас один MASTER и 4 SLAVE. Мы подали выходы мастера на всех SLAVE и объединив выходы SLAVE через ИЛИ подали их на вход MASTER? выше я что-то понял или изложил не верно? В шинной архитектуре применяется селекция устройств. В процессорах обычно производится дешифрация старших адресов. В реальных и виртуальных процессорах неактивные слейвы не реагируют на воздействие если дешифратор их не выбрал. При передаче данных к процессору все слейвы удерживают выход данных в третьем состоянии и процессор считывает данные с выбраного дешифратором. В виртуальных процессорах данные на вход процессора подает мультиплексор управляемый дешифратром. Кстате, не смог найти в стандарте описания, что должно делать устройство, если у него нет такого адреса, который запрашивает мастер. Должно ли оно в этом случае выдавать мастеру ACK_I? Не знаю как в Wishbone, но подозреваю что не должно. Второй пример: 2 MASTER и 2 SLAVE. Как их объеденять? Тоже через ИЛИ? Как MASTERы узнают, что шина занята и они не имеют права выставлять CYC_O? Для этого есть такое устройство как "арбитр шины". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 25 января, 2014 Опубликовано 25 января, 2014 · Жалоба .. Кстате, не смог найти в стандарте описания, что должно делать устройство, если у него нет такого адреса, который запрашивает мастер. Должно ли оно в этом случае выдавать мастеру 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 вот этого документа, ну и дальше по тексту Нужное специально выделил ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Chuh 0 25 января, 2014 Опубликовано 25 января, 2014 · Жалоба Ну как это нет, а вот это Страница 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'у? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться