Аналоговые модули для ПЛИС
Бывает так, что в схеме, основанной на ПЛИС нужны АЦП и ЦАПы. В отличии от микроконтроллеров, в большинстве ПЛИСин нет встроенной аналоговой периферии. И тут приходится выкручиваться.
Общепринятый выход – поставить внешнюю микросхему. Но внешняя микросхема – это дополнительные затраты, которые хотелось бы избежать.
Сначала я думал рассказать только про то, что применял сам, но, в итоге, получилась обзорная статья о том, как вообще работать с аналоговыми сигналами на ПЛИС.
ЦАПы
Оказывается, способов сделать ЦАП на ПЛИС – хоть отбавляй. Естественно, у каждого есть свои достоинства и недостатки.
ШИМ
Довольно очевидное решение. Я думаю, рассказывать про него в очередной раз смысла нет. Гугль знает множество ответов на это вопрос. Разве что, могу посоветовать неплохой калькулятор, аналога которого я пока не написал.
Сигма-дельта модулятор
В моем текущем домашнем проекте UTC нужно было выдавать напряжение для ограничителя тока. Естественно, я заложил самый очевидный ЦАП – ШИМ с фильтром, но шум, который получился при малых выдаваемых напряжениях оказался совсем неприемлем. Я догадывался, что можно сделать сигма-дельта модулятор на ПЛИСины, и, таки, да!
Чем отличается модулятор от ШИМа? У ШИМа – фиксирована частота. Независимо от того, сигнал с каким заполнением он выдает, поэтому при маленькой скважности пульсации будут очень велики.
Сигма-дельта модулятор выдает такой сигнал, чтобы средняя плотность импульсов была такой как нужно. Для этого, его частота “дрожит”. На картинке два соседних периода выхода модулятора:
Такая хитрость позволяет сильно задрать частоту.
К примеру, представим, что нам нужен 10 битный ЦАП, выдающий число 200. Входная частота 5МГц. Частота ШИМа получается около 5кГц, а средняя частота сигма-дельта модулятора – 830кГц. Понятно, что модулятор даст намного меньше шума с тем-же фильтром.
Разница еще больше усиливается, если нужно выдавать число не 200, а 2 или 1021.
Ссылки на сигма-дельта ЦАПы:
Appnote от xilinx с ЦАПом, который я использовал.
Тот-же модулятор, но подключаемый к шине PLB
R2R
Это решение самое очевидное и на его основе можно получить большую частоту преобразования, но требует много компонентов, много ножек и много пайки. Еще одно достоинство в том, что в статических режимах, он абсолютно не шумит. Недостаток – у R2R бывают проблемы с монотонностью – следующий отсчет может быть меньше предыдущего.
Кроме того, для 8-битного ЦАПа уже нужны минимум 0.5% резисторы, а они – не дешевы.
АЦП
С АЦП все немного похуже, потому, как на ПЛИС принципиально невозможно сделать узел выборки-хранения, но для совсем медленно меняющихся сигналов есть несколько решений.
Сигма-дельта модулятор
Итак, опять модулятор. Смысл в том, что RC фильтр заряжается до тех пор, пока суммарное напряжение входного сигнала и RC фильтра не стало больше опорного, потом RC фильтр разряжается. По полученному сигналу восстанавливается напряжение.
В качестве компаратора можно использовать приемник диф. сигнала, который есть в каждой FPGA:
Приемники диф. сигнала – не лучшие компараторы, поэтому у них есть ошибки, да и ошибки эти зависят от температуры.
Собственно, у Altera есть хороший документ с примером такого АЦП, не буду пересказывать, читайте:
АЦП на времени заряда RC цепочки
Схема примерно та-же, но в этот раз мы просто замеряем время заряда RC цепочки до того, как напряжение на ней сравняется с входным сигналом. Такой прием раньше широко использовался для 8-битных микроконтроллеров без АЦП. Достоинство в том, что нужно довольно мало ресурсов для реализации такой штуковины, а обработку полученного времени можно делать процессором.
Компаратором опять может работать LVDS приемник.
Параллельный АЦП
Единственное упоминание такого АЦП я нашел под названием hackdac. Уж не знаю, почему dac, но речь там про АЦП.
Смысл простой – куча диф. приемников используется как компараторы, а сигнал подается на резистивный делитель. Количество отсчетов такого такого АЦП равна количеству компараторов, и для 4-битного результата их нужно будет аж 16 штук.
Зато скорость преобразования такого АЦП весьма велика, хватает даже для видео. Ему не нужен узел выборки-хранения.
R2R АЦП
Типичный случай АЦП последовательного приближения. Берем R2R ЦАП, подключаем его к компаратору, а потом, двоичным поиском ищем совпадение. Относительно быстрый способ, но обладает всеми недостатками R2R ЦАПа.