Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Переключение входов I2S на плис
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Evgeny72
Добрый день! Посоветуйте, как правильно реализовать. Имеется 4 асинхронных друг от друга входные группы сигналов I2S
(сигналы data, lrck, bck внутри одной группы между собой синхронны). Необходимо переключать эти группы на выход и полученную на выходе группу
сигналов необходимо перепривязать к другому тактовому сигналу (EXTERNAL) асинхронному входным сигналам I2S. Сетки частот групп сигналов I2S могут
быть разными (lrck - 44,1; 48; 88,2; 96 ... 384 KHz соответственно меняется bck от 2,8 MHz до 24,576 MHz), Данные могут быть 16 или 24 бита. Может просто отсутствовать группа
сигналов I2S по любому из входов, это нормально. Иными словами, на одном из входов может быть 48 kHz, 24 bit, на другом входе - 88,2 kHz, 16 bit.
Как правильно это сделать?
1. Входные сигналы каждой групп завести на мультиплексоры, переключать, потом подать dual clock FIFO, получить новую стеку сигналов lrck, bck
привязанную к тактовому сигналу (EXTERNAL).
2. Установить на каждой входной группе I2S по dual clock FIFO, получить новую стеку сигналов lrck, bck привязанную к тактовому сигналу (EXTERNAL) и
подать на мультиплексоры?
3. Что-то другое?
PLL в предложенных мною вариантах не задействовано. Может вместо DC FIFO использовать dual clock RAM?
iosifk
Цитата(Evgeny72 @ Mar 6 2017, 14:02) *
Добрый день! Посоветуйте, как правильно реализовать. Имеется 4 асинхронных друг от друга входные группы сигналов I2S
(сигналы data, lrck, bck внутри одной группы между собой синхронны). Необходимо переключать эти группы на выход и полученную на выходе группу
сигналов необходимо перепривязать к другому тактовому сигналу (EXTERNAL) асинхронному входным сигналам I2S. Сетки частот групп сигналов I2S могут
быть разными (lrck - 44,1; 48; 88,2; 96 ... KHz соответственно меняется bck), Данные могут быть 16 или 24 бита. Может просто отсутствовать группа
сигналов I2S по любому из входов, это нормально. Иными словами, на одном из входов может быть 48 kHz, 24 bit, на другом входе - 88,2 kHz, 16 bit.
Как правильно это сделать?
1. Входные сигналы каждой групп завести на мультиплексоры, переключать, потом подать dual clock FIFO, получить новую стеку сигналов lrck, bck
привязанную к тактовому сигналу (EXTERNAL).
2. Установить на каждой входной группе I2S по dual clock FIFO, получить новую стеку сигналов lrck, bck привязанную к тактовому сигналу (EXTERNAL) и
подать на мультиплексоры?
3. Что-то другое?
PLL в предложенных мною вариантах не задействовано. Может вместо DC FIFO использовать dual clock RAM?

Даже 96 KHz это гораздо меньше, чем 50 или 100 Мгц частоты всего остального проекта. Я бы сразу же на входе сделал привязку к системной частоте через пару триггеров. И потом бы сделал автоматы для приема-передачи... По поводу FIFO... А что на 50 или 100 Мгц Вы не успеете принять 96 кГц? Зачем оно нужно?
Burenkov Sergey
Цитата(Evgeny72 @ Mar 6 2017, 14:02) *
Добрый день! Посоветуйте, как правильно реализовать. Имеется 4 асинхронных друг от друга входные группы сигналов I2S
(сигналы data, lrck, bck внутри одной группы между собой синхронны). Необходимо переключать эти группы на выход и полученную на выходе группу
сигналов необходимо перепривязать к другому тактовому сигналу (EXTERNAL) асинхронному входным сигналам I2S. Сетки частот групп сигналов I2S могут
быть разными (lrck - 44,1; 48; 88,2; 96 ... KHz соответственно меняется bck), Данные могут быть 16 или 24 бита. Может просто отсутствовать группа
сигналов I2S по любому из входов, это нормально. Иными словами, на одном из входов может быть 48 kHz, 24 bit, на другом входе - 88,2 kHz, 16 bit.
Как правильно это сделать?
1. Входные сигналы каждой групп завести на мультиплексоры, переключать, потом подать dual clock FIFO, получить новую стеку сигналов lrck, bck
привязанную к тактовому сигналу (EXTERNAL).
2. Установить на каждой входной группе I2S по dual clock FIFO, получить новую стеку сигналов lrck, bck привязанную к тактовому сигналу (EXTERNAL) и
подать на мультиплексоры?
3. Что-то другое?
PLL в предложенных мною вариантах не задействовано. Может вместо DC FIFO использовать dual clock RAM?

