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

Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 11-11-09
Пользователь №: 53 561

|
правильно по поводу: "надо опрашивать состояние". Но есть interrupt. Его в МК можно использовать по уровню, а не по фронту или спаду. Т. е. fifo не пустой, прерывание в нуле(к примеру) и значит надо с него тянуть данные, все прочли - установили. Я делал rs-485 между MC<->FPGA<->ПК и два fifo (rx, tx). А список адресов для выполнения задач плиской через дешифратор (.eq[]) как enable для того или иного действия, а выдачу на МК по case
Сообщение отредактировал stu - Sep 11 2012, 07:31
--------------------
Мы ведь работаем, чтобы жить, а не живем, чтобы работать??? ;)
|
|
|
|
|
Sep 11 2012, 08:09
|

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

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

|
Цитата(Torpeda @ Sep 11 2012, 12:09)  - Все входные SPI сигналы в ПЛИС привязать к внутреннему клоку через ресинхронизаторы (2 тригера) Эмм... Зачем синхронный интерфейс превращать в асинхронный?
|
|
|
|
|
Sep 11 2012, 08:25
|

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

|
Цитата(troiden @ Sep 11 2012, 11:19)  Эмм... Зачем синхронный интерфейс превращать в асинхронный? синхронность понятие относительное.... У ПЛИС свой клок а у МК свой - всё асинхронно.
|
|
|
|
|
Sep 11 2012, 08:31
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 19-02-09
Из: Москва
Пользователь №: 45 069

|
Цитата(Torpeda @ Sep 11 2012, 12:25)  синхронность понятие относительное.... У ПЛИС свой клок а у МК свой - всё асинхронно. SPI подразумевает передачу наряду с данными тактового сигнала - на нем и должен работать сам приемопередатчик SPI. А все манипуляции с пересинхронизацией должны выполняться уже после, на уровне внутренних шин ПЛИСа.
|
|
|
|
|
Sep 11 2012, 08:43
|
Частый гость
 
Группа: Свой
Сообщений: 186
Регистрация: 23-04-06
Из: Сочи
Пользователь №: 16 411

|
Цитата(Torpeda @ Sep 11 2012, 11:09)  В деталях проблема не ясна но отвечу на что понял... 1) Вы работаете с SPI интерфейсом. Это значит что один конец мастер, а другой слейв. Сделайте МК мастером. Это значит что только он инициирует передачу данных.
2) Как сделать доступ в один и тот-же регистр и со стороны МК и со стороны ПЛИС по записи. -Придумайте протокол обмена по SPI: код команды, адрес, данные. -Когда МК даёт команду записи в регист, она принимается SPI декодером команд (в виде автомата) -Декодер команды останавливает ПЛИС и меняет регистр -Декодер команды перезапускает ПЛИС с новым значением
3) как сказать МК, что ПЛИС сменила значение регистра - по прерыванию - по SPI. В этом случае надо "завести" регистр состояния ПЛИС и читать его переодически командой SPI. Например, ПЛИС взводит бит состояния в 1 при последней записи в регистр, а при чтении регистра состояния этот бит автоматически обнуляется.
4) что от чего тактировать.... - проще всего SPI склок выдавать из МК (задайте нужную конфигурацию МК SPI) - ПЛИС должна иметь свой генератор клока выше частоты SPI клока - Все входные SPI сигналы в ПЛИС привязать к внутреннему клоку через ресинхронизаторы (2 тригера) - анализируя уровни SPI входов при помощи соответствующего автомата - декодировать SPI поток данных.
Вот как-то так...
--------------------- Есчё добавлю... SPI понятие розтяжимое.... Фактически надо говорить о СТЕКЕ протоколов. В этом случае SPI - это только описание доступа к каналу передачи (клок, данные) - канальный уровень Дальше идёт формат команды SPI (код команды, адрес, данные) Дальше интерпретатор команд (напр. чтение из регистра 1 выполняется со сбросом бита состояния, а регистра 2 без таких-же действий) - прикладной уровень я примерно тоже самое сделал -- только с фифошками. вопрос встал -- как сообщить микроконтроллеру, что запрошенные данные считаны и их можно забирать из фифо чтения. вы написали, что делать прерывание. но получается сигнал прерывания (фифо чтения не пустое) будет привязан к клоку ПЛИС, а не МК. То есть мне нужно после получения прерывания выдержать паузу на МК и потом генерить клок от МК к ПЛИС, чтобы забирать данные из фифо чтения?
|
|
|
|
|
Sep 11 2012, 08:49
|

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

