Микросхемы ПЛИС серии MAX10 компании Альтера имеют встроенный Аналогово-Цифровой Преобразователь, АЦП. Это довольно интересно, так как совместить в микросхеме цифровую и аналоговые части не очень просто. С другой стороны, получившееся техническое решение лично мне кажется каким-то немного странным, не совсем продуманным и не очень логичным. Взять хотя бы такой факт, что макcимальная частота оцифровки для MAX10 составляет всего 1МГц. Вот казалось бы - ПЛИС - это технология предназначенная для обработки больших массивов данных, скоростных потоков информации. Но что такое 1МГц для ПЛИС? Как-то маловато будет. Вот было бы 50МГц или 100МГц - вот было бы круто.. Но видимо сделать это совсем не просто.. Так что имеем то, что имеем - 1МГц.
Попробуем все же посмотреть, как можно использовать АЦП в нашей плате Марсоход3 / Марсоход3bis..
На самом деле в ассортименте микросхем серии МАХ10 есть ПЛИС с разными концигурациями АЦП. Согласно документации на чипы MAX10 (https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/max-10/ug_m10_adc.pdf) в микросхемах корпуса E144 присутствуют 1 выделенный канал (dedicated ADC channel) и 8 каналов двойного назначения (dual purpose):
Таким образом, теоретически, в наших микросхемах 9 входов могут быть использованы для оцифровки входных сигналов. Частота оцифровки естественно делится между каналами. То есть, если нужно 2 канала, то максимальная частота оцифровки на канале будет уже не 1МГц, а 500КГц...
Есть еще странность, с которой я столкнулся и никак не смог разрешить.. Предположим, мне не нужны 9 каналов и я хочу использовать только один входной канал, тот, который называется dedicated ANAIN signal. Похоже, что оставшиеся 8 каналов я не могу использовать в качестве обычных цифровых входов или выходов.. По крайней мере я не смог этого сделать.. В документации есть вот такое странное:
Это значит, что в моем проекте для платы Марсоход3 при использовании АЦП я не смогу использовать выходы FTC[7..0] как цифровые сигналы. И это печально.
Ладно, попробую все таки сделать проект с АЦП для платы Марсоход3.
Вход АЦП микросхемы MAX10 выведен на контакт 1 разъема CN2, разъем для шилдов.
Разъем для шилдов одинаковый и у платы Марсоход2 с микросхемой Cyclone_III. Вот только в циклонах нет встроенного АЦП, поэтому на плате Марсоход2 у нас стоит внешний преобразователь.
Я подключаю к входу АЦП просто переменный резистор, который будет регулировать от нуля до VCC +3,3V.
Переменный резистор подключили, теперь займусь проектом Altera Quartus II для платы Марсоход3. За основу проекта беру мой перый проект со светодиодами.
Дальше идув пункт меню Tools => IP Catalog, появляется библиотека компонентов.
Выбираем Library => Processors and Peripherals => Peripherals => Altera Modular ADC Core
Появляется QSYS IP Parameter Editor.
Придумываем имя будущему модулю, например "myadc".
Задаем параметры. Тут собственно важный параметр - это Core Variant. Возможен вариант с модулем на шине Avalon для использования совместно с процессором. Я же выбираю самый простой вариант - ADC Control Core Only. Еще есть место, где выбираем нужные нам каналы, но это не очень важно пока.
Просто нажимаю в правом нижнем углу Generate (потом опять Generate в следующем окне) и появляются сгенерированные файлы:
Тут программа Quartus II Qsys создала много разных файлов, из этих всех я, для упрощения проекта, выбираю файл с модулем самого низкого уровня. Открываю файл myadc/synthesis/fiftyfivenm_adcblock_top_wrapper.v.
Из модуля Verilog делаю компонент схемы через меню File => Create / Update => Create Symbol Files for Current File.
Этот новый компонент со странным именем fiftyfivenm_adcblock_top_wrapper устанавливаю на схему проекта. На самом деле, конечно, у модуля есть управляющие сигналы, можно запускать и останавливать оцифровку сигналом "soc" (Start Of Conversion), можно передавать в модуль номер канала, с которого нужно оцифровывать. Я этого делать не буду - ведь я использую только один канал? Значит как-то так:
Выход АЦП 12 разрядов. Я 8 старших разрядов adcout[11..4] просто подключаю к светодиодам платы LED[7..0].
На модуль подаю 1МГц с PLL, в параметрах модуля стоит делитель 1. Сигнал soc устанавливаю в единицу, номер канала фиксирую константой "ноль" - использую только dedicated сигнал ANAIN. Есть еще в параметрах модуля маска используемых каналов. Честно говоря я не понял, как это работает. У меня АЦП работает при любых значениях маски каналов analog_input_pin_mask - это просто загадка для меня.
Да, еще, конечно, нужно удалить назначения для пинов FTC[7..0] из проекта. Это делается в Assignment Editor. Пины FTC не получается использовать, когда АЦП работает.
Компилирую, загружаю проект в ПЛИС MAX10. Кручу ручку переменного резистора и вижу, как меняется значение на светодиодах.
Работает!
Кроме входов микросхемы к АЦП можно подключить еще внутренний температурный датчик микросхемы MAX10. Чтобы он заработал нужно выбрать номер канала 17 и подать на модуль АЦП частоту пониже. Я поставил делитель 5:
Компилирую, загружаю проект в ПЛИС MAX10. Теперь не кручу ручку переменного резистора, но нагреваю микросхему паяльником.
К сожалению, на этом видео не очень видно как меняется яркость светодиодов.. Сперва отображается 0xE0, потом грею микросхему MAX10 и вижу на светодиодах получается 0xCF.
Получается интересно. Чем больше грею чип, тем меньше число отображается на светодиодах. Но похоже это нормально - в документации на MAX10 приведена таблица соответствия значений АЦП к градусам температуры. И тут видно, что зависимость обратная, чем выше температура, тем меньше значение получено из АЦП... В общем - работает!
Мой проект можно взять здесь:
Документация на АЦП микросхемы MAX10: https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/max-10/ug_m10_adc.pdf
Другая полезная статья о точности АЦП микросхемы MAX10: https://akpc806a.wordpress.com/2015/04/06/adc-accuracy-test-in-altera-max-10-fpga/
Подробнее...