Как поставить плис altera вместо плис 5576хс4т
Перейти к содержимому

Как поставить плис altera вместо плис 5576хс4т

  • автор:

ПЛИС — мои первые шаги

Недавно я все-таки сделал свой первый шаг к ПЛИС и призвал вас за собой. Мое фанатическое увлечение ПЛИС и идея о том, что ПЛИС является лучшей платформой для создания любых устройств приобрела религиозный характер. Моя секта ПЛИСоводов проповедует полный отказ от микроконтроллеров, а особо экстремистская ветвь проповедует отказ не только от софт процессоров, но и вообще от последовательных вычислений!

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

Эта статья для новичков. В ней я опишу типичные проблемы, вопросы, заблуждения, ошибки, которые могут появиться в самом начале обучения (потому что они появились у меня). Однако, контекст статьи ограничен тем, что разработка ведется на ПЛИС от Altera в среде Quartus на языке Verilog.

Трудно жить ничего не делая, но мы не боимся трудностей!

Одна из причин, по которой многие не начинают изучать Verilog вот прямо сейчас — это отсутствие реальной ПЛИС. Кто-то не может заказать, потому что дорого, а кто-то потому, что не знает, что именно взять (вопрос выбора рассмотрен в предыдущей статье). Кому-то ПЛИС пока еще едет по почте.

Но в своих разработках я пришел к тому, что наличие реальной ПЛИС мне требуется уже на финальном этапе разработки, когда нужно протестировать проект «в железе». Речь о том, что бóльшую часть времени я провожу в отладке своего кода с помощью симуляторов.

Поэтому мой совет: отсутствие ПЛИС — это не повод бездействовать. Пишите и отлаживайте модули для ПЛИС в симуляторах!

Симулятор для Verilog

Итак, чем же развлечь себя скучными длинными рабочими днями (если они таковыми являются)? Конечно же освоеним ПЛИС! Но как же затащить на работу целую среду разработки от Altera, если она весит 3 ежемесячных рабочих лимита интернета? Можно принести на флешке! Но если предметом изучения является Verilog, то можно ограничиться блокнотом, компилятором IcarusVerilog, а результат смотреть в GTK Wave.

Попробовать прямо сейчас

Для начала работы в среде Windows, достаточно скачать по ссылке http://bleyer.org/icarus/ файл установки iverilog-20130827_setup.exe (development snapshot) [11.2MB]

Установка трудностей не вызывает. Теперь немного забежим вперед: создадим папку для проекта и в ней пару файлов с пока что не понятным содержимым:

Файл-модуль с кодом для тестирования модулей — bench.v

