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

 
 
> Создание компонета для SOPC Builder с несколькими регистрами ввода/вывода
altlogic
сообщение Jul 25 2012, 06:23
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Здравствуйте!

Простая по идее задача - хочу созадать свой компонент I2C для SOPC с возможностью конфигурирования его через внутренние регистры компонента (да хотя бы флаг RUN реализоватьsm.gif ). Как это сделать? Нашел на сайте Altera пример Memory Mapped Slave. В этом шаблоне у устройства задается использование 16 внутренних регистров. Но там мощный шаблон, на 700 сток кода. Я аж испугалсяsm.gif
А мне кажется можно это все сделать проще. Ведь всего лишь нужно вытянуть из SOPC информацию о том, по какому адресу он разместил внутренние регистры устройства, ну и сделать их программно доступными конечо с шины Avalon. Примеров других пока не разбирал. Но мне кажется моя задача должна встречаться у всех разработчиков периферии под процессор для FPGA. Товарищ показал код для Xilinx MicroBlaze в аналогичной ситуации. Там, как и в примере Altera в описании компонента применяется специальная нотация.

Смотрел IP-core I2C от Terasic. Там, как я понял используется несколько отдельных регистров ввода-вывода, то есть устройство состоит из нескольких устройств на шине Авалон. Видимо это вообще самое простое решение. Но ведь как-то некрасиво?..


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Копейкин
сообщение Aug 23 2012, 09:05
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 190
Регистрация: 7-11-07
Из: С-Петербург
Пользователь №: 32 134



У меня примера под рукой нет, но когда разбирался, то отложилось в памяти так:
1) Интерфейс Interrupt sender даёт нам линии irq или irq_n, которые работают по уровню, не фронту.
Выбрали, допустим irq - срабатывает на уровень "1".
2) Ставим на линию irq триггер.
3) Триггер взводится в "1" Вашим событием (кнопка, счётчик...)
4) Программа в обработчике прерывания ОБЯЗАТЕЛЬНО должна этот триггер сбросить в "0",
иначе из прерывания не выйти. Сбросить можно чтением или записью по адресу, как Вам удобно.
Вот таким образом.

Есть ещё компонент - векторизируемый контроллер прерываний - он даёт возможностей побогаче,
более предсказуемое время входа в прерывание, но требует существенных ресурсов, для реализации.
С ним не разбирался - так, обзорно...

Сообщение отредактировал Копейкин - Aug 23 2012, 09:08
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Aug 23 2012, 10:18
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(Копейкин @ Aug 23 2012, 12:05) *
У меня примера под рукой нет, но когда разбирался, то отложилось в памяти так:
1) Интерфейс Interrupt sender даёт нам линии irq или irq_n, которые работают по уровню, не фронту.
Выбрали, допустим irq - срабатывает на уровень "1".
2) Ставим на линию irq триггер.
3) Триггер взводится в "1" Вашим событием (кнопка, счётчик...)
4) Программа в обработчике прерывания ОБЯЗАТЕЛЬНО должна этот триггер сбросить в "0",
иначе из прерывания не выйти. Сбросить можно чтением или записью по адресу, как Вам удобно.
Вот таким образом.

Есть ещё компонент - векторизируемый контроллер прерываний - он даёт возможностей побогаче,
более предсказуемое время входа в прерывание, но требует существенных ресурсов, для реализации.
С ним не разбирался - так, обзорно...

Спасибо. Понятно. Жаль, что только по уровню.
Вобщем так вроде и реализовал. Только сброс со стороны обработчика не делал.
Попробую со сбросом.
Всеравно не до конца понимаю зачем сбрасывать тригер со стороны программы (тоесть в обработчике).
Почему не проходит номер просто формировать импульс небольшой длительности и все?

Читал мануал и выяснил, что если использовать PIO то можно все реализовать и по фронту. В этом случае используется
регистр PIO который внешним событием можно установить, а в обработчике сбросить типа
CODE
/* Initialize the button_pio. */
static void init_button_pio()
{
/* Recast the edge_capture pointer to match the
alt_irq_register() function prototype. */
void* edge_capture_ptr = (void*) &edge_capture;
/* Enable all 4 button interrupts. */
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf);
/* Reset the edge capture register. */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0);
/* Register the ISR. */
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
alt_ic_isr_register(BUTTON_PIO_IRQ_INTERRUPT_CONTROLLER_ID,
BUTTON_PIO_IRQ,
handle_button_interrupts,
edge_capture_ptr, 0x0);
#else
alt_irq_register( BUTTON_PIO_IRQ,
edge_capture_ptr,
handle_button_interrupts );
#endif
}