Если у вас источники синхронизации разные, то нужно придумывать аналог frame rate converter, даже самый небольшой расснинхрон частоты рано или поздно приведет к переполнению фифо
вверх или вниз. Я бы на каждый вход завел буфер в памяти и писал туда постоянно, а выходной блок начинал бы читать из нужного буфера в соответствии с тем с какого входа надо брать данные.

Не понятно что вы хотите сделать с sample rate... Пересемплирование это вообще отдельная песняsm.gif

Flip-fl0p

Спрошу наверное в этой-же теме.
У меня вопрос возник по физическому подключению к шине I2C.
Как правильно выводы SLAVE устройства , реализованного в FPGA, подключать на эту шину ? Естественно порты будут назначены в файле верхнего уровня как INOUT. Требуется ли рекомендуемая подтяжка выводов к питанию через резистор 10 кОм ? На макетной плате все пользовательские выводы имеют токоограничивающий резистор, и защиту от перенапряжения через 2 диода Шоттки.
Основная задача, которую я хочу решить: хочу реализовать минимальный DDC (display data channel) на FPGA. Для того, чтобы источник DVI сигнала считал по этому интерфейсу данные о матрице и формировал сигнал под нужное мне разрешение. Физически общение происходит по I2C, собственно и начал осваивать этот интерфейс.
Evgeny72
Цитата(Burenkov Sergey @ Mar 6 2017, 16:17) *
Не понятно что вы хотите сделать с sample rate... Пересемплирование это вообще отдельная песняsm.gif


sample rate и frequency lrck, bck будут без изменений, т.е. что на входе, то и на выходе должно быть.
zxcv
Цитата(Evgeny72 @ Mar 6 2017, 14:02) *
Имеется 4 асинхронных друг от друга входные группы сигналов I2S ...

1. Для этого есть специальные микросхемы: SRC (Sample Rste Converters) Их делают в том числе Cirrus Logic и Analog Devices
2. У Xilinx до ISE 14.2 для Spartan 6 и Virtex 6 была Asynchronous Sample Rate Converter Core
3. У Xilinx есть несколько апликух, в которых есть примеры реализации SRC: xapp514 и xapp1014.
Bad0512
Цитата(Evgeny72 @ Mar 6 2017, 20:00) *
sample rate и frequency lrck, bck будут без изменений, т.е. что на входе, то и на выходе должно быть.

Что будет в момент переключения? В одном канале слово уже кончилось, а в другом - на середине интервала. "Растянуть" или "подвинуть" нельзя, интерфейсы-то синхронные.
ASRC вам корячится, а это довольно непростая штука.
hsoft
Цитата(Flip-fl0p @ Mar 6 2017, 13:20) *
У меня вопрос возник по физическому подключению к шине I2C.
Как правильно выводы SLAVE устройства , реализованного в FPGA, подключать на эту шину ? Естественно порты будут назначены в файле верхнего уровня как INOUT. Требуется ли рекомендуемая подтяжка выводов к питанию через резистор 10 кОм ?

Шина I2C несмотря на простоту является на практике основным источником геморроя в России. Просто первое место sm.gif
Подтяжка 10К обязательна на обоих линиях, а лучше 2К. В общем касательно I2C если не хотите потратить месяцы на глючную работу этой шины
сделайте все строго по рекомендациям, как немцы, очень пунктуально. А как получите стабильную работу упрощайте сколько угодно.
Что касается DVI, нельзя с FPGA напрямую тащить линии на разъем DVI где он потом пойдет через кабель на монитор.
Правильное решение это поставать буфер I2C и снаружи у разъема обязательно защиту от статики.
Или как минимум сделайте как на макетной плате, резисторы по 100 ом последовательно и диоды Шоттки на землю и питание прямо у разъема.
Flip-fl0p
Цитата(hsoft @ Mar 7 2017, 07:15) *
Шина I2C несмотря на простоту является на практике основным источником геморроя в России. Просто первое место sm.gif
Подтяжка 10К обязательна на обоих линиях, а лучше 2К. В общем касательно I2C если не хотите потратить месяцы на глючную работу этой шины
сделайте все строго по рекомендациям, как немцы, очень пунктуально. А как получите стабильную работу упрощайте сколько угодно.
Что касается DVI, нельзя с FPGA напрямую тащить линии на разъем DVI где он потом пойдет через кабель на монитор.
Правильное решение это поставать буфер I2C и снаружи у разъема обязательно защиту от статики.
Или как минимум сделайте как на макетной плате, резисторы по 100 ом последовательно и диоды Шоттки на землю и питание прямо у разъема.

