Перейти к содержанию
    

Модуль SPI на Verilog

Добрый день! Я в рамках учебы занялся разработкой модуля SPI на Verilog-2001 и столкнулся с проблемой, что не понимаю как правильно организовать прием/передачу данных в режиме ведомого/ведущего. По идеи вся логика, ответственная за процесс обмена данными, будет находится в другом тактовом домене (SCK) и по правилам надо все что входит в модуль приема/передачи синхронизировать с SCK, но мы не знаем в каком виде к нам будет приходить SCK (он будет непрерывный или с перерывами в передаче, через сколько тактов после перехода SS в состояние низкого активного уровня он придет). Сейчас в моей реализации все управляющие сигналы от регистров и данные из FIFO, которые находятся в домене системной частоты, попадают в модуль приема/передачи без каких либо манипуляций и сдвиговый регистр передает/принимает данные на тактовой частоте SCK, а синхронизирую я только сигналы готовности данных (нужно взять из буфера передатчика или записать их в буфер приемника). Есть какое то лаконичное решение для задачи пересечением этих тактовых доменов? Или в целом, если есть уверенность что мы не будем менять состояния регистров в процессе передачи и уж тем более данные у нас лежат достаточно долго, то можно и обойтись синхронизацией по системной частоте управляющих сигналов буферов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Все нужно синхронизировать от внутренней системной частоты.

2. Для удобства, чтобы не фантазировать, можете взять описание на какую-нить микруху с SPI, где описан SPI, и еще и с диаграммами, и пишите, как будь-то вам нужно будет с этим девайсом рабоать по SPI.

3. CDC вообще тут не будет - лучше рассматривать и SCK как входной сигнал, типа данных, потенциальный.

4. Для примера можно изучить имеющиеся реализации, хоть на том же OpenCores. А там уже для себя решите как сделать именно вам будет интереснее.

5. По поиску на данном форуме тоже можно много интересного найти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понятие "правильно" относитльно,  зависит от конкретных условий вашей системы,  напримеро от соотношения 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 как входной сигнал, типа данных, потенциальный.

Как бы третье противоречит первому ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 часов назад, RobFPGA сказал:

для соотношений Fsys/Fspi  < ~3

Как в таком случае с передачей? Ведь между SS и выборкой — полпериода SCK.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо за ответы! Да я смотрел реализации на OpenCores в основном в проектах прием/передача ведется на частоте SCK, а управляется процесс конечным автоматом, работающим на системной частоте, и передаем мы только признаки готовности данных и сами данные.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Plain said:

Как в таком случае с передачей? Ведь между SS и выборкой — полпериода SCK.

Да нормально все  - передача идет на клоке SPI

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

42 минуты назад, RobFPGA сказал:

нормально все  - передача идет

Вопрос, передача чего — за полпериода SCK, данные надо успеть переписать из буфера в одном домене в сдвиговый регистр другого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 minutes ago, Plain said:

Вопрос, передача чего — за полпериода SCK, данные надо успеть переписать из буфера в одном домене в сдвиговый регистр другого.

Данные могут быть переписанны  до/в момент установки SS=0. 
Можно вообще не переносить данные в выходной регистр для сдвига,  а напрямую  муксить на выход SPI из регистра в системном клоке.   

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/21/2024 at 4:52 PM, Kirill.L said:

Добрый день! 

Рекомендую, если вы делаете свой вариант SPI порта, заложить возможность информирования мастера о готовности дополнительных данных от подчиненного в его аппаратном ответе.

Тогда у вас будет полноценный обмен!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...