|
последовательный интерфейс, между ПЛИС и МК |
|
|
|
 |
Ответов
|
Sep 11 2012, 11:47
|

Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 23-02-12
Пользователь №: 70 424

|
Цитата(skilful @ Sep 11 2012, 12:13)  вот чтобы всяких пересинхронизаций не было -- и думал взять двухклоковое фифо. ПЛИС работает с ним на своей частоте, МК -- на своей.
Еще я не понимаю про "ресинхронизаторы (2 тригера)". Как с этим работать? До этого думал что все "разноклоковые процессы" синхронизируются в двухклоковых фифо или же через PLL 1) двухклоковых фифо, PLL и ресинхронизаторы - это способы как связать асинхронные клок домены. 2) ресинхронизаторы убирают метастабильность. Гдето тут была ветка про метастабильность и способы её подавления - стоит почитать. В т.ч. и при помощи ФИФО. http://electronix.ru/forum/index.php?showtopic=936503) Что вы будуте делать с ФИФО когда адрес чтения совпадёт с адресом записи? Цитата(skilful @ Sep 11 2012, 12:13)  То что все прерывания асинхронны я понимаю. Я не понимаю следующего (может быть повторюсь) -- из "фифо чтения" читает МК на малой частоте, а пишет ПЛИС на бОльшей частоте. Когда ПЛИС запишет на бОльшей частоте сигнал "фифо не пустое" выставится, но он будет привязан к клоку ПЛИС. Это не проблема. МК привяжет асинхронное прерывание к своему клоку. Цитата(skilful @ Sep 11 2012, 12:13)  Из описания мегафункции Альтеры: rdempty -- If asserted, indicates that the dcfifo is empty and disables the rdreq port. Synchronized with rdclk wrempty -- Indicates that the dcfifo is empty. Delayed version of rdempty that is synchronized with wrclk. Generated from the rdempty signal with a single synchronization register added to synchronize it to the wrclk clock domain. Насколько я понял Вы предлагаете завести сигнал wrempty на прерывание МК? http://electronix.ru/redirect.php?http://w...8Boston_CDC.pdf Читать п.5.8.2 - Ваш случай. Цитата(skilful @ Sep 11 2012, 13:05)  Подал один и тот же клок на клоки чтения и записи. Сигнал wrempty изменяется при первой же записи. Сигнал rdempty изменяется аж после 7 такта. Значит пауза после получения прерывания все-таки нужна, если использовать двухклоковое фифо? похоже тут не тупая задержка нужна, а надо 7 раз клок чтения передёрнуть, чтобы rdempty получить.... ----- Не тратьте время - выкинте все ФИФО, привяжите SPI к клоку ПЛИС и спокойно работайте. ================================================================================ Цитата(troiden @ Sep 11 2012, 12:40)  Чуть подумав, 40 тактов превратилось в 16 - в случае, если за командой записи следует команда чтения. Т.е. в вашем случае - конвеер. Чтобы прочитать данные надо выдать команду чтения, а потом какую-то другую, чтобы забрать данные. Ну для вычетки массива - вариант, а для роботы с одиночными командами - только затраты на 2-е повторение.... Не всегда гут. Может лутше SPI.CLK в 2 раза понизить? Цитата(troiden @ Sep 11 2012, 12:40)  Зависит от кристалла. Шестой спартан 100 МГц примет без вопросов. 100МГц на SPI.CLK означает что у вас есть полтакта (5нс) на все задержки распространения сигнала от [МК -to -FPGA.PAD- to - внутренний флоп FPGA ].... Какая величина задержки на плате (при дорожке 10см напр)? Какое минимальное её значение, а какое максимальное (это критично для сетап-холд таймингов)? Какой реальный розбросс задержек на плате (skew)? Какое сетап\холд требование для MISO на МК? Цитата(troiden @ Sep 11 2012, 12:40)  Отнюдь. См выше - у нас минимум 16 тактов стабильных данных. На внутреннюю частоту пересинхривается только признак приема команды, из него формируется импульс в один такт внутренней частоты, от которого и срабатывает дальнейшая логика. А что если внутренняя частота меньше SPI.CLK? Хватит на ресинхронизацию и на обработку команды? ---------- Ну это на засыпку...  А ваше решение с конвеером в принципе хорошее. Но лутше всётаки отработать за одну команду команду.
|
|
|
|
|
Sep 11 2012, 12:41
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 19-02-09
Из: Москва
Пользователь №: 45 069