У меня несколько другая задача rolleyes.gif Принимаю DVI поток от источника DVI сигнала (например ПК), далее этот поток пересинхронизирую, расшифровываю T.M.D.S декодером. Ну а раскодированные данные я через кадровый буфер вывожу на матрицу через параллельный интерфейс. По сути я делаю свой монитор.
Матрица есть и она встроена в макетную плату DE1-SoC-MTL2 . Источник сигнала есть - обычный персональный компьютер.
Поэтому основная задача, которую надо решить в первую очередь - сообщить источнику DVI сигнала данные о матрице в соответствии со стандартом VESA. Для этого надо реализовать DDC канал.
На сколько я помню у ALTERA есть PULL_UP, PULL_DOWN. Можно же их использовать ?
Evgeny72
Цитата(zxcv @ Mar 6 2017, 23:12) *
1. Для этого есть специальные микросхемы: SRC (Sample Rste Converters)


Спасибо, про микросхемы знаю, с AD1896 работал. Данный вариант не подойдет, как писал выше, входная частота может быть (LRCK) 384 КГц, они работают до 192. (Есть Asahi Kasei для этих же целей. Идея понятна: апсэмплить с разрядностью все до максимально возможного значения завести на ПЛИС, а там коммутировать входа.) И не только по этому не пройдёт вариант - что есть на конкретном входе, то и должно быть на выходе, 1 в 1.
За апликухи спасибо! rolleyes.gif
hsoft
Цитата(Flip-fl0p @ Mar 7 2017, 06:14) *
а сколько я помню у ALTERA есть PULL_UP, PULL_DOWN. Можно же их использовать ?

Достаточно посмотреть документацию на SoC, там резисторы названы как "weak pull-up" и значение приводится 25К.
https://www.altera.com/en_US/pdfs/literatur...-v/cv_51002.pdf стр.16.
Использовать такие для шины I2C рискованно.
Evgeny72
Цитата(Bad0512 @ Mar 7 2017, 06:45) *
Что будет в момент переключения? В одном канале слово уже кончилось, а в другом - на середине интервала. "Растянуть" или "подвинуть" нельзя, интерфейсы-то синхронные.
ASRC вам корячится, а это довольно непростая штука.

В момент переключения будет потеря данных, безусловно. Это не существенно, т.к. данные на всех входах могут быть разные. Можно сделать data mute на 0,5 -1 сек. по алгоритму: мутируем - переключаем - подаем данные. Снятие mute можно привязать к выходному сигналу lrck.
Bad0512
Цитата(Evgeny72 @ Mar 7 2017, 12:40) *
В момент переключения будет потеря данных, безусловно. Это не существенно, т.к. данные на всех входах могут быть разные. Можно сделать data mute на 0,5 -1 сек. по алгоритму: мутируем - переключаем - подаем данные. Снятие mute можно привязать к выходному сигналу lrck.

Дело не в потере данных. Сама синхра (LRCK,BCK) будет у вас неизбежно дёргаться в момент переключения. Как воспримет эти подергушки принимающее устройство?
Evgeny72
Цитата(Bad0512 @ Mar 7 2017, 09:44) *
Дело не в потере данных. Сама синхра (LRCK,BCK) будет у вас неизбежно дёргаться в момент переключения. Как воспримет эти подергушки принимающее устройство?


Мало того, что синра будет дергаться в момент переключения, её может вообще нигде не быть какое-то время. Вот почему и назрел этот вопрос. Может предложит кто-то что-то получше, чем придумал.
"Как воспримет эти подергушки принимающее устройство?" Конечно, не очень хорошо воспримет, теоретически.
Практически - пробный образец делал с применением на выходе микросхемы ЦАП. Коммутировались асинхронные входа I2S без ФИФО. На звуке шелчков при переключении не было.
Flip-fl0p
Цитата(hsoft @ Mar 7 2017, 08:39) *
Достаточно посмотреть документацию на SoC, там резисторы названы как "weak pull-up" и значение приводится 25К.
https://www.altera.com/en_US/pdfs/literatur...-v/cv_51002.pdf стр.16.
Использовать такие для шины I2C рискованно.

