Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как организовать взаимодействие между модулями
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
COMA
Добрый день,

Пишу периферию для 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 период тактового сигнала?

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

еще у меня было маскируемое прерывание на окончание передачи (когда done в 1 взводится), но у вас это, наверное, не нужно
COMA
Пока сделал на стробах, без "рукопожатия"(handshake).
des00
Цитата(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 и по другому сформировать.
COMA
Спасибо за ответ!

Стало намного понятнее. Буду использовать шурупы вместо гвоздей smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.