|
Создание компонета для SOPC Builder с несколькими регистрами ввода/вывода |
|
|
|
Jul 25 2012, 06:23
|
Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035

|
Здравствуйте! Простая по идее задача - хочу созадать свой компонент I2C для SOPC с возможностью конфигурирования его через внутренние регистры компонента (да хотя бы флаг RUN реализовать  ). Как это сделать? Нашел на сайте Altera пример Memory Mapped Slave. В этом шаблоне у устройства задается использование 16 внутренних регистров. Но там мощный шаблон, на 700 сток кода. Я аж испугался  А мне кажется можно это все сделать проще. Ведь всего лишь нужно вытянуть из SOPC информацию о том, по какому адресу он разместил внутренние регистры устройства, ну и сделать их программно доступными конечо с шины Avalon. Примеров других пока не разбирал. Но мне кажется моя задача должна встречаться у всех разработчиков периферии под процессор для FPGA. Товарищ показал код для Xilinx MicroBlaze в аналогичной ситуации. Там, как и в примере Altera в описании компонента применяется специальная нотация. Смотрел IP-core I2C от Terasic. Там, как я понял используется несколько отдельных регистров ввода-вывода, то есть устройство состоит из нескольких устройств на шине Авалон. Видимо это вообще самое простое решение. Но ведь как-то некрасиво?..
--------------------
|
|
|
|
|
 |
Ответов
|
Aug 23 2012, 09:05
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 23 2012, 10:18
|
Знающий
   
Группа: Участник
Сообщений: 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 (тоесть просто перемычка). Насколько так будет хуже или лучше?
|
|
|
|
|
Aug 23 2012, 22:19
|
Знающий
   
Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831

|
Цитата(Acvarif @ Aug 23 2012, 20:18)  Спасибо. Понятно. Жаль, что только по уровню. По другому никак. Ну только у 51-ых для некоторых прерываний флаги автоматом сбрасываются при переходе на вектор прерываний. Но это редкость и это не Ваш случай.Для ниоса попытайтесь понять механизм обработки прерываний. Читайте мануал exaption handling. Кратко так. При появлении какого-либо флага ниос переходит на строго определенный адрес (exception address). И этот адрес ОДИН для всех прерываний в системе. По этому адресу хранится библиотечный обработчик (ЕМНИП irq_handler()), который проверяет регистр ipending. В этот регистр смультеплексированы все флаги прерываний. Проверяет софтверно! И на каждый установленный бит вызывает соответствующий обработчик прерывания из таблицы. А теперь представьте, Вы выставили флаг, обработчик вызвался, но не успел обнаружить Ваш флаг, а Вы его сбросили. Нехорошая ситуация. Вам же выложили примеры. Там есть прерывания. Посмотрите. У меня в примере есть сбос прерывания по чтению региста данных. Это на несколько команд сокращает обработчик  . Т.е. не обязательно заставлять пользователя сбрасывать флаг, можно сделать так, чтобы флаг сбрасывался, когда Вы вычитываете (или записываете новые) данные из переферии.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|