RC генераторы
Понадобился мне RC генератор. Вроде бы все просто – ставим инвертор, RC цепочку и вуаля. А что, если нужно, чтобы частота была хотя бы приблизительно стабильна при изменении температуры и от устройства к устройству?
У xilinx есть замечательный аппноут – six easy pieces. Там нарисована вот такая картинка:
Я сразу не понял, почему частота не зависит от порогов и температуры и для чего нужны два резистора. Потом сел рисовать диаграммы напряжения. Итак:
- С заряжается через верхний R.
- Нижняя ножка смотрит, зарядился ли C.
- А теперь происходит магия – когда C зарядился, вывод, который подключен к C переключается в противоположное состояние. Напряжение в точке соединения резисторов и конденсатора подскакивает выше напряжения питания. Вот тут и нужен нижний R – он не дает выжечь вход плисины, работают защитные диоды.
В итоге, сигнал в точке соединения резисторов и конденсатора получается вот такой:
Резкие изломы на графике (зеленая стрелка) – это пороговое напряжение.
Так как конденсатор заряжается и разряжается по одинаковому “маршруту”, то и длительность верхнего и низкого уровня одинаковая. (естественно, с погрешность, равной гистерезису ножки).
Частота определяется только параметрами пассивных компонентов и напряжением питания.
Для чего нужен триггер? Триггер убирает дребезг при переключении. Он сравнивает в какую сторону конденсатора заряжается и в какую сторону он фактически зарядился. Переключение происходит только если эти направления совпадают.
Мой код для этого генератора:
module RCOscillator( inout Resistor, inout Capacitor, input Sense, output Clock ); reg latch; assign Capacitor = latch; assign Resistor = !Capacitor; assign Clock = latch; always @(*) begin if (Resistor & Sense) begin latch = 1; end else if (!Resistor & !Sense) begin latch = 0; end end endmodule
Думаю, понятно, что Resistor – это верхний вывод, Capacitor – средний, а Sense – нижний.
Нижний резистор неплохо бы выбирать раз в 10 больше, чем верхний.
А вот и аппноут в тему о RC генераторах: https://www.fairchildsemi.com/an/AN/AN-118.pdf
В нем предлагается вот такая формула для оценки частоты генератора:
Но я лично, думаю, что оценивать его бесполезно – нужно собирать и пробовать. Почему? Потому, что в процессе участвуют и напряжение питания и гистерезис выводов и защитные диоды.
У меня этот генератор упорно не хотел выдавать 50% заполнение. Оказалось, что у xilinx’совских CPLD даже при отключенном bus-keeper’е остается слабая подтяжка, номинал которой зависит от температуры, поэтому и частота хоть и не сильно, но от температуры зависит.
Тут надо помнить, что у новых FPGA по умолчанию нет защитного диода от пина к питанию. Такой диод подключается только после конфигурирования драйвера пина для работы в PCI стандарте.