Kirill.L 0 June 21, 2024 Posted June 21, 2024 · Report post Добрый день! Я в рамках учебы занялся разработкой модуля SPI на Verilog-2001 и столкнулся с проблемой, что не понимаю как правильно организовать прием/передачу данных в режиме ведомого/ведущего. По идеи вся логика, ответственная за процесс обмена данными, будет находится в другом тактовом домене (SCK) и по правилам надо все что входит в модуль приема/передачи синхронизировать с SCK, но мы не знаем в каком виде к нам будет приходить SCK (он будет непрерывный или с перерывами в передаче, через сколько тактов после перехода SS в состояние низкого активного уровня он придет). Сейчас в моей реализации все управляющие сигналы от регистров и данные из FIFO, которые находятся в домене системной частоты, попадают в модуль приема/передачи без каких либо манипуляций и сдвиговый регистр передает/принимает данные на тактовой частоте SCK, а синхронизирую я только сигналы готовности данных (нужно взять из буфера передатчика или записать их в буфер приемника). Есть какое то лаконичное решение для задачи пересечением этих тактовых доменов? Или в целом, если есть уверенность что мы не будем менять состояния регистров в процессе передачи и уж тем более данные у нас лежат достаточно долго, то можно и обойтись синхронизацией по системной частоте управляющих сигналов буферов? Quote Share this post Link to post Share on other sites More sharing options...
slkhome 1 June 21, 2024 Posted June 21, 2024 · Report post 1. Все нужно синхронизировать от внутренней системной частоты. 2. Для удобства, чтобы не фантазировать, можете взять описание на какую-нить микруху с SPI, где описан SPI, и еще и с диаграммами, и пишите, как будь-то вам нужно будет с этим девайсом рабоать по SPI. 3. CDC вообще тут не будет - лучше рассматривать и SCK как входной сигнал, типа данных, потенциальный. 4. Для примера можно изучить имеющиеся реализации, хоть на том же OpenCores. А там уже для себя решите как сделать именно вам будет интереснее. 5. По поиску на данном форуме тоже можно много интересного найти. Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 99 June 21, 2024 Posted June 21, 2024 · Report post Понятие "правильно" относитльно, зависит от конкретных условий вашей системы, напримеро от соотношения 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 как входной сигнал, типа данных, потенциальный. Как бы третье противоречит первому ... Quote Share this post Link to post Share on other sites More sharing options...
Plain 394 June 22, 2024 Posted June 22, 2024 · Report post 14 часов назад, RobFPGA сказал: для соотношений Fsys/Fspi < ~3 Как в таком случае с передачей? Ведь между SS и выборкой — полпериода SCK. Quote Share this post Link to post Share on other sites More sharing options...
Kirill.L 0 June 22, 2024 Posted June 22, 2024 · Report post Всем спасибо за ответы! Да я смотрел реализации на OpenCores в основном в проектах прием/передача ведется на частоте SCK, а управляется процесс конечным автоматом, работающим на системной частоте, и передаем мы только признаки готовности данных и сами данные. Я думал над возможностью синхронизовать все входные сигналы SPI по системной частоте, но тогда нужно решать проблему как обратно вовремя передать данные другой стороне, ведь мы уже сдвинули их минимум на два такта системной частоты. Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 99 June 22, 2024 Posted June 22, 2024 · Report post 1 hour ago, Plain said: Как в таком случае с передачей? Ведь между SS и выборкой — полпериода SCK. Да нормально все - передача идет на клоке SPI Quote Share this post Link to post Share on other sites More sharing options...
Plain 394 June 22, 2024 Posted June 22, 2024 · Report post 42 минуты назад, RobFPGA сказал: нормально все - передача идет Вопрос, передача чего — за полпериода SCK, данные надо успеть переписать из буфера в одном домене в сдвиговый регистр другого. Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 99 June 22, 2024 Posted June 22, 2024 · Report post 30 minutes ago, Plain said: Вопрос, передача чего — за полпериода SCK, данные надо успеть переписать из буфера в одном домене в сдвиговый регистр другого. Данные могут быть переписанны до/в момент установки SS=0. Можно вообще не переносить данные в выходной регистр для сдвига, а напрямую муксить на выход SPI из регистра в системном клоке. Quote Share this post Link to post Share on other sites More sharing options...
Мур 5 June 27, 2024 Posted June 27, 2024 · Report post On 6/21/2024 at 4:52 PM, Kirill.L said: Добрый день! Рекомендую, если вы делаете свой вариант SPI порта, заложить возможность информирования мастера о готовности дополнительных данных от подчиненного в его аппаратном ответе. Тогда у вас будет полноценный обмен! Quote Share this post Link to post Share on other sites More sharing options...