|
Цитата(Torpeda @ Sep 11 2012, 15:47)  Т.е. в вашем случае - конвеер. Чтобы прочитать данные надо выдать команду чтения, а потом какую-то другую, чтобы забрать данные. Не совсем. И для чтения, и для записи применяется одна команда. Именно чтобы не надо было повторять запрос введены промежуточные 8 бит - за это время успевает прощелкать и пересинхронизатор, и внутренний мультиплексор в ПЛИСовой части, который выставляет на шину данных SPI-контроллера значение нужного регистра. Для аналогии - фактически как чтение данных из любой конфигурационной флешки с SPI-интерфейсом, только там промежуточных бит нету  Цитата(Torpeda @ Sep 11 2012, 15:47)  100МГц на SPI.CLK означает что у вас есть полтакта (5нс) на все задержки распространения сигнала от [МК -to -FPGA.PAD- to - внутренний флоп FPGA ].... Какая величина задержки на плате (при дорожке 10см напр)? Какое минимальное её значение, а какое максимальное (это критично для сетап-холд таймингов)? Какой реальный розбросс задержек на плате (skew)? Какое сетап\холд требование для MISO на МК? В случае записи данных в ПЛИС значение имеет только skew, оно вряд ли будет такое уж большое при адекватной разводке. В случае чтения - да, есть подводные камни. Однако и это решаемо с некоторыми изменениями дизайна. Никто же не мешает выдавать прочитанные данные на полтакта-такт SPI.CLK раньше, если мы точно знаем, что неустранимые задержки типа длинны трассы имеют вполне определенные большие значения. Тут есть поле для маневра, была бы потребность. Цитата(Torpeda @ Sep 11 2012, 15:47)  А что если внутренняя частота меньше SPI.CLK? Хватит на ресинхронизацию и на обработку команды? Надо считать, если что - умножать тактовую ПЛИСа до нужных значений. Однако это в любом случае лучше трех-четырехкратного превышения частоты SPI.CLK для нормальной работы пересинхронизации на входе. Цитата(skilful @ Sep 11 2012, 16:28)  вот примерная схемка, которую думал сделать
[attachment=71260:interface.jpg] Когда будете так делать, досконально продумайте алгоритм чтения данных. Чтобы быть уверенным, что читаете то что нужно а не то что пришло когда-то раньше.
|
|
|
|
|
Sep 11 2012, 13:41
|

Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 23-02-12
Пользователь №: 70 424

|
Цитата(troiden @ Sep 11 2012, 15:41)  В случае записи данных в ПЛИС значение имеет только skew, оно вряд ли будет такое уж большое при адекватной разводке. В случае чтения - да, есть подводные камни. Однако и это решаемо с некоторыми изменениями дизайна. Никто же не мешает выдавать прочитанные данные на полтакта-такт SPI.CLK раньше, если мы точно знаем, что неустранимые задержки типа длинны трассы имеют вполне определенные большие значения. Тут есть поле для маневра, была бы потребность. 1) "если мы точно знаем," - в этом-то и дело. Как-бы их узнать..... 2) Как гарантировать стабильность задержки, тем более если она как вы сказали пару тактов? Вы вообще когда нибудь прощитывали эти величины и их розбросс для разных материалов платы? 3) Выдавать раньше на пару тактов можна (введя пустые биты между адресом и данными), но кто сказал что задержка на плате как-то кратна тактовой частоте SPI.CLK? что, длинной провода MISO будете данные относительно клока подстраивать на стороне МК? Это как-то не хорошо... Розводчик шипко ругаться будет однако.... Да и тулзы для росчёта таких задержек надо где-то взять.... Цитата(skilful @ Sep 11 2012, 15:28)  вот примерная схемка, которую думал сделать 1) Как эта схемка исключает чтение из адреса ФИФО в который идёт одновременно запись? По-моему - никак. Прочтётся мусор. 2) при полном асинхронизме клоков записи и чтения, данные перепутаються (вы думаете что читаете текущее, а реально это предыдущее напр.).
|
|
|
|
|
Sep 11 2012, 14:13
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 19-02-09
Из: Москва
Пользователь №: 45 069

