Генерация произвольного такта на ПЛИС с использованием фазового аккумулятора

В моем проекте современной реплики ретро-компьютера «АГАТ-7» возникла необходимость генерации различных тактовых частот. Некоторые из них могут быть получены с помощью встроенных в ПЛИС PLL, другие могут быть получены простым делением частоты внутри ПЛИС. Но есть и такие, которые не так просто получить. В проекте я использую 50МГц генератор как основной. Далее в ПЛИС с помощью PLL из него я получаю тактовый сигнал с частотой 32.5МГц, который и является основным. Он отлично подходит для VGA выхода в режиме 1024×768, а также для тактирования процессора (32.5 / 32 = 1.016MHz), но он совершенно не подходит для ТВ выхода, которому требуются частоты 10.5МГц для счетчика пикселов и 17.734475МГц для генерации цветовой поднесущей. Вместо добавления дополнительных генераторов частоты на плату, участник svofski на форуме zx.pk.ru предложил мне использовать фазовый аккумулятор для генерации этих частот. Это достаточно простой, но эффективный метод, который может быть использован не только для генерации тактового сигнала, но и, совместно с ЦАП, сигналов любой другой формы. Почитать подробнее об этом можно в Википедии.

Для удобства расчетов параметров фазового аккумулятора я создал простой калькулятор:

 

 

Вот пример VHDL кода для генерации 17.5МГц сигнала из 250МГц сигнала при помощи 32-битного аккумуляторного регистра:

signal acc: std_logic_vector (31 downto 0); -- It is 32-bit phase accumulator. Change if different
signal clk_main: std_logic; -- 250MHz main clock source
signal clk_gen: std_logic; -- 17.5MHz generated clock signal

process(clk_main) -- phase accumulator clock generator (adder)
begin
   if (clk_main'event and clk_main = '1') then
      acc <= acc + 981707; -- use the calculated number to be added each step
   end if;
end process;

clk_gen <= acc(31); -- use the highest bit of the accumulator for output clock (31 for 32-bit acc.)

Идея метода состоит в создании регистра-аккумулятора (обычно не менее 32 бит) к которому прибавляется определенная константа каждый такт. На определенном этапе он переполняется и старший бит меняется, но остаток остается и продолжае накапливаться в регистре. Выход генератора привязан к старшему биту аккумулятора. На каком-то шаге для переполнения регистра понадобится на один такт меньше, что сделает соответствующий такт выходного сигнала короче. Таким образом выходная частота достигается пропорцией "длинных" и "коротких" тактов. Чем выше входная частота, тем меньше разница между "длинным" и "коротким" тактами и тем аккуратнее получается выходной сигнал.

Это приводит к основному недостатку этого метода - неидеальная стабильность сигнала. Это особенно заметно, когда выходная и входная частоты относительно близки. Вот пример выходного сигнала 15МГц при входном 50МГц:

Как вы видите, несмотря на правильную среднюю выходную частоту 15МГц, каждый индивидуальный шаг отличается от идеального достаточно существенно. Но если мы применим 250МГц сигнал в качестве входного, то картинка значительно улучшается:

Нерегулярности все еще заметны, но ими уже можно принебречь для большинства задач. Я успешно использую в своем проекте этот метод для генерации вышеуказанных ТВ частот. В качестве входной выступает частота умноженная с помощью PLL до примерно 275МГц.

Для использования калькулятора, введите входную частоту, требуемую выходную частоту и длину регистра-аккумулятора. Наиболее близкая выходная частота будет рассчитана. Если отклонение слишком высокое, то увеличение размера аккумулятора может помочь.

Так же калькулятор показывает положительное и отрицательное отклонения отдельных тактов от идеального для этой частоты. Для улучшения этого параметра надо повысить входную частоту.

Последний рассчитываемый параметр - число, которое добавляется к аккумулятору на каждом такте.

Конечно, это не универсальный метод, но может пыть использован во многих случаях, уменьшив количество элементов в проекте и возможно позволив выбрать более дешевую ПЛИС с меньшим количетвом PLL. Калькулятор позволяет смоделировать результат и на основании этой модели принять окончательное решение о применимости этого метода в каждом конкретном случае.

Надеюсь, что статья оказалась вам полезна. До встречи!

Leave a Reply