Согласен. Но с другой стороны, у нас так-же подтяжка к питанию должна быть выполнена на стороне MASTER (передатчик DVI). И если я включу weak pull-up, он особо на схему влиять и не должен, Другая проблема если на стороне мастера линия не подтянута... Да вроде как и величину подтягивающего резистора по большей части определяет суммарная ёмкость линии. Ёмкость пина - 6 пФ. Думаю вся линия будет не больше 15...20 Пф.
Flip-fl0p
Продолжаю в свободное от работы время изучать шину I2C. Особых проблем при написании логики работы SLAVE устройства я не встретил. За одним маленьким исключением.
Линии SDA и SCL подтянуты к питанию, т.е линия постоянно в лог. 1.
Все SLAVE устройства "висящие" на этих линиях находятся Z состоянии и подключены по типу "монтажное И".
Читаю кучу мануалов, но просветления не наступило. Как правильно описать пин в Quartuse для реализации подключения по схеме "монтажное И", да ещё и с Z состоянием.
Вопросов как описать Z состояние у меня нет. Пугает то, что ПЛИС для выдачи в линию лог. нуля, должна "придавить" эту линию к земле. Что по сути будет короткое замыкание...
RobFPGA
Приветствую!
Цитата(Flip-fl0p @ Mar 16 2017, 12:05) *
...
Вопросов как описать Z состояние у меня нет. Пугает то, что ПЛИС для выдачи в линию лог. нуля, должна "придавить" эту линию к земле. Что по сути будет короткое замыкание...

С какой это стати КЗ?
Код
assign SDA = (sda_oe_n==1'b0) ?  1'b0 : 1'bz;

Тоесть пин либо в Z (висит в воздухе) либо в 0. К VCC никогда не подключается, вот поэтому и нужны внешние резисторы на VCC.

Успехов! Rob.
Golikov A.
Я бы даже сказал что внешние резисторы как раз и делают чтобы не было КЗ. Линию не подключают к питанию напрямую, а подключают через резистор на нем и будет все падать, когда слейв затянет линию в 0, и никакого КЗ.
Flip-fl0p
Цитата(RobFPGA @ Mar 16 2017, 12:45) *
Приветствую!

С какой это стати КЗ?
Код
assign SDA = (sda_oe_n==1'b0) ?  1'b0 : 1'bz;

Тоесть пин либо в Z (висит в воздухе) либо в 0. К VCC никогда не подключается, вот поэтому и нужны внешние резисторы на VCC.

Успехов! Rob.

Ну кончено ! Как я мог забыть ! biggrin.gif У нас же ток пойдет от источника, через подтягивающие резисторы, через токоограничивающий резистор на макетной плате, в пин, а затем в землю. И таким образом линия линия станет нулём. Хм... Вроде логично.
Возник вопрос тогда, как правильнее моделировать на VHDL линию подтянутую к питанию ?
Написал модуль тестбенча, которые генерирует сигналы SDI и SCL (по сути написал Master'a выдающий нужные мне значения). Соответственно если мастер присваивает линиям SDI и SCL лог. 1, а Slave присваивает им лог.0 я получаю закономерные X при моделировании, поскольку так устроена разрешающая функция в VHDL для типа STD_LOGIC.
Присваивать этим линиям значение слабой единицы, т.е "Н" - то-же не самая лучшая идея. Поскольку Slave устройство в итоге вместо нормальных данных (единицы и нули) принимает значения H.
И в итоге регистр вместо байта B"1111_1111" содержит B"HHHH_HHHH".
Думаю, что правильнее либо писать собственную функцию разрешения. Либо функцию, которая из "H" значения делает лог единицу. Как бы вы смоделировали это ?
Golikov A.
а чего бы не поставить туда логическое И, которым данная схема и является изначально?

Flip-fl0p
Цитата(Golikov A. @ Mar 16 2017, 15:48) *
а чего бы не поставить туда логическое И, которым данная схема и является изначально?

К сожалению не совсем понял Вас...
RobFPGA
Приветствую!

Цитата(Flip-fl0p @ Mar 16 2017, 13:17) *
Думаю, что правильнее либо писать собственную функцию разрешения. Либо функцию, которая из "H" значения делает лог единицу. Как бы вы смоделировали это ?


Код
Library UNISIM;
use UNISIM.vcomponents.all;
-- PULLUP: I/O Pullup
-- Xilinx HDL Libraries Guide, version 2014.1
PULLUP_inst : PULLUP
port map (
  O => O -- 1-bit output: Pullup output (connect directly to top-level port)
);


Удачи! Rob.
Golikov A.
Цитата(Flip-fl0p @ Mar 16 2017, 16:01) *
К сожалению не совсем понял Вас...


я бы писал драйвер I2C который выдает на выход 1 и 0, а не 0 и Z. Потом уже в топовом модуле я бы 1 и 0 развел бы на внешнюю ногу правильно.
А симулил работу именно драйвера, объединяя их выходы по И, если надо несколько
alexadmin
Хочу задать наводящий вопрос: коллеги, вы в курсе что I2C и I2S - разные интерфейсы?
Flip-fl0p
Цитата(alexadmin @ Mar 17 2017, 16:35) *
Хочу задать наводящий вопрос: коллеги, вы в курсе что I2C и I2S - разные интерфейсы?

Теперь в курсе smile3046.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.