Низкая скорость или высокая скорость?
Для низкой скорости подключите ядро GPIO с достаточным количеством «выводов» ввода/вывода в систему NIOS и перестройте его. Подключите свое оборудование к этим контактам и используйте код драйвера GPIO для доступа к ним. Готово. Кнопки считаются низкой скоростью. SPI тоже может, хотя вы, вероятно, найдете гораздо лучшую периферию SPI для NIOS, поэтому я бы использовал ее.
Для высокой скорости вам необходимо спроектировать периферийное (IP-ядро), которое взаимодействует с любой шиной, используемой системой NIOS, и предоставляет все регистры, память, источники прерываний и т. Д., Необходимые для взаимодействия с вашим оборудованием VHDL. Существует множество примеров периферийных устройств, которые вы можете использовать в качестве отправной точки. Затем вы можете написать программное обеспечение драйвера для доступа к этому периферийному устройству, опять же, начиная с образца кода.
Это гораздо более сложный проект, и, хотя он намного быстрее, чем GPIO, вы обнаружите, что «высокая скорость» относительна; любой встроенный CPU ужасно медленный по сравнению с настраиваемым оборудованием. Мы говорим не о факторах 2 здесь, а о порядках.
EDIT: Какой бы подход вы используете, как описано выше, взаимодействуя с оборудованием со стороны программного обеспечения лучше всего сделать с помощью программного обеспечения драйвера.
Если вы находитесь в ситуации, когда вам нужно написать свой собственный драйвер, вы объявляете переменные для соответствия каждому доступному регистру или блоку памяти (представленной переменной массива). Часто инструменты поставщика могут создавать для вас скелетный драйвер, будь то код VHDL или какое-либо другое описание. Я не знаю, как настроены инструменты Altera/Nios, но у них наверняка есть учебники, чтобы научить вас их подходу.
Если у вас есть компилятор Ada, вы можете объявить эти переменные в области пакета, чтобы поддерживать правильную абстракцию и скрывать информацию. Но если вам нужно использовать C, без пакетов, вы, вероятно, застряли с глобальными переменными.
Вы фиксируете каждую переменную на любом физическом адресе, к которому их привязывает оборудование, и вы должны объявить их «изменчивыми», чтобы доступ к ним никогда не оптимизировался в регистры.
Если ваше оборудование может прервать CPU, вам нужно написать функцию обработчика прерываний, с помощью pragmas сообщить компилятору, к которому следует привязать вектор, к которому он должен быть подключен. Вам нужно будет получить точные данные из вашей собственной документации по компилятору и примеры кода драйвера для других периферийных устройств.
Я хотел бы начать здесь: https://www.altera.com/support/support-resources/design-examples/intellectual-property/embedded/nios-ii/exm-developing-hal-drivers.html
с образцом кода и короткого «Руководящих принципов»
и использовать NIOS software handbook для большей глубины.
Чтобы найти то, что вы ищете, по-видимому, Altera использует термины «HAL» (Hardware Abstraction Layer) для описания части драйвера, которая напрямую обращается к аппаратным средствам, и «BSP» (пакет поддержки поддержки) для средства, которые позволяют вам описывать ваше оборудование для инструментов - и вашей команде разработчиков программного обеспечения. Любые инструменты для создания скелетного драйвера будут связаны с BSP: я вижу раздел «Создание нового BSP» в руководстве по программному обеспечению.
Я уверен, что в Интернете доступно много ресурсов, а также книг по этой теме. – wahab
Ага, какой вывод ... – Norick