Вроде и так можно, но тогда придется из компонента прерывание убрать, добавить 1 бит PIO, вывести наружу импульсы запроса прерывания которые подать извне на PIO (тоесть просто перемычка). Насколько так будет хуже или лучше?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- altlogic   Создание компонета для SOPC Builder с несколькими регистрами ввода/вывода   Jul 25 2012, 06:23
- - Konst_777   Цитата(altlogic @ Jul 25 2012, 09:23) ......   Jul 25 2012, 17:41
- - altlogic   Спасибо, буду иметь ввиду. Надо поковырять этот мо...   Jul 26 2012, 02:05
|- - barabek   Цитата(altlogic @ Jul 26 2012, 12:05) Спа...   Jul 29 2012, 22:32
- - Orochi   Я учился работать с регистрами анализируя код этог...   Jul 30 2012, 20:00
|- - Acvarif   Цитата(Orochi @ Jul 30 2012, 23:00) Я учи...   Aug 13 2012, 13:41
- - Копейкин   Сигналы, идущие наружу должны иметь тип интерфейса...   Aug 13 2012, 16:40
- - Orochi   Вот как подключен этот этот компонент у меня. aval...   Aug 13 2012, 17:15
|- - Acvarif   Цитата(Orochi @ Aug 13 2012, 20:15) Вот к...   Aug 14 2012, 07:05
- - Копейкин   Deprecated-параметрами не следует пользоваться. Эт...   Aug 14 2012, 08:53
- - Acvarif   Создал компонент Avalon MM Slave с пользовательско...   Aug 17 2012, 06:44
- - Копейкин   Я не силён в VHDL, пишу на Verilog, но 1) Выходной...   Aug 17 2012, 08:00
|- - Acvarif   Спасибо. Попробую разобраться. Если примитивно то...   Aug 17 2012, 08:29
- - Копейкин   Для чтения/записи отдельного байта следует использ...   Aug 20 2012, 09:18
|- - Acvarif   Цитата(Копейкин @ Aug 20 2012, 12:18) Для...   Aug 20 2012, 10:48
- - Копейкин   Макро IORD(base, n) применяется при адресации типа...   Aug 20 2012, 11:48
|- - Acvarif   Цитата(Копейкин @ Aug 20 2012, 14:48) Мак...   Aug 20 2012, 12:35
- - Копейкин   Вы должны увидеть активацию сигналов avs_s0_read_...   Aug 20 2012, 13:36
|- - Acvarif   Цитата(Копейкин @ Aug 20 2012, 16:36) Вы ...   Aug 20 2012, 14:04
- - Копейкин   Вы имеете в виду, что сигналы avs_s0_read_n & ...   Aug 20 2012, 16:51
|- - Acvarif   Цитата(Копейкин @ Aug 20 2012, 19:51) Вы ...   Aug 20 2012, 17:27
|- - Acvarif   Вроде получилось. Для того, чтобы пронаблюдать на ...   Aug 21 2012, 08:07
- - Копейкин   Добавляете интерфейс Interrupt sender. У Вас добав...   Aug 21 2012, 10:35
|- - Acvarif   Цитата(Копейкин @ Aug 21 2012, 13:35) Доб...   Aug 21 2012, 11:10
|- - Acvarif   Почитал немного букварь "Avalon Interface Spe...   Aug 22 2012, 10:13
- - Копейкин   Предупреждение предупреждает (о как), что устройст...   Aug 22 2012, 13:31
|- - Acvarif   Цитата(Копейкин @ Aug 22 2012, 16:31) Пре...   Aug 22 2012, 14:13
- - Копейкин   Нет, автоматом не сбрасывается. Ты должен иметь св...   Aug 22 2012, 15:24
|- - Acvarif   Цитата(Копейкин @ Aug 22 2012, 18:24) Нет...   Aug 23 2012, 06:30
|- - barabek   Цитата(Acvarif @ Aug 23 2012, 20:18) Спас...   Aug 23 2012, 22:19
|- - Acvarif   Цитата(barabek @ Aug 24 2012, 01:19) По д...   Aug 24 2012, 08:07
- - Копейкин   Импульс небольшой длительности не гарантирует сраб...   Aug 23 2012, 13:32


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:59
Рейтинг@Mail.ru


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