Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: bidir, open-drain и i2c
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
paradox-17
Всем доброго времени суток.
Извините, если чушь полную спрашиваю, но возникла проблема:
Есть несколько устройств (slave) с i2c интерфейсом (линия клоков и двунаправленная линия данных SDA). Master i2c только один. Напрямую между собой они не связаны, но сигналы заведены на ПЛИС (Altera CycloneIII). Было бы неплохо организовать двунаправленный сквозной "провод" для линии SDA, чтобы при этом не заморачиваться управлением направлением wacko.gif сигнала (т.е. классическая развязка с помощью tri). К тому же внутри ПЛИС потребуется мультиплексировать сигналы, т.к. мастер один, а ведомых несколько.
Мне сказали, что open-drain смотреть надо. Я посмотрел, попробовал описать, но ничего толкового не получилось. И вообще, это возможно сделать двунаправленный "провод" насквозь, чтобы на нем одновременно висело два устройства? Если возможно, то приведите пожалуйста пример на verilog, vhdl или ahdl.
Всем заранее спасибо.
rezident
Что-то очень непонятно. Вы в FPGA мультиплексирование I2C собрались делать? Т.е. несколько шин I2C объединить? А мастером кто является? Внешняя м/с или в FPGA мастер организован? И вообще FPGA тут "при делах" или просто какой-то умник от разных I2C устройств провода к FPGA протянул?
AJIEKCEu
Цитата
И вообще FPGA тут "при делах" или просто какой-то умник от разных I2C устройств провода к FPGA протянул?

Насколько я понимаю, именно так.

paradox-17, я попробовал прикинуть - ничего путного не получилось. Может быть, зная точные времянки относительно SCL (при условии, что клиенты НЕ "притормаживают" обмен) можно было бы сделать что-то не сильно сложное, но все равно не тривиальное.

ЗЫ. Мне кажется, что выражение
Цитата
какой-то умник

не очень корректное. Тем более, уважаемый rezident - гуру.
paradox-17
Спасибо за внимание.
Цитата
И вообще FPGA тут "при делах"

FPGA при делах. В ней всякие нужные корки будут размещены. А вот i2c контроллер городить в ПЛИС очень не хочется, т.к. контроллер (master) уже есть в СPU на плате. То, что провода подведены на ПЛИС приходится воспринимать как данность cranky.gif . Фиг с ним, с мультиплексированием. Меня интересует просто возможность создания сквозного двунаправленного провода в ПЛИС без дополнительной логики, чтобы тупо повесить на линию SDA мастера с одной стороны (CPU) и слейва с другой (тоже внешний девайс на плате). В принципе реально или нет?
Спасибо.
rezident
Цитата(paradox-17 @ Oct 16 2007, 02:51) *
А вот i2c контроллер городить в ПЛИС очень не хочется, т.к. контроллер (master) уже есть в СPU на плате. То, что провода подведены на ПЛИС приходится воспринимать как данность cranky.gif .

Если это макет или пилотный вариант платы, то я бы на вашем месте просто проводами шины I2C соединил. А в следующей итерации избежал бы этой глупости. В противном случае как это сделать без контроллера I2C в FPGA (который должен следить за обменом по разным шинам, знать адреса всех этих устройств и изображать из себя мастера-супервизора I2C) я не знаю sad.gif
RobFPGA
Приветствую!


Увы, сделать такое без внутреннего управления буферами FPGA нельзя.
Тоесть контроллер I2C всеже городить придется.


Удачи! Rob.
DmitryR
Если этот двунаправленный провод 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
DmitryR, вроде действительно должно получится. Маладца!
paradox-17
DmitryR, Ваше решение выглядит правдоподобно и элегантно. Обязательно попробую и о результатах сообщу. Огромное спасибище a14.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.