Создаем I2C Master Controller на Verilog. Идея и физический уровень

В рамках изучения Verilog я выбрал для себя интересную и полезную задачу, которую изначально планировал решить в рамках цикла статей по Xilinx Zynq. На отладочной плате, на которую я делал обзор в предыдущих статьях, есть OLED дисплей SSD1306 который управляется по I2C. Я решил, что было бы круто вывести на него какую-нибудь информацию из Linux, например температуру или загрузку CPU. Но чтобы это сделать — полезной информации нужно пройти путь через от Userspace до I2C Master Controller который управляет SSD1306. И вот реализацию этого самого контроллера из этой связки я хотел бы описать в этом цикле статей.

И немного поразмыслив — я подумал, что на этапе разработки этого модуля быстрее было бы его реализовать плате с ПЛИС Altera. Уж очень долго собирается bitstream-файл под Zynq. А в качестве тестового подчиненного устройства — буду использовать EEPROM и по мере готовности задачи — потом просто перенесу модуль в Vivado.

В как раз о том, что такое I2C, как я реализовывал Master Controller для работы с подчиненным устройством, чем руководствовался и что получилось — я опишу для вас в этой и последующих статьях.

Традиционно, кому интересно — добро пожаловать под кат! =)

image

Дисклеймер. Перед началом повествования, хотелось бы заранее оговориться, что основная цель, которую я преследую при написании этой статьи — рассказать о своем опыте. Я не являюсь профессиональным разработчиком под ПЛИС на языке SystemVerilog и могу допускать какие-либо ошибки в использовании терминологии, использовать не самые оптимальные пути решения задач, etc. Но отмечу, что любая конструктивная и аргументированная критика только приветствуется. Что ж, поехали…

Постановка задачи


Итак. Основная задача, которая передо мной стоит — это вывести информацию из Linux на OLED-дисплей который расположен на плате Zynq Mini, который подключен к PL-части Zynq.

Чтобы решить эту задачу, мне, как новичку, нужно научиться очень многому и проделать очень много работы:

  • Сделать I2C Master Controller, который будет непосредственным связующим звеном между OLED-дисплеем и логикой в ПЛИС;
  • Сделать контроллер, который будет разгребать данные приходящие из Linux, складывать их в framebuffer и потом посылать их через I2C Controller в дисплей, а также инициализировать его, управлять им, реагировать на возможные ошибки и т.п.;
  • Связать логику в ПЛИС с драйвером в Linux;
  • Создать драйвер для Linux и прикладную программу которые будут формировать нужную мне информацию, преобразовывать ее в подходящий для вывода на дисплее формат и отсылать ее в ПЛИС.


Первым шагом я решил реализовать I2C Master Controller. Задача, которая стоит передо мной на этом этапе делится еще на несколько подзадач:

  • Познакомиться с I2C, разобраться как с ним работать и что он из себя представляет на физическом и логическом уровне;
  • Описать логику работы state-машины и спроектировать конечный автомат;
  • Протестировать и отладить полученный результат.


В ходе выполнения всех этих шагов я попытаюсь сделать подробное описание того, как я продумывал решение, проектировал необходимые компоненты и модуле и, в итоге, реализовывал эту сложную и объемную задачу. Возможно, мой опыт поможет тем, кто не знает как подступиться к проектированию подобных вещей и узнает что-то новое. Кстати, это будет мой первый конечный (надеюсь, что не конченый

© Habrahabr.ru