Изрядно намучившись в первой версии ГЛИНа с счетчиком SN74HC590AD, я решил поправить все его баги. Но к сожалению, готовой детальки которая из тактового сигнала сформировала-бы нужные мне сигналы управления, нет. Ну нет… так нет… значит ее надо создать!
И тут на помощь долбанутому электро-хомячку, приходит программируемая логика(ПЛИС, CPLD).
Основная проблема классического счетчика типа SN74HC590AD состоит в том, что бит счета может принимать только состояния лог. единицы и лог. нуля со скважностью 50%. А поскольку момент применения нового значения ЦАП и момент его загрузки должны быть чётко разделены во времени, то приходилось на лог.0 обновлять ЦАП, а на лог.1 загружать в него новые данные. Если с обновлением ЦАП проблем нет, оно происходит за время менее 100 нс, то загрузка нового значения в ЦАП требует не только чтобы МК успел отреагировать на прерывание, но и успел передать большой пакет данных по относительно медленному SPI. И получалось, что из за счетчика, примерно 50% времени система просто простаивала, а в оставшиеся 50% сломя голову мчалась загружать новые данные в ЦАП. И если вдруг не успеет загрузить, то это будет эпический фейл.
Правильным методом является подача быстрой и короткой команды обновления ЦАП(LDAC=лог.0) на протяжении 100-200нс, после чего сразу инициируется прерывание МК на загрузку новых данных(100нс). Это позволит загружать данные не в окне 50%, а во временном окне 99.9%, что серьезно увеличивает вероятность успешной загрузки.
Еще на этапе проектирования под эту цель на плату синтеза времени была заложена ПЛИС-ина Xilinx XC9572XL. Я тогда еще не знал точно как буду это поведение реализовывать, но мне показалось что 72-х программируемых макро-ячеек должно хватить для этой задачи.
Эта ПЛИС-ина уже изрядно устарела, т.к. производится с 98-го года, по этому, на этих выходных я успел изрядно поебаться со средой разработки под нее. Ксайлинксы плюнули на простые ПЛИС-ы и больше не поддерживают среду разработки Xilinx ISE, по этому она работает более-менее нормально только на Windows XP и Windows 7. Несмотря на то, что потуги адаприровать Xilinx ISE 14.7 под Windows 10 всё-таки были, они не удались. По этому ее пришлось запускать на оригинальной Windows 7 в виртуальной среде.
Попытки набросать код на VHDL тоже не увенчались большим успехом, по этому я решил по старинке, накидать логику работы в схемотехническом редакторе Xilinx ISE, благо ПЛИС-ине пофигу из какого источника будет синтезироваться ее прошивка, и схемотехнику синтезатор столь-же нормально употребляет, как и VHDL/Verilog код,
Получилось такое:
На регистре-защелке LD4 и дешифраторе D4_16E собран запоминающий декодер команды управления. Который преобразует входное 4-х битное число n в число 2n, и запоминает его. Если поступает число “0000”, то работа устройства запрещается. Далее, это число загружается в 16-ти битный счетчик CB16X1 настроенный на “счет вниз” импульсов с DDS и автоматический перезапуск при достижении нуля. При достижении нуля, этот счетчик инициирует спадающий фронт сигнала LDAC и запускает вспомогательный счетчик CB2CE который нужен для формирования временных интервалов активности сигналов LDAC и IRQ.
На счетчике CB2CE, дешифраторе D2_4E и небольшом количестве простой логики собран формирователь подачи последовательности сигналов:
- Активный низкий уровень сигнала LDAC на протяжении от 100нс до 200нс.
- Активный высокий уровень сигнала CPU_IRQ на протяжении 100нc.
Причем логика построена таким образом, чтобы фронт сигнала LDAC был четко привязан к фронту сигналов DDS, чем обеспечивается точная синхронизация этого сигнала с запрограммированной шкалой времени в DDS.
После небольшой оптимизации и причесывания схемы, ее синтез показал, что она заняла менее 40% ресурсов ПЛИС-ины. И это при том, что она выполняет все мои “хотелки”. И она не только формирует нужные сигналы управления, но и по сути является перепрограммируемым счетчиком, коэфицент деления которого МК может изменить в любой момент, без каких-либо “пере-прошивок”.
Ну чтож, будем применять! Давно хотел расчихлить свои запасы ПЛИС-ин… вот как раз подвернулась отличная возможность!