Kirill.L 0 21 июня Опубликовано 21 июня · Жалоба Добрый день! Я в рамках учебы занялся разработкой модуля SPI на Verilog-2001 и столкнулся с проблемой, что не понимаю как правильно организовать прием/передачу данных в режиме ведомого/ведущего. По идеи вся логика, ответственная за процесс обмена данными, будет находится в другом тактовом домене (SCK) и по правилам надо все что входит в модуль приема/передачи синхронизировать с SCK, но мы не знаем в каком виде к нам будет приходить SCK (он будет непрерывный или с перерывами в передаче, через сколько тактов после перехода SS в состояние низкого активного уровня он придет). Сейчас в моей реализации все управляющие сигналы от регистров и данные из FIFO, которые находятся в домене системной частоты, попадают в модуль приема/передачи без каких либо манипуляций и сдвиговый регистр передает/принимает данные на тактовой частоте SCK, а синхронизирую я только сигналы готовности данных (нужно взять из буфера передатчика или записать их в буфер приемника). Есть какое то лаконичное решение для задачи пересечением этих тактовых доменов? Или в целом, если есть уверенность что мы не будем менять состояния регистров в процессе передачи и уж тем более данные у нас лежат достаточно долго, то можно и обойтись синхронизацией по системной частоте управляющих сигналов буферов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slkhome 0 21 июня Опубликовано 21 июня · Жалоба 1. Все нужно синхронизировать от внутренней системной частоты. 2. Для удобства, чтобы не фантазировать, можете взять описание на какую-нить микруху с SPI, где описан SPI, и еще и с диаграммами, и пишите, как будь-то вам нужно будет с этим девайсом рабоать по SPI. 3. CDC вообще тут не будет - лучше рассматривать и SCK как входной сигнал, типа данных, потенциальный. 4. Для примера можно изучить имеющиеся реализации, хоть на том же OpenCores. А там уже для себя решите как сделать именно вам будет интереснее. 5. По поиску на данном форуме тоже можно много интересного найти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 28 21 июня Опубликовано 21 июня · Жалоба Понятие "правильно" относитльно, зависит от конкретных условий вашей системы, напримеро от соотношения Fsys/Fspi. В общем случае SPI можно делать по 3 схемам 1. Делаем логику приема/передачи на системном клоке, входы SPI синхронизируем (CDC) на системный клок (простой вариант, для соотношения Fsys/Fspi > ~3 ) 2. Делаем логику приема/передачи на клоке SPI, на системный клок синхронизируем (CDC) уже принятые данные (вариант сложнее, для соотношений Fsys/Fspi < ~3) 3. Микс - предача и прием на на разных клоках 3 hours ago, Kirill.L said: Есть какое то лаконичное решение для задачи пересечением этих тактовых доменов? Или в целом, если есть уверенность что мы не будем менять состояния регистров в процессе передачи и уж тем более данные у нас лежат достаточно долго, то можно и обойтись синхронизацией по системной частоте управляющих сигналов буферов? Handshake based CDC так и работает - через классический битовый CDC на 2-3 регистрах вы передаете признак того что на стороне записи данные записанны и стабильны чтобы без проблем с метастабильностью считать их на стороне чтения. 1 hour ago, slkhome said: 1. Все нужно синхронизировать от внутренней системной частоты. 1 hour ago, slkhome said: 3. CDC вообще тут не будет - лучше рассматривать и SCK как входной сигнал, типа данных, потенциальный. Как бы третье противоречит первому ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 184 22 июня Опубликовано 22 июня · Жалоба 14 часов назад, RobFPGA сказал: для соотношений Fsys/Fspi < ~3 Как в таком случае с передачей? Ведь между SS и выборкой — полпериода SCK. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kirill.L 0 22 июня Опубликовано 22 июня · Жалоба Всем спасибо за ответы! Да я смотрел реализации на OpenCores в основном в проектах прием/передача ведется на частоте SCK, а управляется процесс конечным автоматом, работающим на системной частоте, и передаем мы только признаки готовности данных и сами данные. Я думал над возможностью синхронизовать все входные сигналы SPI по системной частоте, но тогда нужно решать проблему как обратно вовремя передать данные другой стороне, ведь мы уже сдвинули их минимум на два такта системной частоты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 28 22 июня Опубликовано 22 июня · Жалоба 1 hour ago, Plain said: Как в таком случае с передачей? Ведь между SS и выборкой — полпериода SCK. Да нормально все - передача идет на клоке SPI Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 184 22 июня Опубликовано 22 июня · Жалоба 42 минуты назад, RobFPGA сказал: нормально все - передача идет Вопрос, передача чего — за полпериода SCK, данные надо успеть переписать из буфера в одном домене в сдвиговый регистр другого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 28 22 июня Опубликовано 22 июня · Жалоба 30 minutes ago, Plain said: Вопрос, передача чего — за полпериода SCK, данные надо успеть переписать из буфера в одном домене в сдвиговый регистр другого. Данные могут быть переписанны до/в момент установки SS=0. Можно вообще не переносить данные в выходной регистр для сдвига, а напрямую муксить на выход SPI из регистра в системном клоке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Мур 1 27 июня Опубликовано 27 июня · Жалоба On 6/21/2024 at 4:52 PM, Kirill.L said: Добрый день! Рекомендую, если вы делаете свой вариант SPI порта, заложить возможность информирования мастера о готовности дополнительных данных от подчиненного в его аппаратном ответе. Тогда у вас будет полноценный обмен! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться