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

 
 
> Создание компонета для 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
barabek
сообщение Aug 23 2012, 22:19
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(Acvarif @ Aug 23 2012, 20:18) *
Спасибо. Понятно. Жаль, что только по уровню.

По другому никак. Ну только у 51-ых для некоторых прерываний флаги автоматом сбрасываются при переходе на вектор прерываний. Но это редкость и это не Ваш случай.Для ниоса попытайтесь понять механизм обработки прерываний. Читайте мануал exaption handling. Кратко так. При появлении какого-либо флага ниос переходит на строго определенный адрес (exception address). И этот адрес ОДИН для всех прерываний в системе. По этому адресу хранится библиотечный обработчик (ЕМНИП irq_handler()), который проверяет регистр ipending. В этот регистр смультеплексированы все флаги прерываний. Проверяет софтверно! И на каждый установленный бит вызывает соответствующий обработчик прерывания из таблицы. А теперь представьте, Вы выставили флаг, обработчик вызвался, но не успел обнаружить Ваш флаг, а Вы его сбросили. Нехорошая ситуация.
Вам же выложили примеры. Там есть прерывания. Посмотрите. У меня в примере есть сбос прерывания по чтению региста данных. Это на несколько команд сокращает обработчик sm.gif. Т.е. не обязательно заставлять пользователя сбрасывать флаг, можно сделать так, чтобы флаг сбрасывался, когда Вы вычитываете (или записываете новые) данные из переферии.
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
|- - 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 Текстовая версия Сейчас: 22nd July 2025 - 10:35
Рейтинг@Mail.ru


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