|
Цитата(troiden @ Sep 11 2012, 11:31)  SPI подразумевает передачу наряду с данными тактового сигнала - на нем и должен работать сам приемопередатчик SPI. А все манипуляции с пересинхронизацией должны выполняться уже после, на уровне внутренних шин ПЛИСа. ОК. Вижу Вы любитель проблем  На канальном уровне всё просто - клок и данные. Захлопнул их в тригер и нет проблем... Предположим также что вы извернулись, и вам хватило тактов SPI фрейма на то, чтобы принять команду и декодировать её. И даже вы смогли правильно обконстрейнить всё для STA (и даже неизвестную задержку линии от МК к ПЛИС смогли правильно учесть...) Это не всем удаётся, ибо количество клоков ограничено числом бит в фрейме. Некоторые начинают тригера с negedge клоком использовать и прочую асинхронщину (типа заводить логику на ресеты...), а про тайминг констрейны в этом случае я вообще молчу..... Вот вам и асинхронщина началась. А дальше наверно надо и команду интерпретировать.... ПЛИС то от своего генератора работает и асинхронна к вашему SPI, который повешен на внешний клок. Надо как-то клок домены суметь вязывать.... --------- Поэтому-то я и рекомендую начинающим дурью не маяться - привязать все SPI сигналы к ПЛИС клоку и делать тревиальный синхронный цифровой дизайн. Цитата(skilful @ Sep 11 2012, 11:43)  я примерно тоже самое сделал -- только с фифошками. вопрос встал -- как сообщить микроконтроллеру, что запрошенные данные считаны и их можно забирать из фифо чтения. вы написали, что делать прерывание. но получается сигнал прерывания (фифо чтения не пустое) будет привязан к клоку ПЛИС, а не МК. То есть мне нужно после получения прерывания выдержать паузу на МК и потом генерить клок от МК к ПЛИС, чтобы забирать данные из фифо чтения? Зачем фифошки? Ну если очень хочется.... " сигнал прерывания (фифо чтения не пустое) будет привязан к клоку ПЛИС" - очень хорошо. МК предполагает что все прерывания вообще асинхронны (кнопку-то к прерыванию подключать вас не смущает?). "То есть мне нужно после получения прерывания выдержать паузу на МК и потом генерить клок от МК к ПЛИС, чтобы забирать данные из фифо чтения" - сразу забирайте. Зачем вам пауза? ПЛИС сначала фиксирует данные в ФИФО, а потом генерит прерывание.
|
|
|
|
|
Sep 11 2012, 09:01
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 19-02-09
Из: Москва
Пользователь №: 45 069

|
Попорядку  Цитата(Torpeda @ Sep 11 2012, 12:44)  Предположим также что вы извернулись, и вам хватило тактов SPI фрейма на то, чтобы принять команду и декодировать её. Простота - наше всё. Во фрейме только один признак команды - чтение или запись. Большего не надо. Цитата(Torpeda @ Sep 11 2012, 12:44)  И даже вы смогли правильно обконстрейнить всё для STA (и даже неизвестную задержку линии от МК к ПЛИС смогли правильно учесть...) Задержки всех линий в первом приближении одинаковы, если это не так и разбежка в десяток наносекунд - надо карать трассировщика. Для связи МК -> ПЛИС никаких проблем, для обратной линии ПЛИС -> МК проблема и в асинхронном, и в синхронном дизайне одна и та же и никуда не пропадает. Цитата(Torpeda @ Sep 11 2012, 12:44)  А дальше наверно надо и команду интерпретировать.... Фрейм из 5 байт: 1 бит - признак команды, 15 бит - адрес регистра ПЛИСа, 3 байта - на данные чтения-записи. Интерпретируется без проблем. Цитата(Torpeda @ Sep 11 2012, 12:44)  ПЛИС то от своего генератора работает и асинхронна к вашему SPI, который повешен на внешний клок. Надо как-то клок домены суметь вязывать.... У нас есть 40 тактов SPI-интерфейса между приходом двух посылок, за которые надо успеть пересинхронизироваться и провести запись данных в регистр. С чтением - веселее, но тоже просто решается. Цитата(Torpeda @ Sep 11 2012, 12:44)  Поэтому-то я и рекомендую начинающим дурью не маяться - привязать все SPI сигналы к ПЛИС клоку и делать тревиальный синхронный цифровой дизайн. Этот подход жизнеспособен только на малых скоростях. Придет к вам SPI на 100 МГц - и хана.
|
|
|
|
|
Sep 11 2012, 09:12
|

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

|
Цитата(troiden @ Sep 11 2012, 12:01)  У нас есть 40 тактов SPI-интерфейса между приходом двух посылок, за которые надо успеть пересинхронизироваться и провести запись данных в регистр. С чтением - веселее, но тоже просто решается. Вот это как-то не очень понятно. О каких 40 тактах речь? даём команду записи. Последний бит приходит на 40-м клоке. Где есчё 40 беруться для интерпретации? Или вы предлагаете передавать фрейм из 40 бит + есчё дофига тактов клока на его интерпретацию? Цитата(troiden @ Sep 11 2012, 12:01)  Этот подход жизнеспособен только на малых скоростях. Придет к вам SPI на 100 МГц - и хана. Вы правы. 1) Строить SPI при тактировании от внешнего клока надо только тогда, когда тактовый клок со стороны ПЛИС почти равен скорости SPI клока или меньше. 2) Правда на 100 МГц хана наступает и в вашем случае - при задани коректных STA констрейнов (как учесть например, что задержка на плате меняется от мин значения к макс, какие эти значения получаються, итд...) Да и связать асинхронные клок домены (SPI - остальная часть ПЛИС) тоже непросто.....
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|