pll что это такое
Pll что это такое
PLL (Permutation of the Last Layer) – заключительный этап сборки в методе Фридрих, заключающийся в перестановке (пермутации) ребер и улов последнего слоя, относительно друг друга, когда они уже ориентированы.
Для каждой из 21 ситуации были подобраны скоростные алгоритмы с различных сторон. Поэтому если вы только начали изучать PLL, то вам не нужно искать алгоритмы на других ресурсах, т. к. лучшие из них собраны здесь, и вы сможете выбрать для себя алгоритм с интересующей вас стороны для любой из ситуаций.
Треугольники углов (А-perms)
Lw’ U R’ D2 R U’ R’ D2 R2
y x’ R2 D2 R’ U’ R D2 R’ U R’
y’ R U R’ U’ R’ F R U R’ U’ R’ F’ R U R2 U’ R’
y’ Rw L D2 L’ U’ L D2 L’ U L’
y’ x’ U’ R U’ L2 U R’ U’ L2 U2
y2 Rw’ U L’ D2 L U’ L’ D2 L2′
x R2 D2 R U R’ D2 R U’ R
y U’ R’ F’ R U R U’ R2 F R U R’ F’ R F
y Lw U’ R D2 R’ U R D2 R2
y’ R U R2 U’ R’ F R U R U’ R’ F’ R U R U’ R’
y’ Rw U’ L D2 L’ U L D2 L2
y’ Rw U’ L Uw2 R’ U R Uw2′ L2
Терминатор (E-perm)
x’ R U’ R’ D R U R’ D’ R U R’ D R U’ R’ D’
R’ U’ R’ D’ R U’ R’ D R U R’ D’ R U R’ D R2
R’ U2 R’ D’ R U R’ D R U’ R’ D’ R U2 R’ D R2
Саночки (Z-perm)
Крест сторон (H-perm)
U’ M’ U M2 U M2 U M’ U2 M2
y/y’ M2 U’ M2 U’ M’ U2 M2 U2 M’ U2
U2 M’ U2 M2 U2 M’ U’ M2 U’ M2
M2′ U2 M’ U’ M2′ U’ M2′ U’ M’ U
y’ R’ U’ R U’ R U R U’ R’ U R U R2 U’ R’ U2
M2 U’ M2 U2 M2 U’ M2
M2 U M2 U2 M2 U M2
Треугольники сторон (U-perms)
R U’ R U R U R U’ R’ U’ R2
U2 R U R’ U R’ U’ R2 U’ R’ U R’ U R
y2 R2 U’ R’ U’ R U R U R U’ R
y2 M2 U M’ U2 M U M2
y’ R2 U’ F B’ R2 F’ B U’ R2
y’ M2 Uw’ M’ Uw2 M’ Uw’ M2
R2 U R U R’ U’ R’ U’ R’ U R’
y2 R’ U R’ U’ R’ U’ R’ U R U R2
y2 M2 U’ M’ U2 M U’ M2
y’ R2 U F B’ R2 F’ B U R2
y M2 Uw M’ Uw2 M’ Uw M2
Лямбды (J-perms)
R U R’ F’ R U R’ U’ R’ F R2 U’ R’ U’
R U2 R’ U’ R U2 L’ U R’ U’ L
y R U’ L U2 R’ U R U2 R’ L’ U
y2 R’ z R U R’ D R2 U’ R U R2 U’
y2 z R U R’ D R2 U’ R U R2′ U’ D’
y2 R’ U2 R U R’ F’ R U R’ U’ R’ F R2 U’ R’ U R
y2 x U2 Lw U Lw’ U2 Rw U’ L U L2
U’ R’ U L’ U2 R U’ R’ U2 R L
L U’ R’ U L’ U2 R U’ R’ U2 R
R’ U2 R U R’ z R2 U R’ D R U’
x U2 Rw’ U’ Rw U2 Lw’ U R’ U’ R2
F U’ R’ F R2 U’ R’ U’ R U R’ F’ R U R’ F’
y L’ U R’ z R2 U R’ U’ R2 U D R’
y2 L’ U’ L F L’ U’ L U L F’ L2 U L U
y2 L’ U2 L U L’ U2 R U’ L U R’
Cемерки (R-perms)
R’ U2 R U2 R’ F R U R’ U’ R’ F’ R2 U’
U R2 F R U R U’ R’ F’ R U2 R’ U2 R
R’ U2 R’ D’ R U’ R’ D R U R U’ R’ U’ R U’
U R’ U R U R’ U’ R’ D’ R U R’ D R U2 R
L U2 L’ U2 L F’ L’ U’ L U L F L2 U
R U R’ F’ U’ F R U R’ F R’ F’ R2 U2 R’
y R U’ R’ U’ R U R D R’ U’ R D’ R’ U2 R’ U’
y2 U’ R U R’ F’ R U2 R’ U2 R’ F R U R U2 R’
Буква Т (T-perm)
Копье (Y-perm)
R U R’ U’ R’ F R2 U’ R’ U’ R U R’ F’
(Dw2) R U R’ U’ R’ F R2 U’ R’ U F’ L’ U L
y2 L’ U’ L U L F’ L2 U L U L’ U’ L F
F R U’ R’ U’ R U R’ F’ R U R’ U’ R’ F R F’
F R’ F R2 U’ R’ U’ R U R’ F’ R U R’ U’ F’
R2 U’ R’ U R U’ x’ z’ L’ U’ R U’ R’ U’ L U
R’ U’ R U’ R U R’ F’ R U R’ U’ R’ F R2 U’ R2 U R
y2 L2′ U’ L’ U L U’ y Rw’ U’ R U’ R’ U’ L U
y2 z U’ R’ U2 R’ D R2 U’ R U R2 U’ D’ R U’ R U
Параллельный перенос (F-perm)
Летающая тарелка (V-perm)
R’ U’ F’ R U R’ U’ R’ F R2 U’ R’ U’ R U R’ U R
U’ R’ U R U’ R2 F’ U’ F U R F R’ F’ R2
y R’ U2 R’ U’ y R’ F’ R2 U’ R’ U R’ F R U’ F
y’ R’ U R U’ R2 F’ U’ F U R U’ R2 Fw’ U’ Fw
y’ R’ U R U’ R2 F’ U’ F U R U’ x’ R2 U’ R’ U
y2 F’ U2 F’ U’ R’ F’ R2 U’ R’ U R’ F R U’ F
y2 F Rw2 R’ U2 Rw U’ Rw’ U2 x’ R2 U’ R’ U Rw2 D’
R’ U R’ U’ y R’ F’ R2 U’ R’ U R’ F R F
R’ U2 R U2 L U’ R’ U L’ U L U’ R U L’
y F’ U F’ U’ R’ F’ R2 U’ R’ U R’ F R F
y2 L’ U2 L U2 R U’ L’ U R’ U R U’ L U R’
Буквы X (N-perms)
R U R’ U R U R’ F’ R U R’ U’ R’ F R2 U’ R’ U2 R U’ R’
z R U R’ D R2 U’ R D’ U R’ D R2 U’ R D’
R U’ R’ U Lw U F U’ R’ F’ R U’ R U Lw’ U R’
R U R’ U’ L U2 L’ U’ L U2 R’ U L’ U’ R U R U’ R’
R U’ L U2 R’ U L’ R U’ L U2 R’ U L’ U’
R’ U R U’ R’ F’ U’ F R U R’ F R’ F’ R U’ R
R’ U R’ F R F’ R U’ R’ F’ U F R U R’ U’ R
R’ U L’ U2 R U’ R’ L U L’ U2 R U’ L U
L’ U R’ z R2 U R’ U’ D R D’ R2 U R’ z’ R
R’ U’ R U’ L U’ R’ U L’ U2 R U’ R’ U2 R U R’ U R
Восьмерки (G-perms)
R2′ F2 R U2 R U2′ R’ F R U R’ U’ R’ F R2
y2 R2′ Uw’ R U’ R U R’ Uw R2 B U’ B’
y2 R2 U’ R U’ R U R’ U R2 D’ U R U’ R’ D U’
y2 D R2 U’ R U’ R U R’ U R2 D’ U R U’ R’ U’
R2′ F’ R U R U’ R’ F’ R U2′ R’ U2′ R’ F2 R2
y’ R U R’ y’ R2 Uw’ R U’ R’ U R’ Uw R2
y’ R U R’ U’ D R2 U’ R U’ R’ U R’ U R2 U D’
y2 Fw R Fw’ R2 Uw’ R U’ R’ U R’ Uw R2
y2 U D’ R U R’ U’ D R2 U’ R U’ R’ U R’ U R2
R2 Uw R’ U R’ U’ R Uw’ R2 y’ R’ U R
L2 F2 L’ U2 L’ U2 L F’ L’ U’ L U L F’ L2
y’ U D’ R2 U R’ U R’ U’ R U’ R2 D U’ R’ U R
Использование PLL
PLL широко используются при телекоммуникации, в компьютерах и других электронных устройствах.
Замечу, что в микросхеме серии MAX II, которая стоит на нашей первой плате Марсоход, не было встроенных PLL. Серия Altera MAX II слишком простая.
В микросхеме Altera Cyclone III, установленной на новую плату Марсоход2, есть встроенные PLL. Это очень важный компонент, так как с помощью PLL обычно в проекте создаются все частоты, нужные для дизайна. Именно поэтому нужно познакомиться с PLL поближе.
Рассмотрим принцип действия PLL.
Это было достаточно упрощенное изложение. Более подробно о работе PLL можно почитать в документации компании Альтера например про микросхему Cyclone III: Clock Networks and PLLs in the Cyclone III Device Family.
В этой Альтеровской документации, например, блок-схема PLL изображена вот так:
Вроде бы сложно, но по сути так же, как я нарисовал выше.
Теперь спустимся с небес на землю и посмотрим, как же эти PLL использовать в проектах для Cyclone III и в частности для платы Марсоход2.
А вот и самый главный экран визарда.
Здесь мы должны задать коэффициенты умножения и деления для исходной частоты, чтобы получилась нужная нам частота.
Коэффициенты можно задать самостоятельно вручную или задать желаемую частоту и Quartus II Wizard сам расчитает коэффициенты, которые нужно потом скопировать.
Вот, например, для работы первого проекта для платы Марсоход2 для видеорежима 1440×900 60Hz нужна по стандарту VESA частота 106.5Мгц.
Для каждого выxода PLL будет соответствующая страница визарда с настройками.
Вот пожалуй все первоначальные сведения для использования PLL в проектах для микросхему Altera Cyclone III.
Фазовая модуляция радиосигнала в ПЛИС
Так иногда бывает, что занимаешься одной технической проблемой, но, по мере погружения в задачу и во время поиска ее решения, появляются «побочные продукты». Так случилось и в этот раз. Я исследовал различные методы измерения временных интервалов с помощью ПЛИС. В одном из предложенных методов измерений был использован динамический сдвиг фазы тактовой частоты с PLL. Позже пришла идея: используя свойства PLL можно попробовать сделать в ПЛИС простейший радиопередатчик с фазовой модуляцией.
И кое-что получилось!
Пожалуй нужно немного рассказать, что такое PLL. PLL (Phase Locked Loop) — это устройство фазовой автоподстройки частоты генератора. Выглядит примерно вот так:
Здесь есть ГУН — Генератор, Управляемый Напряжением. Он выдает желаемую частоту, которая через обратную связь идет на фазовый детектор. Фазовый детектор определяет разность фаз между опорной частотой F0 и получившейся частотой F1, разность фаз — это сигнал ошибки, который отфильтровывается и воздействует на ГУН, заставляя его колебаться чуть быстрее или чуть медленнее. Так, на выходе ФАПЧ получается частота, синхронная с опорной.
В микросхемах ПЛИС, например, от компании Интел (эх… когда-то была Альтера) серии MAX10 есть встроенный PLL, который выглядит вот так:
Кажется, что это что-то гораздо более сложное, чем то, что изображено выше. Но нет, если присмотреться внимательно, то видны общие черты: ГУН, Генератор Управляемый Напряжением — это VCO, Voltage Controlled Oscilator. PFD — это фазовый детектор, LF — Loop Filter, фильтр фазовой ошибки.
Кроме всего прочего, PLL внутри ПЛИС имеет набор счетчиков делителей. Например, делитель частоты M в цепи обратной связи позволяет получить на выходе PLL частоту в несколько раз выше, чем опорная. Так же имеются выходные счетчики C0-C4, которые позволяют на пяти выходах PLL получить сетку частот с разными делителями.
Есть внутри PLL еще компоненты, которые почему-то обычно не изображаются на структурных схемах в документации Altera/Intel — это схемы управляющие перезагрузкой и перенастройкой PLL. Логические схемы в ПЛИС могут на лету перезагружать коэффициенты счетчиков делителей в PLL и еще они позволяют сдвигать фазу выходных частот PLL. Конечно, перезагрузить на лету параметры PLL — это не очень простая операция, которая к тому же занимает определенное время. А вот сдвигать фазу выходной частоты PLL можно довольно просто и быстро. Причем, разрешающая способность по фазе напрямую зависит от частоты Fvco. Сдвигать фронт тактовой частоты можно на 1/8 периода Fvco. Например, входная частота на PLL Fin=100МГц, а делитель M в цепи обратной связи к фазовому детектору равен 13-ти. Тогда Fvco=1300МГц, а разрешение по фазе для выходной частоты PLL Fout=100МГц будет составлять всего 3,46 градуса.
Для разработки проекта для ПЛИС Altera/Intel используется среда САПР Quartus Prime и в ней есть средства настройки экземпляров PLL: Megawizard Plug-In Manager. С его помощью можно устанавливать нужные свойства PLL:
Здесь как раз и видно какие получаются Fvco и разрешение по фазе для выходных частот.
Для управления фазой выходных частот у компонента PLL есть дополнительные сигналы: SCANCLK, PHASESTEP, PHASEUPDOWN, PHASECOUNTERSELECT, PHASEDONE.
В документации Altera/Intel написано, как управлять этими сигналами, чтобы получить единичный сдвиг фазы на избранной выходной частоте.
Получается так: сигнал PHASEUPDOWN определяет в какую сторону нужно двигать фазу. PHASECOUNTERSELECT определяет сигнал какой именно тактовой частоты PLL будет сдвинут (например, если нужно сдвинуть частоту c1, то PHASECOUNTERSELECT=3’b011 — это есть в документации). Цикл сдвига фазы начинается с установки сигнала PHASESTEP и заканчивается, когда PLL выставит в ноль PHASEDONE. Если нужно сдвинуть фазу значительно, то придется выполнить несколько таких циклов. Все это при желании можно даже просимулировать в ModelSim, как это делается я писал вот здесь.
Теперь, дальше — интереснее. Плавно перехожу к моему «радиопередатчику»:
Я использую плату Марсоход3bis на чипе ПЛИС Altera/Intel MAX10. Плата имеет встроенный программатор на базе двухканального чипа FTDI. Причем один канал FT2232HL используется под JTAG (загрузка ПЛИС, отладка в SignalTap), а второй канал используется для передачи данных в плату, как последовательный порт.
К плате, прямо к двум цифровым пинам-выходам подключены два куска провода по 0,75 метра. Это антенна, «полуволновый вибратор». Без выходного аналогового фильтра на излучаемый диапазон, конечно, не хорошо, но сама антенна уже какой-то фильтр, да и мощность передатчика невелика…
Проект написан на языке Verilog HDL — всего-то пара десятков строк кода:
Весь проект для САПР Intel Quartus Prime можно взять на GitHub: github.com/marsohod4you/Fpga-PM-Radio.
В проекте есть PLL с двумя выходами c0 и c1, на каждом из них 100МГц. Выход c0 используется для тактирования всей схемы, а вот выход c1 — это и есть несущая 100МГц, частота моего «радиопередатчика» (FM-диапазон). Ее я и собираюсь модулировать по фазе.
Я собираюсь посылать сырой аудиофайл с компьютера в плату через последовательный порт. При формате данных 8 бит на одну аудиовыборку, моно, 22050Гц, наиболее удобна скорость последовательного порта 230400 бод. В самом деле, каждый байт при последовательной передаче имеет старт бит и один или два стоп бита. Если два стоп бита, то получается 11 передаваемых бит на байт данных. Значит 230400/11=20945 выборок в секунду. Это конечно не идеал, не 22050, но чуть-чуть похоже. Ну получится у меня звук немного ниже, чем нужно, мне для моих экспериментов не важно… Итак в проекте есть приемник последовательных данных.
Полученный из последовательного порта байт w_rx_byte внутри ПЛИС сравнивается с внутренней переменной (регистром) current_pll_phase. Разница меж ними — это и есть количество шагов по сдвигу фазы, которые нужно сделать в одну или другую сторону. Таким образом выполняется фазовая модуляция на выходе c1 у PLL.
Теперь второй вопрос. Предположим, что передатчик с фазовой модуляцией работает, а чем слушать?
Я исхожу из того, что ФМ и ЧМ непосредственно связаны друг с другом интегральным/дифференциальным законом. Мгновенная частота радиосигнала — это производная от его фазы. Производная синуса — это косинус. Вряд ли слушатель радиопередачи отличит их на слух (шутка). В общем, я решил попробовать передавать аудио файл моим «радиопередатчиком» с фазовой модуляцией, а слушать мою «радиопередачу» обычным FM-приемником. Я использую мобильный телефон с гарнитурой в качестве FM приемника.
Вот как это выглядит:
Удивительно, но передаваемая мной музыка устойчиво слышна в FM радиоприемнике мобильного телефона на расстоянии до 10-15 метров.
PS: В России 7 мая отмечается День радио. В 1895 году выдающийся русский физик и изобретатель Александр Попов в Санкт-Петербургском университете продемонстрировал созданную им первую в мире искровую беспроводную приемо-передающую радиосистему. В России этот факт был принят за точку отсчета начала радиосвязи.
Использование PLL
PLL широко используются при телекоммуникации, в компьютерах и других электронных устройствах.
Замечу, что в микросхеме серии MAX II, которая стоит на нашей первой плате Марсоход, не было встроенных PLL. Серия Altera MAX II слишком простая.
В микросхеме Altera Cyclone III, установленной на новую плату Марсоход2, есть встроенные PLL. Это очень важный компонент, так как с помощью PLL обычно в проекте создаются все частоты, нужные для дизайна. Именно поэтому нужно познакомиться с PLL поближе.
Рассмотрим принцип действия PLL.
Это было достаточно упрощенное изложение. Более подробно о работе PLL можно почитать в документации компании Альтера например про микросхему Cyclone III: Clock Networks and PLLs in the Cyclone III Device Family.
В этой Альтеровской документации, например, блок-схема PLL изображена вот так:
Вроде бы сложно, но по сути так же, как я нарисовал выше.
Теперь спустимся с небес на землю и посмотрим, как же эти PLL использовать в проектах для Cyclone III и в частности для платы Марсоход2.
А вот и самый главный экран визарда.
Здесь мы должны задать коэффициенты умножения и деления для исходной частоты, чтобы получилась нужная нам частота.
Коэффициенты можно задать самостоятельно вручную или задать желаемую частоту и Quartus II Wizard сам расчитает коэффициенты, которые нужно потом скопировать.
Вот, например, для работы первого проекта для платы Марсоход2 для видеорежима 1440×900 60Hz нужна по стандарту VESA частота 106.5Мгц.
Для каждого выxода PLL будет соответствующая страница визарда с настройками.
Вот пожалуй все первоначальные сведения для использования PLL в проектах для микросхему Altera Cyclone III.
Первые эксперименты со смешанным Litex+Verilog проектом для ПЛИС
В предыдущей статье мы начали осваивать построение шинно-ориентированных систем на базе среды Litex (которая всё делает на Питоне) с внедрением собственных модулей на Верилоге. Статья так разрослась, что практические опыты мы оставили на потом. Пришла пора провести их. Сегодня мы подключимся к VGA-монитору и поуправляем изображением, которое выдаёт модуль gpu, описанный в файле gpu.v, то есть, реализованный на языке Verilog. Управлять мы им будем через регистр команд, расположенный в блоке CSR, спроецированном на шину Wishbone. Все эти сущности, в свою очередь относятся к среде Litex. Инструменты для опытов мы тоже будем использовать штатные, Litex-овские. Приступаем!
Луч спит – развёртка идёт
Итак, мы проверяем пример, который формирует изображение через шнур VGA. Но что за константы в найденном на просторах сети коде? Они какие-то непонятные. Многие статьи просто ссылаются на готовые таблицы. Давайте я расскажу подробнее, откуда они взялись. Если я спрошу, сколько строк на экране в развёртке VGA, многие ответят, что 480. А если я спрошу, сколько строк было на экране отечественного телевизора, многие также ответят, что 625. Сейчас мы узнаем страшную тайну. Хоть эти цифры и не должны совпадать (первый ответ родом из шестидесятигерцовой NTSC, а второй – из нашей пятидесятигерцовой системы), но относятся к совершенно разным измерениям.
Дело в том, что 480 строк в VGA – это всего лишь видимые строки. А 625 строк в отечественной развёртке – это именно строки, передаваемые в сигнале. В чём разница?
Во-первых, в кинескопе лучу нужно время для обратного хода. Дойдя до нижней точки экрана, он должен пролететь назад. И ему нужно время, гораздо большее, чем время хода одной строки. У очень старых чёрно-белых телевизоров при максимальной яркости эти линии даже можно было разглядеть. Я в детстве так любил баловаться. Вот я нашёл на Гугле типичный рисунок:
Получается, что в сигнале должно быть предусмотрено время на этот процесс. Что в это время передаётся – не важно, так как луч здорового телевизора при этом погашен. Но время на сам процесс выделено быть должно.
То же касается и строчного обратного хода, хоть там время и намного меньше.
Дальше, аналоговые системы, да ещё и докварцевых времён, требовали некоторой подстройки. Вот таблица УЭИТ:
Белые тонкие линии на реперной области по краям экрана, должны были совмещаться с его границами. Что за линией – не должно быть видно. Ну, это на случай, если изображение будет немного плавать. А в сигнале эти точки присутствовать должны!
Вот и получается, что не все сигнальные строки (да и точки строк) являются видимыми. Из отечественных 625 строк, видимыми являлись только 576. А в американском стандарте, 480 строк – это видимая часть экрана при 525 строках в сигнале.
Шло время. Ушли в прошлое кинескопы. Их заменили матрицы, в которых нет ни электронного луча, ни его обратного хода, а картинка для них хранится в ОЗУ, поэтому непрерывность развёртки уже не требуется. Но для совместимости сигнал остался прежним. Мало того, если цикл статей не прервётся из-за отсутствия спроса, и мы дойдём до полностью цифрового HDMI, то увидим, что даже там есть невидимые участки растра! Поэтому, формируя картинку 640х480 точек, мы реально должны передавать по проводам область несколько большего размера.
Здесь я опустил массу эфирных штучек: замешивание синхроимпульсов в сам сигнал, чересстрочную развёртку и прочее, прочее, прочее. Мы сейчас просто посмотрели саму идею, откуда взялись эти лишние строки и точки внутри строк, привязав их к мониторным сущностям. Что же до точных цифр, то мы их вычислять не должны, так что все нюансы нам не потребуются. Есть масса статей, где приведены таблицы, сколько точек надо добавить к картинке. Причём на самом деле, добавленные значения измеряются в микросекундах, но внутри ПЛИС мы оперируем понятиями «точка» и «строка». Поэтому существуют таблицы либо калькуляторы, которые позволят нам узнать или вычислить эти дополнительные параметры именно в таких единицах измерения для каждого конкретного разрешения при конкретной частоте кадров.
Вот хорошая статья с картинкой, которая поясняет суть добавок к сигналу с привязкой к ПЛИС (но без того, что я описал выше): Учим iCEstick передавать видео-сигнал по VGA | Записки программиста (eax.me)
Оттуда есть ссылка на полезные таблицы martin.hinner.info/vga/timing.html
Уффф! Теперь становится понятно, что значат константы в найденном нами на просторах Интернета файле hvsync_generator.v. Сравните сами:
Кое-что не совпало, но находится в пределах погрешности.
Результаты работы онлайн-калькулятора, кстати, совпадают точнее:
Пара слов про файл hvsync_generator.v
Собственно, если мы уж заговорили про файл hvsync_generator.v, то с ним всё просто. Он формирует кадровый и строчный синхроимпульсы, согласно заданным параметрам. Чтобы изменить разрешение, надо эти параметры задать согласно требованиям, а также не забыть сменить частоту следования точек, о чём мы поговорим в следующем разделе. А вот так из базовых параметров рассчитываются рабочие:
Вот так формируются многократно используемые условия:
Ну, и просто работают счётчики строк и формирователи синхроимпульсов.
Обратите внимание, что отсюда импульсы выходят всегда в прямой полярности. Кажется, калькулятор допускает это дело:
Что у нас с тактовой частотой
В прошлый раз я уже упоминал, что нам предстоит разобраться с тактовой частотой. Только что из таблиц мы поняли, что нам необходима частота, близкая к 25 МГц. А в коде на Питоне я определял частоту вот так:
Вроде, я использую сущность clk. Но давайте не будем долго рассуждать, а посмотрим сгенерированный Верилоговский файл:
То же самое текстом.
Погодите, какой ещё sys_clk? Мы же просили просто clk… Потому что нам повезло, у нас на плате припаян генератор на 25 МГц. Но ещё есть шанс, что это какое-то хитрое именование… Ну-ка… Ищем, где этот сигнал формируется…
assign sys_clk = basesoc_crg_clkout0;
То же самое текстом.
Последние сомнения развеяны! Перед нами самые что ни на есть 60 мегагерц. А нам надо 25! И они в системе есть, надо только правильно поправить Питоновский скрипт. Давайте я суну нос в описание генератора тактовых сигналов в уже хорошо нам знакомом файле Litex\litex-boards\litex_boards\targets\colorlight_5a_75x.py.
Дело ясное, что дело тёмное. Вот я вижу clk. Вроде как, это вход… Короче, кончаем пытаться разбираться по-сухому! Зря я что ли создавал проект в Visual Studio? Давайте попробуем трассернуть и посмотреть, где можно взять сигнал, не дожидаясь милости от природы! Идём в код, который написали в прошлый раз, и ставим точку останова здесь:
Запускаем проект на исполнение, и сначала, чтобы настроить глазомер, смотрим значение той переменной, которая заносится сейчас:
А теперь я нахально ставлю курсор на поле cd_sys и начинаю ездить по всем полям этой переменной, пытаясь найти что-то, похожее на то, что я уже видел, но содержащее что-то, похожее на вход PLL. Не найдя ничего приличного, сдвинусь левее… И так, осматривая реальную систему, когда она уже запущена, постепенно нахожу параметр, очень похожий по значению. Давайте я даже сделаю анимированный gif.
В общем, в переменной soc.crg.pll есть замечательное поле clkin_freq, равное 25000000 (это наши 25 мегагерц, заданные в герцах), а поле clkin похоже на описание ножки… Вот давайте и заменим строку:
Собираем, запускаем, проверяем – нам повезло! Мы угадали с первой попытки. Трассировка – великая вещь! А кто тянется ставить минус за «низкий технический уровень», приговаривая, что такое надо находить в справочниках – попробуйте, найдите и дайте ссылочку, а также путь, как нашли. А потом поговорим. Я долго искал. Трассировка же всё выявила за 5 минут. Поэтому и пропагандирую её использование.
То же самое текстом.
assign basesoc_crg_clkin = clk25;
Уффф. С этим разобрались! Да здравствует живая трассировка! Проверяем на мониторе? Давайте не будем торопиться. Подключимся сначала к логическому анализатору и проверим картинку там.
Выявляем проблему там, где не ждали
Итак. Собираем получившийся проект, загружаем его в плату, запускаем, смотрим на анализаторе. С виду — всё красиво. Видны кадровые синхроимпульсы, видны строчные синхроимпульсы, видны отображаемые точки:
Всё? Проверяем на мониторе? Не спешите! Измеряем частоту кадровых импульсов (на рисунке выше видна стрелочка между парой из них). Получаем примерно 120 Гц.
Строчная частота тоже удвоенная. Ох, и посидел я с экспериментами. Ну разумеется, во всём была обвинена неверно установленная частота! Но не тут-то было! Верная она! 25 МГц честные приходят. Ларчик просто открывался. Файл gpu.v я нашёл в Интернете и, так как он простенький, доверял ему всецело. А зря. Вот как он выглядит:
То же самое текстом.
Классно, да? Обещаем 640 точек по горизонтали, а в модуль развёрток передаём всего 320. Вот он быстрее и работает! Потому что у автора кварц был на 12 МГц, вот он всё и пересчитал под такую частоту. Короче, удаляем все эти параметры, благо внутри модуля развёрток есть хорошо описанные! Остаётся:
Вот и верь после этого людям! Доверяй, но проверяй!
Уффф. Теперь можно экспериментировать с монитором. Как мы будем к нему подключаться?
Добавляем VGA разъём к плате
Единственно, что у нашей платы выходы пятивольтовые, так что резисторы в их схеме надо заменить на 470 Ом. А так – я скопирую схему включения оттуда:
Но самое ценное там – конструктив. Вот как это сделано на той странице:
Это же гениально! А этот разъём нужно подключить Ардуиновскими проводочками к нашей макетке. Красный и синий провода – заземлить (благо земляных ножек у нас много), а зелёный и синхросигналы – подать на контакты, которые мы недавно назначили. Кстати, обратите внимание, как неудобно их искать! Вот наш список использованных gpio линий:
Сначала надо посмотреть, к каким контактам разъёма они подключены:
Затем – каким цепям соответствуют:
То же самое текстом.
На самом деле, язык Питон позволяет всё это оформить более наглядно. Так что если будем развивать тему, то в следующей статье мы как раз наведём красоту. Пока же – пользуемся тем, что найдено в минималистичных примерах.
С моими кривыми руками получилась вот такая штука:
Подключаем плату к монитору, заливаем в неё «прошивку» и видим такую красоту:
Начинаем эксперименты
Наконец-то мы подготовили всю инфраструктуру для основной части эксперимента. Мы же всего-навсего собирались записывать что-то в порты Verilog модуля, пользуясь механизмом CSR. Приступаем!
До сих пор мы работали с каталогом PyTest2\build\colorlight_5a_75b\gateware. Теперь перейдём в PyTest2\build\colorlight_5a_75b\software. Там нас интересует файл с говорящим именем
В текущей нашей реализации информации там самый минимум. Смотрим:
То же самое текстом.
Итак, нами было создано четыре регистра, в каждом из которых используется по 16 бит, а 16 бит – зарезервированы. Можно ли объединять данные в одном регистре, а если да, то как – тема для отдельной статьи. Также в отдельной статье можно рассмотреть, как сделать код на Питоне самодокументирующимся. Чтобы из него автоматически вставлялись бы подробности в этот заголовочный файл. Пока – просто запомнили регистры. Да на самом деле одного регистра хватит, X1. У него смещение +4. А относительно чего смещение? Это нам подскажет содержимое файла mem.h:
Как замечательно! Базовый адрес CSR равен нулю.
Напомню, в прошлой статье я указывал опции сборки системы:
Для доступа к шине через сеть, нам нужна утилита wishbone-tool. Готовую сборку под свою ОС можно скачать здесь:
Распаковываем и пишем по адресу шины 4 значение 600 при помощи команды:
Это я параметр X2 сделал равным шестистам (при разрешении экрана 640х480). Прямоугольник стал таким:
И, собственно, всё. Мы убедились, что всё проецируется на шину, а мы имеем возможность управлять значениями через регистр команд…
Упрощаем себе жизнь
Как-то даже обидно, так много готовились и так мало экспериментировали. Давайте, что ли проведём один маленький эксперимент по упрощению себе жизни.
В файловой системе, на уровне скрипта, который мы делали в прошлой статье, добавляем каталог scripts
А в сам наш многострадальный Питоновский скрипт вставляем буквально одну строчку. Я покажу её вместе с теми, между которыми она помещена:
То же самое текстом.
Прогоняем скрипт, и в каталоге Scripts возникает новый файл csr.csv. Вот его начало:
Теперь нам не надо ни смотреть никакие заголовки, ни даже скачивать wishbone-tool. Поместим в каталог scripts файл moverect.py со следующим содержимым:
Теперь в отдельном терминале идём в каталог Litex\litex\litex\tools… Вот его содержимое для справки:
И там запускаем отладочный сервер строкой:
Оставляем этот терминал. Он будет обеспечивать нам сервер, дающий сетевой доступ к шине Wishbone из любых Питоновских скриптов. Не спрашивайте, зачем так сложно. Я не реализую эту систему, а учу, как пользоваться готовой.
Теперь в основном терминале можно запустить и только что написанный скрипт. Он будет работать через этот сервер. Итак, пишем:
python moverect.py localhost
И гипнотизируем экран, по которому слева направо ездит квадрат. В этом опыте мы не смотрели никаких констант. Мы просто пользовались символическими именами, взятыми из файла csr.csv. Плюс к тому, мы не использовали никаких инструментов, не входящих в поставку Litex. Правда, сервер в отдельном окне нам запустить пришлось. Но этот сервер организован на Питоновском скрипте, входящем в основной комплект Litex.
Немного философии
Давным-давно, у меня БК-шка была подключена к ламповому чёрно-белому телевизору. Потом мне выдали ламповый цветной, с более устойчивым растром. И я сказал, что стало намного лучше. Потом я раздобыл монитор МС6105 с антибликовым кинескопом. И сказал, что стало намного лучше. Шло время. При смене ЭВМ МС6105 сменился на Samsung SyncMaster 3NE. И я сказал, что стало намного лучше, так как нет того пятидесятигерцового мерцания в глазах, даже когда я просто хочу заснуть. Потом была чреда других мониторов с кинескопами, каждый из которых создавал свои проблемы, которая завершилась покупкой первого ЖК монитора. И я сказал, что стало намного лучше. Никакого мерцания!
Дальше монитор сменился на новый, имеющий кабель DVI. И я бы даже не сказал, что стало намного лучше. Но когда через несколько месяцев пришлось поработать с VGA кабелем – я понял, что к хорошему быстро привыкаешь. В аналоговом кабеле немного гуляют вертикальные линии, в аналоговом кабеле «кипит» однотонное изображение. Это дико раздражает. Особенно когда привык к чёткой цифровой картинке.
Цифра – это цифра, аналог – это аналог. До цифровой революции ему не было замены. Сейчас – есть. Поэтому руку с VGA мы набили, а вот пользоваться этим – лично я не собираюсь. Мне нервное спокойствие дороже. Если цикл будет востребован – сделаем и HDMI выход, благо я упоминал макетку с ПЛИС Lattice, содержащую такой разъём. А VGA – это просто красивый пример, где можно быстро сделать аппаратуру и на простых, удобных сущностях освоить вывод в регистр команд.
Заключение
Мы испытали работу с регистрами команд при помощи утилиты wishbone-tool (по абсолютным адресам) и при помощи штатных средств из поставки Litex (для чего нам пришлось сделать символический файл csr.csv).
Финальный пример, разобранный в статье, можно посмотреть тут.
- Что значит оранжевый флаг с черной полоской
- Что значит плоскостопие 2 степени