|
Цитата(Torpeda @ Sep 11 2012, 17:41)  1) "если мы точно знаем," - в этом-то и дело. Как-бы их узнать..... 2) Как гарантировать стабильность задержки, тем более если она как вы сказали пару тактов? Вы вообще когда нибудь прощитывали эти величины и их розбросс для разных материалов платы? А эти вопросы скорее к разработчику платы, а не к программисту стоящего на плате ПЛИСа  Неужели программы-трассировщики не поддерживают расчет задержек в линиях? Даже примерно, до наносекунд? Цитата(Torpeda @ Sep 11 2012, 17:41)  3) Выдавать раньше на пару тактов можна (введя пустые биты между адресом и данными), но кто сказал что задержка на плате как-то кратна тактовой частоте SPI.CLK? Точная кратность и не обязательна. Важно в Setup-hold попасть. Можно пойти дальше, поставить на MISO программируемую задержку в ПЛИСе  Получится своя маленькая аналогия калибровки DDR. Цитата(Torpeda @ Sep 11 2012, 17:41)  что, длинной провода MISO будете данные относительно клока подстраивать на стороне МК? Боже упаси от подобных извращений  В любом случае, всё это из разряда теории, надо всегда понимать применимость решений. Хочешь SPI на высоких частотах - будь добр ставь источник и получатель на вменяемых расстояниях. Если не получается - значит стоит задуматься над каким-нибудь другим интерфейсом, а не городить костыли к заранее неправильно спроектированному устройству.
|
|
|
|
|
Sep 11 2012, 14:49
|

Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 23-02-12
Пользователь №: 70 424