`timescale 1ns / 100 ps module testbench(); reg clk; initial begin $display("start"); $dumpfile("test.vcd"); $dumpvars(0,testbench); clk 

В файле bench.v описан тестовый модуль testbench, в нем создан тестовый источник сигнала clk (меандр). Другие модули будут создаваться в отдельных файлах, либо логику можно протестировать сначала в этом модуле, а потом вынести в отдельный модуль. Потом в модуль testbench будут добавляться экземпляры этих модулей, где мы будем подавать на их входы тестовые сигналы и получать из них результаты. Из модулей мы можем строить иерархию, думаю это понятно всем.

BAT Файл, который скомпилирует и просимулирует главный модуль, добавив другие модули из текущей папки - makev.bat

iverilog -o test -I./ -y./ bench.v vvp test pause

После запуска этого файла мы увидим на экране текст, заданный в $display (это отладочный вывод), значение же сигналов и регистров схемы будут находиться в файле test.vcd. Кликаем по файлу и выбираем программу для просмотра — GTKWave (в моем случае D:\iverilog\gtkwave\bin\gtkwave.exe). Еще пару кликов и мы увидим наш clk.

Практически, каждый свой новый модуль я создаю в блокноте и отлаживаю IcarusVerilog. Следующим этапом после такой отладки идет проверка модулей в Quartus. Хотя в Quartus тоже есть свой симулятор, но я его использую реже. Причина в простоте обновления кода и просмотра результата в IcarusVerilog: сохранил изменения в файле, запустил BAT, нажал кнопку «обновить» в GTKWave — все! В ModelSim для этого требуется чуть больше движений, но он тоже не плох, особенно на данных сложных структур.

После симуляции наступает пора запуска Quartus. Но загружать прошивку в ПЛИС пока еще рано. Нужно убедиться, что божественная вычислительная машина правильно поняла, какую схему мы хотим получить, изложив свои мысли в виде Verilog'а.

Разница между симуляцией и работой в реальном железе

Первое время я, подобно слепому котенку, бился головой об косяки. Казалось бы правильный код, не работает совсем, либо работает не так, как предполагаешь. Либо вот только что работал, а теперь внезапно перестал!

Пытливый котенок, начинает искать взаимосвязь между своими действиями и результатом («голубиное суеверием»).

Самая большая драма

Ниже будет список странностей, но сначала самая большая драма, с которой я столкнулся: не все конструкции Verilog могут быть синтезированы в железе. Это связано с тем, что на Verilog описывается не только аппаратная логика, которая объединяется в модули и работает в железе. На том же Verilog описываются тестовые модули, которые объединяют тестируемые модули, подают на их входы тестовые сигналы и в целом существуют только для проверки на компьютере. Изменение значений сигналов во времени задается конструкциями, содержащим знак "#" в тексте Verilog. Такой знак означает задержку во времени. В примере выше именно так генерируется сигнал CLK. И я грешным делом думал, что таким же образом внутри настоящей ПЛИС можно генерировать, к примеру, последовательность бит для отправки сообщения по RS232. Ведь на вход ПЛИС подан сигнал от генератора 50 МГц! Может быть она как-то на него ориентируется. Как оказалось, я не единственный, кто надеялся на чудо: 1, 2, 3, 4, 5. Реальность как всегда оказывается более суровой: ПЛИС это набор логики и временная задержка в ней может появиться при использовании счетчика, значение которого увеличивается тактами от генератора до заданной величины, либо как-то иначе (но всегда аппаратно).

Список найденных странностей

Удивительные вещи, однако, прочтение книг [1,2] проливает свет на эту бесовщину. Более того, обретается благодать.

Если обозначить reg, то не факт, что он будет создан

Как я пришел к проблеме? Допустим есть один модуль, на вход которого я должен подавать значение (по типу параметра). В перспективе, этот параметр должен будет изменяться во времени в зависимости от каких-то внешних событий. Поэтому значение должно хранится в регистре (reg). Но реализация приема внешних событий пока не реализована, поэтому я регистр не меняю, а просто задаю ему изначальное значение, которое в дальнейшем не меняется.

//задаю 8 битный регистр reg [7:0] val; //инициирую его значением initial val  

Казалось бы в чем подвох? В императивных ЯП мы часто задаем переменные в качестве констант и потом ни разу их не меняем и все работает. Что же мы видим в железе?

Во-первых, мы не видим регистра. Во-вторых, на вход модуля подано 8'hFF вместо наших 8'd0240! И этого уже достаточно для того, чтобы схема заработала не так, как мы планировали. То, что регистра нет — это нормально. В Verilog можно описывать логику разными способами, в то же время, синтезатор всегда оптимизирует аппаратную реализацию. Даже если написать блок always и в нем работать с регистрами, но при этом выходное значение всегда будет определяться входными, то применение регистра тут окажется лишним и синтезатор его не поставит. И наоборот, если при каких то значениях входных данных выходное значение не меняется, то тут никак не обойтись без регистра-защелки и синтезатор его создаст. (Книга 1 стр. 88-89). Что из этого следует? Если мы начнем менять значение регистра, например, в зависимости от нажатии кнопок, то геристр уже будет создан и все будет работать так, как нужно. Если же окажется, что кнопки ничего не меняют, то синтезатор его опять же выкинет и опять все поломается. Что же делать с константой? Нужно подать ее напрямую на вход модуля:

bbox bb_01(.in_data(8'd0240), .out_data(out_data));

Теперь на входе модуля мы имеем правильное значение:

Остается загадкой, почему при сокращении регистра, его значение в initial не подставляется на вход модуля.

Размерность wire лучше задавать самому.

При разработке в среде Quartus, допускается не задавать линии wire заранее. В этом случае они будут созданы автоматически, но об этом будет выдано предупреждение (warning). Проблема заключается в том, что разрядность wire будет 1-бит, а если порты будут иметь разрядность больше 1 бита, то значение не будет передано.

bbox bb_01(.in_data(8'd0240), .out_data(int_data)); other_bbox bb_02(.in_data(int_data), .out_data(out_data));

Предупреждение

Warning (10236): Verilog HDL Implicit Net warning at test.v(15): created implicit net for "int_data"

Результат:

Как видим, один бит подключен, а остальные 7 бит получаются не подключены (NC). Чтобы такой проблемы не было — нужно создать wire самостоятельно. Не зря компилятор IcarusVerilog выдает не warning, а ошибку, если wire не задан заранее.

wire [7:0] int_data; bbox bb_01(.in_data(8'd0240), .out_data(int_data)); other_bbox bb_02(.in_data(int_data), .out_data(out_data));

Компьютер не будет лазать по модулям, смотреть, какая разрядность портов. К тому же, разрядность может оказаться разной, а на вход модуля или с выхода берутся не все биты, а какие-то определенные.

Нельзя использовать выход логической функции, в качестве тактового сигнала

Иногда в проекте требуется снизить тактовую частоту, либо ввести временную задержку в N тактов. Новичёк может применить счетчик и дополнительную схему определения достижения счетчиком определенного значения (схема сравнения). Однако, если напрямую использовать выход со схемы сравнения в качестве тактового, то могут возникнуть проблемы. Это связано с тем, что логической схеме требуется некоторое время для установки стабильного значения на выходе. Эта задержка смещает фронт сигнала, проходящего через разные части логической схемы относительно тактового, в итоге получаются гонки, метастабильность, асинхронщина. Даже довелось однажды услышать реплику об этом в качестве критики ПЛИС: «с ПЛИС постоянные проблемы — гонки сигналов».

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

Для полного понимания, стоит прочитать Altera handbook на предмет «clock domains», а так же разобраться с тем, как задавать параметры рассчета TimeQuest для проекта.

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

А что, если я хочу пойти против системы?

Порядок разработки и поведение синтезатора схем подводит нас к выводу о том, что же такое ПЛИС на аппаратном уровне. Это синхронные схемы. Поэтому, среди целей синтезатора — уложиться во временные интервалы. Для этого он, к примеру, упрощает логические выражения, выбрасывает из синтеза части схем, которые не используются другими схемами и не привязаны к физическим выводам ПЛИС. Асинхронные решения и аналоговые трюки не приветствуются, потому что их работа может быть непредсказуемой и зависеть от чего угодно (напряжение, температура, техпроцесс, партия, поколение ПЛИС), а поэтому не дает гарантированного, повторяемого, переносимого результата. А всем же нужен стабильный результат и общие подходы к проектированию!

Но что же делать, если вы не согласны с мнением синтезатора о том, что нужно выкидывать неизменяемые регистры, сокращать логические схемы? Как быть, если хотите делать схемы с асинхронной логикой? Нужна тонкая настройка? А может быть вы сами хотите собрать схему на низкоуровневых компонентах ПЛИС? Легко! Спасибо разработчикам Altera за такую возможность и подробную документацию!

Как это сделать? Можно попробовать графический редактор схем. Вы, возможно, слышали о том, что Quartus позволяет рисовать схемы? Можно самому выбрать стандартные блоки и соединить их. Но это не решение! Даже нарисованная схема будет оптимизирована синтезатором, если на это будет возможность.

В итоге мы приходим к старой истине: если ничего не помогает — прочитайте инструкцию. А именно «Altera Handbook» часть под названием «Quartus II Synthesis Options».

Начнем с того, что описывая архитектуру на Verilog определенным образом, можно получить определенный результат. Вот примеры кода для получения синхронного и асинхронного RS триггера:

//модуль синхронного RS триггера module rs(clk, r, s, q); input wire clk, r,s; output reg q; always @(posedge clk) begin if (r) begin q 

В этом случае получится синхронный триггер.

Если не брать во внимание тактовый сигнал и переключаться в зависимости от любых изменений r и s, то в результате получится элемент с асинхронной установной значений — защелка (latch).

//пример модуль асинхронного RS триггера module ModuleTester(clk, r, s, q); input wire clk, r,s; output reg q; always @(r or s) begin if (r) begin q 

Но можно пойти еще дальше и самому создать защелку из примитива (примитивы доступны так же, как любой другой модуль Verilog):

module ModuleTester(clk, r, s, q); input wire clk, r,s; output reg q; DLATCH lt(.q(q), .clrn(~r), .prn(~s)); endmodule

В итоге, весь «обвес» на входе защелки, который синтезатор посчитал ненужным, исчезнет и мы получим именно то, что хотели:

Список существующих примитивов можно посмотреть на сайте Altera.

А теперь небольшой пример про асинхронность и сокращение. Задумал я, к примеру, сделать генератор по тому же принципу, как это было принято делать раньше, но только на ПЛИС:

Но для увеличения периода я возьму 4 элемента, но только один из них будет с инверсией:

module ModuleTester(q); output wire q; wire a,b,c,d; assign a = b; assign b = c; assign c = d; assign d = ~a; assign q = a; endmodule

Но получается сокращение (1 элемент, вместо четырех). Что логично. Но мы то задумывали линию задержки.

Но если поставить синтезатору условие, что линии a,b,c,d не сокращать, то получится то, что мы задумали. Для подсказки синтезатору применяются директивы. Один из способов указания — это текст в комментарии:

module ModuleTester(q); output wire q; wire a,b,c,d /* synthesis keep */; // ^^^--- это директива для синтезатора assign a = b; assign b = c; assign c = d; assign d = ~a; assign q = a; endmodule

А вот и результат — цепочка из четырех элементов:

И это далеко не все! Оставлю на радость самостоятельного изучения: работу с case и директиву для реализации его в качестве RAM/ROM или логической схемой; работу со встроенными блоками памяти (RAM/ROM); выбор реализации умножения — аппаратным умножителем или логической схемой.

Выводы

Цитируя статью, хочу сказать, что «ПЛИС-ы / FPGA — не процессоры, «программируя» ПЛИС (заполняя конфигурационную память ПЛИС-а) вы создаете электронную схему (хардвер), в то время как при программировании процессора (фиксированного хардвера) вы подсовываете ему цепочку написанных в память последовательных инструкций программы (софтвер)».

Причем, как бы мне изначально не хотелось сильно не привязываться к конкретной железяке, но иногда, чтобы более эффективно и экономно использовать ресурсы, приходится работать на низком уровне. Часто этого можно избежать, если правильно разрабатывать синхронные схемы. Однако совсем забыть, что это железо — не получается.

Еще хочу сказать, что фанатизма и максимализма со временем поубавилось. Сначала я стремился все действия и рассчеты на ПЛИС выполнять за один такт, потому что ПЛИС это позволяет. Однако, это требуется далеко не всегда. Вычислительные ядра софт процессоров мне пока не довелось использовать, однако применение state machines для работы по определенному алгоритму — стало нормой. Вычисления не за 1 такт, временные задержки в несколько тактов из за применения конвееров — это норма.

Книги, которые мне очень помогли

1. В.В. Соловьев — Основы языка проектирования цифровой аппаратуры Verilog. 2014
2. Altera: Quartus II Handbook
3. Altera: Advanced Synthesis Cookbook
4. Altera: Designing with Low-Level Primitives

Статьи по тематике ПЛИС, Altera и Verilog
PS

Спасибо всем, кто прочитал до этого места. Надеюсь, что что с этой статьей принцип работы и использования ПЛИС станет хотя бы немного ближе и понятнее. А в качестве примера применения в реальном проекте, я готовлю к выпуску на этой неделе еще одну статью. Проект Функциональный DDS rенератор на ПЛИС

  • Программирование
  • FPGA
  • Программирование микроконтроллеров

О Воронежских ПЛИС

��32.1 K 01:56 - 4/Июн/22 nabbla (1 год 9 месяцев)

Об Эльбрусах и Байкалах разговоров много, а о ПЛИС как-то молчок. А между тем, их у нас делают, причём именно на территории России. Уже имел дело с 5576ХС4Т1 и 5578ТС104, листал ТУ на их "соседей", попытаюсь в общих чертах описать, что за зверь такой.

Изготовителем считается ВЗПП-С, Воронежский Завод Полупроводниковых Приборов - Сборка. Но как указывает последнее слово, завод этот занимается в первую очередь корпусированием кристаллов и отгрузкой готовой продукции. Изготовитель кристаллов: зеленоградский Микрон.

Злые языки говорят, что мы просто купили в своё время лицензию на старые, снятые с производства Альтеровские ПЛИС, и теперь бездумно их клепаем у себя. Доля правды в этом есть, но если присмотреться, всё немного не так!

5576ХС4Т1 в пластиковом корпусе на отладочной плате:

Отладочная плата для ХС4

Флэш-конфигуратор зато в металлокерамике, всё как положено. Хотя в космос ему нельзя, туда однократно-программируемый нужен, флэш-память очень уязвима. Сама 5576ХС4Т бывает в металлокерамике, а бывает и в пластике, как здесь.

Эта ПЛИС, прямо согласно ТУ, является функциональным аналогом Altera Flex10ke, на 9984 логических элемента (ЛЭ), с 24 блоками внутренней памяти (БВП, они же EAB, Embedded Array Block) по 512 байт каждый.

Чтобы её "прошить", прямым текстом просят скачать Quartus II версии НЕ ВЫШЕ 9.0 sp2, поскольку начиная с 9.1 поддержка серии Flex10k прекращается. Нужно выбрать device: EPF10K200SRC240-3. И когда проект будет написан и отсинтезирован, его можно будет закачать НАПРЯМУЮ, прямо "не выходя из Квартуса". Разве что ноги надо назначать согласно таблицы из ТО.

Так что да, на самый первый взгляд это точный клон. Вот только питающие напряжения не совпадают! У Flex10ke ядро питается от 2,5 вольт, а у 5576ХС4Т: от 1,8 вольт. И это даёт свой результат: если посмотреть на формулу для расчёта потребления, там есть коэффициент K, в мкА/МГц, и он в Flex10ke и 5576ХС4Т отличается ЗНАЧИТЕЛЬНО, наша ПЛИС, как ни странно, более "холодная". И могу это подтвердить: сколько я её не ковырял, больше 300 мА потребление ВСЕЙ ПЛАТЫ никогда не шло, и на ощупь она всегда остаётся холодной.

Далее, у нашей ПЛИС, в сравнении с "оригиналом", расширенные возможности ввода-вывода: добавлена "подтяжка к земле", "подтяжка к VCC" и Bus-Hold (если с шины "все ушли", сохранить последнее значение, не позволить ей висеть в воздухе, т.к в таком режиме у КМОП-входов начинаются сквозные токи, нехорошо). Это заметно уже при включении ПЛИС: у "оригинала" просто все ножки повисали в воздухе, а здесь подтягиваются к VCC. Мне сразу вспоминалась приборная панель автомобиля, где при повороте ключа зажигания для начала вспыхивают все табло, "проверить, что лампочки не перегорели". Впрочем, мои соседи умудрялись себе прибор спалить из-за такого поведения, надо это иметь в виду, когда схему проектируешь. А чтобы сконфигурировать дополнительные возможности, одним Квартусом уже не обойдёшься, нужно купить комплект программ от КТЦ Электроника и "скормить" им выходной бинарный файл Квартуса, и уже отметить всё что нужно.

Ещё из нововведений: режимы Verification и Scrubbing. Первый непрерывно гоняет конфигурационную ПЗУ и проверяет, по-прежнему ли прошивка ПЛИС соответствует тому, что лежало в ПЗУ. Второй не просто проверяет, но и "перезаписывает" сбойные места, прямо на лету. И то, и другое, видимо, предназначается для работы в условиях космических лучей, чтобы при сбоях ячеек статической памяти восстановить функционирование. Честно говоря, так до сих пор не довелось проверить это "в деле", да и конкретно 5576ХС4Т не такая уж стойкая: дозу она воспримет неплохую, но защита от ТЗЧ в ТУ "не нормирована", что вынуждает ставить отдельно защиту от тиристорного эффекта. Я очень скептично к ней относился, разве ж можно почувствовать, что из 9984 ЛЭ один вдруг "защёлкнулся"? Оказывается, можно, по крайней мере, на испытаниях оно срабатывало.

Так что о бездумном копировании говорить не приходится. Уже на этой ПЛИС был опробован переход на другой техпроцесс (сниженное напряжение и энергопотребление) и добавление некоторых "пряников". До сих пор не понимаю, как при этом удалось оставить бинарную совместимость в плане прошивки, возможно, нашли незадействованные "заделы", и, наконец, применили. При этом возникла ещё одна странность, характерная именно для 5576ХС4Т: в режиме конфигурирования она невосприимчива к JTAG'у. Немножко седых волос добавило: только начал с этой отладочной платой разбираться, подключил JTAG, увидел два устройства в цепочке (ПЛИС и конф. ПЗУ), но ни одно прошиваться не желает, ругается последними словами. Как оказалось, ПЛИС будет прошиваться, только если из ПЗУ в неё загрузим хоть ЧТО-НИБУДЬ, а вот при пустой ПЗУ она застревает в какой-то прострации. А для ПЗУшки нужно было конвертировать файл под EPC4.

Все последующие ПЛИС отличаются уже сильнее, и бинарной совместимости не имеют, там без преобразования в специальной программе не обойдёшься.

5576ХС6Т: дофига радстойкая, как по дозе, так и по ТЗЧ. Но размер поменьше, 2880 ЛЭ и 5 килобайт внутренней памяти.

5576ХС7Т ещё мельче, 1728 ЛЭ и 3 килобайта памяти, и содержит внутри себя конфигурационную однократно программируемую ПЗУ. Сценарий такой: поначалу отлаживаемся по JTAGу, каждый раз теряя "прошивку" после пропадания питания, а как только доведём прошивку до ума - поставим её "насовсем". Такого в серии Flex10ke точно нет! Разве что MAX3000 в чём-то похож, но MAX это всёж CPLD на макроблоках, не тот калибр. Впрочем, есть у 5576ХС7Т подлянка: нельзя инициализировать блоки внутренней памяти! В других ПЛИС можно, чтобы после конфигурации в памяти лежали заранее заданные нами значения, которые мы описали в файлах .mif (Memory Initialization File) или .hex, а здесь, увы и ах - будет лежать мусор.

На этом серия 5576 заканчивается, и начинается "новое поколение", ПЛИС 5578ТСxxx.

Я присматривался к 5578ТС034, улучшенный аналог 5576ХС7Т: 4992 ЛЭ и 6 килобайт памяти (если не ошибаюсь. Помню, что "половинка от ХС4Т") с однократным программированием. Увы, здесь сохранилась нехорошая особенность, нельзя инициализировать память. Для меня это было принципиально: я для этих ПЛИС разработал микроядро QuatCore, сокращённо от Quaternion Core, заточенное под задачи технического зрения и ориентации в пространстве с помощью кватернионов. И мне нужно было, чтобы в одних блоках памяти сразу же оказался код, а в других - начальные значения всех переменных. Лишишься этого - придётся некий "бутлоадер" ковырять и подключать ПЗУ снаружи, некрасиво это.

О некоторых ничего толком сказать не могу, например, 5578ТС014 или 5578ТС024.

Ну а самые тяжеловесы - это 5578ТС064, 5578ТС084, 5578ТС094, 5578ТС104. Это уже функциональный аналог Altera Cyclone III, произведённые по техпроцессу 90 нм. Напряжения: 2,5 вольта периферия, 1,2 вольта ядро. По логической ёмкости, самая крупная, как это ни странно, ТС064, под 56 тысяч ЛЭ и свыше 2 МБит внутренней памяти, полторы сотни аппаратных умножителей 18х18 (DSP-Блоки) и 4 блока ФАПЧ (PLL). Плюс к тому, отдельные ножки теперь можно конфигурировать в LVDS.

Из этих 4, 5578ТС104 выделяется "толерантностью к 3,3 вольтам", то есть при напряжении периферии 2,5 вольта, можно подавать 3,3-вольтовые сигналы без страха её спалить. Потрохов чуточку меньше: 39600 ЛЭ, 1,134 МБит внутренней памяти, 126 перемножителей.

5578ТС104 в естественной среде обитания

Судя по обилию операций, которые надо сделать, чтобы с ней работать, она ещё дальше ушла от оригинала. Тайминги не совпадают, и, как это ни удивительно, местами они ЛУЧШЕ. Чтобы узнать, может ли наш проект корректно работать на заданной тактовой частоте, нужно подключить специальный TCL-скрипт, который "подправит" задержки распространения, прописанные для Cyclone III. Иногда может отличаться "роутинг", некоторые пути, возможные в Cyclone III, не получается "развести" по ТС104. Так что и здесь нужно отдельную программку запускать, с романтическим названием verify_routing. К сожалению, они не очень подробно сформулировали "алгоритм действий", забыли сказать, что после неудачного результата надо УДАЛИТЬ файлик .rcf, и только после этого запускать синтез с новым значением seed. Ещё и ФАПЧ реализована по-своему, нужно смотреть специфику.

Слабое место этой ПЛИС: конфигурационное ПЗУ аж на 24 МБита. Его должен был делать Миландр, но чего-то запаздывает. Самое интересное, по моим предварительным изысканиям, все 24 МБита здесь и не нужны, хватило бы чуть больше 8, и это при несжатом битстриме. Использовать сжатый она, похоже, не умеет, или программистам лень было реализовывать операцию по сжатию, этого пока не знаю, буду выяснять.

Выводы

Работать с этими ПЛИС вполне можно, документация довольно неплохая, впрочем, хитростей всё равно хватает.

Плохо ли то, что они являются функциональными аналогами Altera Flex10k и Cyclone III? А почему бы и нет. Даже такая вот "миграция" получается довольно нервной, а если ещё человека заставить сидеть в совершенно другой среде разработки, с другими библиотечными компонентами, без понимания, как писать модули, чтобы они ложились "компактно" в данную ПЛИС - мало кто это вынесет. Прямой копией, как видно, они не являются, и чем дальше - тем сильнее они "уходят" в сторону. Видно, что у нас есть специалисты, которые очень глубоко разобрались во "внутреннем устройстве" альтеровских ПЛИС и всех генерируемых файлах, иначе даже малейших изменений они внести бы не смогли.

Насколько эти ПЛИС "древние"? Да нормально, Cyclone III ещё из употребления не вышел, используется вовсю. Компоненты для космической техники всегда "отстают от моды", да и не очень хочется излишне тонкие техпроцессы там использовать, одна случайно залетевшая тяжёлая частица устроит погром!

При грамотном проектировании, на таких ПЛИС можно горы свернуть!

Мучаем 5576ХС4Т - часть 0 - покупаем, паяем, ставим драйвера и софт

Расскажем, что это за зверь такой, отечественная ПЛИС 5576ХС4Т, и как сделать первые шаги в её освоении.

Самое сложное - раздобыть к ней отладочную плату. Одну разновидность выпускает сам ВЗПП-С, но в розницу и вообще физическим лицам, похоже, не продаёт. Другую делают LDM-Systems из Зеленограда, вот её я и купил. На тот момент они были готовы продавать её физическим лицам (сейчас, по кр. мере если верить сайту - только юридическим), да и цена была чуть менее кусачей.

DSC_4644.JPG

Также у них продаётся отладочная плата на более слабенькую ПЛИС 5576ХС1Т - в ней 2880 логических ячеек (LE) и 20 кбит встроенной памяти (RAM-блоков), а не 9984 LE и 96 кбит, как в 5576ХС4Т. Зато подешевле, и совершенно точно продадут физическим лицам.

Можно ещё попробовать заказать плату не в полной комплектации. Если открыть электрическую схему, там будут отдельные фрагменты, обведённые пунктиром и обозначенные "A, B, C, D". Это опциональная периферия. A - виртуальный COM-порт и приёмопередатчик RS485, B - контроллер Ethernet, C - светодиодики и кнопочки на плате, чтобы побыстрее включиться в процесс, D - АЦП. Каждый из них можно без вреда для других не напаивать, и тогда получится чуточку дешевле.

По-хорошему, приобретением этих отладочных плат должен озаботиться работодатель. Эти цены - сущая фигня в сравнении с тем, сколько будет стоить сама микросхема уже в металлокерамическом корпусе и с военной приёмкой!

Окромя самой платы, понадобится отладчик JTAG и шнурок, который позволит подключить его к данной плате. Отладчик я купил там же, но вообще тут подойдёт любой USB Blaster (за авторством Altera, нынче Intel).

Чтобы подключить его к данной плате, можно было купить переходник, но я пожадничал и спаял кабель самостоятельно, на фото - справа сверху. Даже не то, чтобы пожадничал - при покупке отладочной платы я не ожидал, что будет такая проблема, надеялся может, что там в комплекте уже какой-то шнурок будет. Но плата пришла, USB Blaster пришёл, хочется уже это дело проверить - в такой ситуации спаять явно быстрее, чем ещё раз заказывать что-то.

Распиновка шнура выясняется следующим образом. Открываем принципиальную схему отладочной платы, находим на ней разъём X4 (под микросхемой FLASH). Нам нужны следующие выводы:

- GND, желательно 2 штуки
- VTref (иногда VCC или VDD) - он объяснит USB Blaster'у, что нужно выдавать сигналы с логическими уровнями 3,3 вольта
- TCK, TMS, TDI, TDO - основные выводы JTAG.

Остальное нам не надо, оставляем неподключёнными. На шелкографии платы находим "единичку" - первую ножку разъёма. Эти разъёмы нумеруются справа налево!

Дальше открываем руководство по эксплуатации USB Blaster, находим таблицу 2, там во вкладке JTAG прописаны интересующие нас выводы.

Свериться можно всё по той же фотографии в начале поста - можно открыть её в полном разрешении, и расположение проводов там видно вполне отчётливо.

Для работы с данной ПЛИС нужно использовать среду Quartus II, версии НЕ ВЫШЕ 9.0 sp2. В более свежих версиях прекращается поддержка кристаллов Flex10k, функциональным аналогом которой является наша 5576ХС4Т.

Скачать Quartus II 9.0 sp2 можно бесплатно с FTP-сервера Altera:
ftp://ftp.altera.com/outgoing/release
находим там
90sp2_quartus_free.exe

Устанавливаем Quartus. Не помешает запустить установщик от имени администратора, иначе он может какие-то файлы не установить, но промолчать.

И остаётся ещё установить драйвера на USB Blaster. Подключаем данный драндулет, он появится как "неизвестное устройство", драйвера к нему лежат в папке Quartus: drivers\usb-blaster.
Под windows xp появится предупреждение, что драйвера не подписаны, жмём "всё равно продолжить", и всё устанавливается в лучшем виде.
Под семёркой такой фокус, увы, не прокатывает, и я отключил подпись драйверов следующим способом.

Запустил командную строку от имени администратора и ввёл 2 команды:

bcdedit -set loadoptions DISABLE_INTEGRITY_CHECKS

bcdedit -set TESTSIGNING ON

после чего перезагрузился, и всё поставилось. Есть и другие варианты.

После всех мучений в диспетчере устройств должен появиться USB Blaster. И далее нам надо убедиться, что кабель спаян правильно, и вся эта штука вообще подаёт признаки жизни.

Для этого подключаем отладочную плату по USB (или втыкиваем её в зарядное для телефона, нам пока что нужно лишь 5 вольт), подключаем USB Blaster, открываем Quartus, а в нём - Programmer, либо из меню Tools, либо из панели инструментов, нарисован чип, из которого валит пар.

У этой штуки укуренный интерфейс. Тыкаем Hardware setup, и там в списке должен САМОСТОЯТЕЛЬНО появиться наш USB Blaster. Он может появиться не сразу, кнопка Add hardware нам абсолютно ничем не поможет, там речь пойдёт о каких-то сетевых устройствах. Как появится - долбим по нему два раза, чтобы он появился в строке Currently selected hardware, и наконец-то жмём OK.

И теперь жмём Auto detect, и должны увидеть следующую картину:

Два устройства. Первое, EPC16/4/8 - это FLASH-конфигуратор ПЛИС, выполненный на микросхеме 5576РС1У. Именно туда мы хотим прошиваться, чтобы далее ПЛИС работала по нашей "программе" уже без отладчика, грузилась при подаче питания.

Второе устройство, EPF10K200E/S - непосредственно ПЛИС. Можно законфигурировать непосредственно её, это ГОРАЗДО быстрее, буквально полсекунды, и с этого момента она начнёт работать по новой "прошивке". Но после выключения питания она, разумеется, будет утеряна, и ПЛИС будет "загружена" из FLASH-конфигуратора.

Теперь у нас всё готово для работы!

Мучаем 5576ХС4Т - часть 2 - наша первая схема!

В прошлой части автор возвёл поклёп на эту микросхему, сказав, будто она неустойчиво работает на 80 МГц. Оказывается, микросхема была не виновата, это автор одну ножку не настроил как надо, и она "коротила" генератор тактовой частоты. Вчера наконец-то всё настроил правильно - и ПЛИС замечательно заработала от 80 МГц напрямую. По кр. мере, синхронный 27-разрядный счетчик-делитель частоты, выдающий импульс длительностью в 1 такт раз в секунду - замечательно работает.

Подробнее об этом в 4-й части, а сейчас "соберём" самую примитивную схему, которая по нажатию кнопки должна зажигать светодиодик!

Первым делом, качаем очень важную табличку, которую автор "скомпилировал" из двух ТУ: https://yadi.sk/d/VwxmCuqfLwLl3w
Это таблица соответствия выводов импортной Flex10k (Altera), 5576ХС4Т в металлокерамическом корпусе, и 5576ХС4Т1 в пластиковом корпусе, а также функциональное назначение выводов и пр.

И принимаемся за проект. Открываем Quartus, создаём новый проект, называем его как-нибудь. В окне выбора ПЛИС ставим семейство FLEX10KE, а в Device list находим EPF10K200SRC240-1. UPD. надо выбрать EPF10K200SRC240-3, отличается скоростью, наши "на всякий случай просят помедленнее". Впрочем, при комнатной температуре у меня и схемы, заваливающие тайминги "-3" вполне себе фурычили. Позже будет пара постов, как их "ускорить", чтобы заработали заведомо.

Можно заметить, что количество LE и битов памяти - то, что мы и ожидали (98304 бит - это 96 кбит, если считать, что в одном килобите - 1024 бита). А вот напряжение питания ядра - 2,5 вольта, тогда как 5576ХС4Т работает от 1,8 вольта. Так что в очередной раз убеждаемся - это не прямая "калька".

Тыкаем "далее" сколько-то раз (или вовсе жмём finish) - начало положено.

Создаём новый файл типа Block Diagram / Schematic file. Лично мне нравится мелкие блоки писать на верилоге, но верхние уровни делать уже в виде принципиальной схемы. Если захочется, такую схему всегда можно автоматически конвертировать хоть в verilog, хоть в vhdl, а вот назад, из верилога получить принципиальную схему, да ещё и хорошо читаемую - куда сложнее!

Лезем в инструмент Symbol tool, и в древовидном "каталоге" находим порты ввода/вывода (см. скриншот). Добавим аж три входных порта и один выходной. Третий входной соединяем с выходным проводком, и переименовываем их, как указано на скриншоте внизу:

Сохраняем эту схему - Quartus предложит название, совпадающее с именем проекта, именно его он выставит как Top-level entity. На самом деле, можно сохранить как угодно, а потом в project navigator (слева), во вкладке files тыкнуть по нужному файлу правой кнопкой и выбрать Set as top level entity.

Теперь в окне Tasks (слева снизу в основном окне программы) тыкаем два раза по Compile design. Начинается очень сложная работа по компиляции нашей схемы 🙂 Компиляция должна окончиться успешно, хоть и с 4 предупреждениями. Оказывается, что 2 наших входа никому не нужны (не приводят в действие никакой логики), так и есть.

Залезаем в Pin Planner (из панели инструментов, его же можно найти в меню Assignments), после чего начинаем громко думать - к каким ножкам подсоединить эти 4 порта, нарисованные в нашей схеме?

Для этого открываем электрическую схему отладочной платы. В правой её части находим кнопки SA2 .. SA6. Кстати, они коммутируют выход на землю (на общий провод), так что пока кнопка не нажата, на ножке будет лог "1", а при нажатии - "0". Это традиция, идущая ещё с ТТЛ схемотехники, где все элементы асимметричны относительно напряжений питания, как по порогам срабатывания, так и по входным и выходным токам.

Кнопка SA2 выведена на "жгут", под названием uBOT(0). Ищем, где этот uBOT(0) заходит в ПЛИС, и находим: это ножка 186 с наименованием I/O129. Открываем нашу табличку и находим строку I/O129. Как видно, цоколёвка ПЛИС в металлокерамическом корпусе и в пластиковом корпусе (это наш вариант) отличается! А нам из этой таблички нужна и вовсе цоколёвка оригинальной Flex10k, это первый столбец. Там это 115-я ножка.

Ура, в Pin Planner для порта SA2 вписываем 115, оно само переправится на PIN_115 - отлично.

Таким же образом находим, куда ведёт первый светодиод VD7 - он через провод uLED(0) в жгуте заходит на ножку 172 с наименованием I/O117. Сверяемся с таблицей - номер вывода и наименование совпадает - хороший знак 🙂 А номер вывода Flex10k - 101. Вбиваем его в Pin Planner, на порт LED0.

CLK80Mhz - это основной вход тактовой частоты. На схеме находим G1 - кварцевый генератор. Выход с него заходит на жгут, под именем CLK, а с него сразу же - на ножку 33, наименование CLOCK(0). В табличке находим, что назначение данного вывода - "глобальный тактовый вход" - замечательно! Такие входы обеспечивают минимальную задержку распространения сигнала до всех логических ячеек, и могут запитать их все разом без нужды в дополнительных буферах. Номер вывода Flex10k - 211. Теперь уже в Pin Planner можно посмотреть, что это за вывод такой - он называется Dedicated clock, всё верно.

И наконец, изучая схему, мы обнаруживаем, что выход кварцевого генератора заходит ещё и на ножку 39, I/O(27). Зачем это нужно - пока не очень понимаю, но эта самая ножка не давала кварцевому генератору нормально работать!

Мы уже говорили, что оригинальный Flex10k при включении, пока идёт конфигурация, включает все ножки в качестве входных - они имеют высокое входное сопротивление, ибо мало ли, что к ним подключено!

Но когда конфигурация заканчивается, все выводы, которые мы явно не прописали в нашем проекте, будут настроены как выходные, с логическим "0" на выходе! По крайней мере, так поступает Quartus по умолчанию. Можно зайти в меню Assignments - Settings - Device - Device and pin options. - Unused pins, и там вместо "As output driving to ground" поставить "As input tristated". Можно, но не рекомендуется.

Итак, данная ножка, про которую автор немножко забыл, "коротила" кварцевый генератор на землю. По схеме можно видеть два резистора 51 Ом, так что сигнал не исчезал совсем - он лишь гасился более чем в два раза. В два раза - только за счет делителя, но ещё и сам генератор вовсе не расчитан на 100-омную нагрузку! Этот ослабленный сигнал и приводил к некорректной работе ПЛИС от данного генератора!

И сейчас мы сразу же поставили эти два входа ровно для того, чтобы не нагружать генератор почём зря! Я трогал его пальцем - он основательно так грелся. Поэтому, ножку 39, I/O(27), которой соответствует ножка 215, ставим как YetAnother80MHz в Pin Planner. Вот, что должно получиться.

Всё, мы готовы. Закрываем Pin Planner и повторно запускаем Compile Design (большинство этапов размещения на кристалле надо провести заново, когда стало извествно, с каких ножек мы подаём сигнал).

Когда компиляция завершается, нам нужно сделать ещё один шаг, связанный с некоторой "упоротостью" Quartus'а. Дело в том, что он по окончании компиляции создаёт два файла. Первый имеет расширение .sof - SRAM Object File, его непосредственно можно "прошивать" напрямую в ПЛИС, чтобы она быстренько сконфигурировалась, как нам надо, но потеряла эту конфигурацию при выключении питания. Второй имеет расширение .pof - Programmer Object File, он прошивается в энергонезависимую память конфигуратора ПЛИС, чтобы при каждом включении уже он загружал в ПЛИС данную "программу".

Казалось бы - бери и прошивай! Не тут-то было: есть разные типы конфигураторов ПЛИС, несовместимых между собой. Quartus всегда компилирует в EPC2 - устаревший тип, который мало где встретишь. Он попросту не захочет прошиваться в наш конфигуратор, а если мы его и "вмонстрячим" силой - не заработает.

Надо преобразовать EPC2 в EPC4. Для этого идём в меню file - Convert programming files.

В открывшемся окне выбираем из списка configuration device - EPC4. Programming file type - POF - всё верно. Имя файла задаём какое хотим, главное потом не запутаться при прошивке, где у нас правильный.

Внизу, в Input files to convert, тыкаемся по строке SOF data, тогда у нас становится доступной кнопка Add file - жмём её и выбираем .sof, который сгенерировал нам компилятор. Вот так оно должно выглядеть:

Жмём Generate. Ура. Мы почти у цели.

И теперь сладкий миг прошивки на ПЛИС. Открываем Programmer (про него мы чуть-чуть сказали в первой части). Жмём Auto detect, чтобы убедиться в очередной раз - цепочка JTAG работает, всё на своих местах. По устройству EPC16/4/8 тыкаем правой кнопкой мыши и выбираем Change File. Выбираем тот самый .pof файл, который сгенерился на прошлом этапе. Ставим галочку "program/configure" и нажимаем Start.

Чтобы теперь прошить содержимое конфигуратора в ПЛИС, надо нажать на кнопку SA1, которая прерывает подачу напряжения на ПЛИС. Мы должны увидеть одиноко горящий светодиод VD7, который погаснет, если мы нажмём на центральную кнопку SA2.

Так и должно было быть - если посмотреть на принципиальной схеме, к выходу ПЛИС подключён анод светодиода, т.е для его зажигания надо подать логическую "1", тогда как кнопка коммутирует вход на "0".

В этот момент мы должны ликовать - вся эта конструкция реально нас слушается 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *