реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как организовать взаимодействие между модулями
COMA
сообщение Mar 15 2010, 11:47
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 851
Регистрация: 28-08-04
Пользователь №: 559



Добрый день,

Пишу периферию для NIOS.
Задача периферийного блока - по SPI выдавать данные в несколько SPI ЦАПов.

Прикрепленное изображение


Алгоритм работы блока такой:
Процессорное ядро по прерыванию от таймера кладет в FIFO набор выборок
для ЦАПов, устанавливает бит начала передачи и выходит из прерывания.
Блок по этому биту начинает передавать данные в ЦАПы по SPI выбирая
нужный чипселектом.

Блок работает следующим образом.
Ждет разрешающий бит (флаг) от NIOS.
Выставляет 1-й SS.
Читает данные из FIFO. Выход FIFO подключен непосредственно к
сдвиговому регистру SPI.
Модуль "control" начинает передачу сигналом на линии "go" и ждет
завершения передачи по линии "done".
Модуль "spi_master" по сигналу "go" фиксирует значение из FIFO в
сдвиговом регисте, и начинает передачу.
Окончания передачи передается по линии "done".
Далее модуль "control" выставляет следующий SS, читает из FIFO, так далее до
завершения передачи во все ЦАПы,
Завершение обмена фиксирует флагом (битом) в управляющем регистре периферийного блока.

Собственно вопрос по взаимодействию между модулями.
Модуль "control" должен дать команду на выдачу модулю "spi_master" по
линии "go", и дождаться окончания передачи по линии "done".
Каким сигналом (способом) передавать? Держать на линии go всегда лог. 1 и убирать
его когда придет сигнал "done"?
Или передавать стробами длительностью 1 период тактового сигнала?

Если уровнем, то как организовать правильность снятия сигналов?
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Mar 15 2010, 12:32
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



я делал похожий проект и сигнал "go" вел себя так:
Цитата(COMA @ Mar 15 2010, 17:47) *
Или передавать стробами длительностью 1 период тактового сигнала?

еще у меня было маскируемое прерывание на окончание передачи (когда done в 1 взводится), но у вас это, наверное, не нужно
Go to the top of the page
 
+Quote Post
COMA
сообщение Mar 15 2010, 13:37
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 851
Регистрация: 28-08-04
Пользователь №: 559



Пока сделал на стробах, без "рукопожатия"(handshake).
Go to the top of the page
 
+Quote Post
des00
сообщение Mar 15 2010, 14:21
Сообщение #4


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(COMA @ Mar 15 2010, 07:37) *
Пока сделал на стробах, без "рукопожатия"(handshake).

да можно и так, и так. Все зависит от того, что вы хотите получить. На стробах кстати тоже есть handshake, просто вы его интегрируете в КА %)

Вот пример handshake на "уровнях"

Код
case(mstate)
  WORK : mstate_next = (done & burst_done) ? DONE : WORK;
endcase

assign go = (mstate == WORK);

case(sstate)
  WAIT : sstate_next = go ? WORK : WAIT;
  WORK : sstate_next = cnt_done ? WAIT : WORK;
endcase

assign done = (sstate == WAIT);


А вот на "стробах"

Код
case(mstate)
  WORK : mstate_next = WAIT;
  WAIT : mstate_next = done ? (burst_done ? DONE : WORK) : WAIT;
endcase

assign go = (mstate == work);

case(sstate)
  WAIT : sstate_next = go ? WORK : WAIT;
  WORK : sstate_next = cnt_done ? WAIT : WORK;
endcase

assign done = (sstate == WORK) & cnt_done;


Как видите те же яйца, только сбоку.

ЗЫ. При кодировании "чистый" one-hot (т.е. 1 триггер - 1 состояние) первый способ красивее ложиться %)

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


--------------------
Go to the top of the page
 
+Quote Post
COMA
сообщение Mar 15 2010, 14:32
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 851
Регистрация: 28-08-04
Пользователь №: 559



Спасибо за ответ!

Стало намного понятнее. Буду использовать шурупы вместо гвоздей smile.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 12:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016