|
Цитата(troiden @ Sep 11 2012, 17:13)  А эти вопросы скорее к разработчику платы, а не к программисту стоящего на плате ПЛИСа  нуда, ненадо учитывать ограничения PCB дизайнера - пусть крутиться как хочет потом..... Цитата(troiden @ Sep 11 2012, 17:13)  В любом случае, всё это из разряда теории, надо всегда понимать применимость решений. Одно скажу точно, если вы пытаетесь построить корректно работающий SPI на высоких частотах, и у вас нет STA тайминг констрейна (SDC) со значением мин\макс внешних задержек - работать будет не всегда.... Это станет понятно, когда россчитать эти самые задержки и их возможный технологический розбросс, к чему я вас и пытаюсь подвести. Даже при 10нс SPI.CLK это уже не так просто. Цитата(skilful @ Sep 11 2012, 17:42)  Так я смотрю триггера 3 ?
// sync SCK to the FPGA clock using a 3-bits shift register
SCKr <= {SCKr[1:0], SCK};
Здесь происходит защелкивание SCK ?
wire SCK_risingedge = (SCKr[2:1]==2'b01); // now we can detect SCK rising edges а тут на втором такте анализируется состояние сдвигового регистра. Если разряды 2,1 равны "01", то SCK_risingedge = True ? Это + детектор фронта.
|
|
|
|
|
Sep 11 2012, 14:58
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 19-02-09
Из: Москва
Пользователь №: 45 069

|
Цитата(Torpeda @ Sep 11 2012, 18:49)  нуда, ненадо учитывать ограничения PCB дизайнера - пусть крутиться как хочет потом..... Процесс построен не так  После трассировки программист получает от PCB-дизайнера бумажку с получившимися задержками и пляшет уже от нее. Ну не дело это для программиста - рассчитывать задержки. В идеале он видит максимум электрическую схему.
|
|
|
|
|
Sep 11 2012, 18:28
|
Знающий
   
Группа: Свой
Сообщений: 608
Регистрация: 10-07-09
Из: Дубна, Московская область
Пользователь №: 51 111

|
Цитата(troiden @ Sep 11 2012, 18:58)  После трассировки программист получает от PCB-дизайнера бумажку с получившимися задержками и пляшет уже от нее. Ну не дело это для программиста - рассчитывать задержки. Вся беда только в одном - Вы, как программист, оперируете дискретными временными отрезками (период между фронтами), а жизнь не настолько детерминирована. Поэтому присоединюсь к совету сделать синхронный проект, в котором будут отслеживаться уровни данных, а также фронт тактового сигнала интефейса, и лишь затем производить остальные операции сдвига и тп.
|
|
|
|
Сообщений в этой теме
skilful последовательный интерфейс Sep 11 2012, 06:44 Lmx2315 Вы по SPI хотите связать мк и плис, значит у вас о... Sep 11 2012, 06:55 skilful для примера, допустим, внутри ПЛИС 10 регистров по... Sep 11 2012, 07:22 Lmx2315 ..разделите регистры , пусть плис пишет в свои а м... Sep 11 2012, 07:26 stu правильно по поводу: "надо опрашивать состоян... Sep 11 2012, 07:26 skilful а как мне "разделенные" регистры связать... Sep 11 2012, 07:41 Lmx2315 пусть ПЛИС пишет в счётные регистры, а МК их считы... Sep 11 2012, 07:54 Torpeda Цитата(skilful @ Sep 11 2012, 10:41) а ка... Sep 11 2012, 08:09  troiden Цитата(Torpeda @ Sep 11 2012, 12:09) - Вс... Sep 11 2012, 08:19   Torpeda Цитата(troiden @ Sep 11 2012, 11:19) Эмм.... Sep 11 2012, 08:25    troiden Цитата(Torpeda @ Sep 11 2012, 12:25) синх... Sep 11 2012, 08:31     Torpeda Цитата(troiden @ Sep 11 2012, 11:31) SPI ... Sep 11 2012, 08:49      troiden Попорядку
Цитата(Torpeda @ Sep 11 2012, 12... Sep 11 2012, 09:01       Torpeda Цитата(troiden @ Sep 11 2012, 12:01) У на... Sep 11 2012, 09:12        troiden Цитата(Torpeda @ Sep 11 2012, 13:12) Вот ... Sep 11 2012, 09:40  skilful Цитата(Torpeda @ Sep 11 2012, 11:09) В де... Sep 11 2012, 08:43  skilful Цитата(Torpeda @ Sep 11 2012, 14:47) 1) д... Sep 11 2012, 12:28        troiden Цитата(Александр77 @ Sep 11 2012, 22:28) ... Sep 11 2012, 19:28 skilful Просимулировал в МоделСиме двухклоковую фифо (LPM_... Sep 11 2012, 10:05 skilful исключаться должно программно. МК набил фифо запис... Sep 11 2012, 13:52 Torpeda Цитата(skilful @ Sep 11 2012, 16:52) искл... Sep 11 2012, 14:33 Alexey K Вопрос.
Зачем один и тот же регистр делать доступ... Sep 11 2012, 14:00 skilful там я выше приводил пример -- если он в роли тайме... Sep 11 2012, 14:14 troiden Цитата(skilful @ Sep 11 2012, 18:14) там ... Sep 11 2012, 14:17 skilful Так я смотрю триггера 3 ?
// sync SCK to the FPGA... Sep 11 2012, 14:42
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|