paradox-17 0 15 октября, 2007 Опубликовано 15 октября, 2007 · Жалоба Всем доброго времени суток. Извините, если чушь полную спрашиваю, но возникла проблема: Есть несколько устройств (slave) с i2c интерфейсом (линия клоков и двунаправленная линия данных SDA). Master i2c только один. Напрямую между собой они не связаны, но сигналы заведены на ПЛИС (Altera CycloneIII). Было бы неплохо организовать двунаправленный сквозной "провод" для линии SDA, чтобы при этом не заморачиваться управлением направлением сигнала (т.е. классическая развязка с помощью tri). К тому же внутри ПЛИС потребуется мультиплексировать сигналы, т.к. мастер один, а ведомых несколько. Мне сказали, что open-drain смотреть надо. Я посмотрел, попробовал описать, но ничего толкового не получилось. И вообще, это возможно сделать двунаправленный "провод" насквозь, чтобы на нем одновременно висело два устройства? Если возможно, то приведите пожалуйста пример на verilog, vhdl или ahdl. Всем заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 15 октября, 2007 Опубликовано 15 октября, 2007 · Жалоба Что-то очень непонятно. Вы в FPGA мультиплексирование I2C собрались делать? Т.е. несколько шин I2C объединить? А мастером кто является? Внешняя м/с или в FPGA мастер организован? И вообще FPGA тут "при делах" или просто какой-то умник от разных I2C устройств провода к FPGA протянул? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AJIEKCEu 0 15 октября, 2007 Опубликовано 15 октября, 2007 · Жалоба И вообще FPGA тут "при делах" или просто какой-то умник от разных I2C устройств провода к FPGA протянул? Насколько я понимаю, именно так. paradox-17, я попробовал прикинуть - ничего путного не получилось. Может быть, зная точные времянки относительно SCL (при условии, что клиенты НЕ "притормаживают" обмен) можно было бы сделать что-то не сильно сложное, но все равно не тривиальное. ЗЫ. Мне кажется, что выражение какой-то умник не очень корректное. Тем более, уважаемый rezident - гуру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
paradox-17 0 15 октября, 2007 Опубликовано 15 октября, 2007 · Жалоба Спасибо за внимание. И вообще FPGA тут "при делах" FPGA при делах. В ней всякие нужные корки будут размещены. А вот i2c контроллер городить в ПЛИС очень не хочется, т.к. контроллер (master) уже есть в СPU на плате. То, что провода подведены на ПЛИС приходится воспринимать как данность :cranky: . Фиг с ним, с мультиплексированием. Меня интересует просто возможность создания сквозного двунаправленного провода в ПЛИС без дополнительной логики, чтобы тупо повесить на линию SDA мастера с одной стороны (CPU) и слейва с другой (тоже внешний девайс на плате). В принципе реально или нет? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 15 октября, 2007 Опубликовано 15 октября, 2007 · Жалоба А вот i2c контроллер городить в ПЛИС очень не хочется, т.к. контроллер (master) уже есть в СPU на плате. То, что провода подведены на ПЛИС приходится воспринимать как данность :cranky: . Если это макет или пилотный вариант платы, то я бы на вашем месте просто проводами шины I2C соединил. А в следующей итерации избежал бы этой глупости. В противном случае как это сделать без контроллера I2C в FPGA (который должен следить за обменом по разным шинам, знать адреса всех этих устройств и изображать из себя мастера-супервизора I2C) я не знаю :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 15 октября, 2007 Опубликовано 15 октября, 2007 · Жалоба Приветствую! Увы, сделать такое без внутреннего управления буферами FPGA нельзя. Тоесть контроллер I2C всеже городить придется. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryR 0 16 октября, 2007 Опубликовано 16 октября, 2007 · Жалоба Если этот двунаправленный провод open drain (подтянутый к 1), то можно, исходя из того, что направление меняется только через 1 (HighZ) на обоих концах. reg [1:0] state=0; // idle, a->b, b->a always @(posedge clk) case(state) 0:if(a==0) state<=1; else if(b==0) state<=2; 1:if(a==1) state<=0; 2:if(b==1) state<=0; endcase assign a=(state==2) ? 0:Z; assign b=(state==1) ? 0:Z; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AJIEKCEu 0 16 октября, 2007 Опубликовано 16 октября, 2007 · Жалоба DmitryR, вроде действительно должно получится. Маладца! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
paradox-17 0 16 октября, 2007 Опубликовано 16 октября, 2007 · Жалоба DmitryR, Ваше решение выглядит правдоподобно и элегантно. Обязательно попробую и о результатах сообщу. Огромное спасибище :a14: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться