Меня долго терзали сомнения , нужно ли об этом рассказывать, но все-таки решил что нужно, по ряду соображений:
- Альтера еще не выбросила из пакета графический редактор (за что им "низкий поклон").
- В тему "ПЛИС" приходят люди из разных смежных областей, в том числе и из схемотехники, поэтому схемотехническое представление может быть, на начальном этапе, более понятным (особенно для тех, кто уже пытался паять какие-то проводки и микросхемы).
- Мы (для платы Марсоход) имеем дело с очень маленьким и простым чипом, в котором можно реализовать очень небольшие проекты, не требующие каких-то глубоких знаний и уж тем-более коллективного программирования.
(В некоторых случаях дело обходится установкой всего-лишь нескольких примитивов) . - Далеко не все начинающие программисты на HDL представляют себе, как их проекты выглядят в реальном чипе. (возможно, смогут узнать для себя что-то новое).
Я занимаюсь ПЛИС очень давно и участвовал реализации даже очень больших проектов в графическом виде.
Надеюсь, мой опыт будет кому-нибудь полезен.
Часть1. Пины (A), Провода (B), Константы (C).
A.
Чип EPM240T100 имеет, кроме земли, питания и JTAG, 80 пинов, которые можно использовать в своих проектах.
В программе "Resource Property Editor" из комплекта Altera Quartus II один пин выглядит так:
В середине картинки ромбик в квадратике, это , собственно ножка чипа. Проводок с правой стороны - это вход, который может идти в чип напрямую, или через элемент задержки (^T).
Треугольничек с левой стороны - выходной буферный элемент. Он имеет вход данных и разрешения (который с кружочком).
В программе "Assignment Editor" для каждого пина можно назначить определенные свойства:
- прежде всего "Location" - номер ножки в чипе.
Затем свойства входа:
- уже упомянутая задержка "Input Pin to Logic Array Delay" (зачем может понадобиться , не знаю).
- "Weak Pull Up" включает подтягивающий резистор на питание (обязательно нужно на кнопочках, чтобы не болтались в воздухе и не ловили наводки).
- "Bus Hold" - примерно тоже-самое что и "Weak Pull Up", но подтягивает не к питанию, а к прямому выходу этого-же пина. Это удерживает пин в состоянии, которое на нем было последним.
- "I/O Standart" - возможно только два случая - наличие или отсутствие триггера шмитта (очеyь нужная функция - триггер шмитта нужен практически всегда).
Ну и свойства выхода:
- "Slow Slew Rate" - уменьшение скорости нарастания выходного сигнала, якобы для уменьшения помех (не пробовал).
- "Current Strengh" - возможны два значения 16ma или 8ma. По моим измерениям, в
первом случае сопротивление канала выходного ключа ~20ом, во втором 40ом.
Для того чтобы использовать пин в дизайне , нужно с помощью меню "Symbol" установить
два примитива - "Bidir" и "Tri".
Для запуска меню "Symbol" можно нажать два раза левой кнопкой мыши на свободном поле или соответствующую кнопку в меню редактора (там изображен какой-то логический элементик).
Нужный нам примитив можно выбрать в библиотеке или ввести его название с строке "Name:", что , на мой взгляд, гораздо удобнее. Кроме того, есть три частных случая :
"Input" - когда выходной буфер всегда находится в "Z"- состоянии и используется только вход.
"Output" - когда он всегда разрешён, и данные сразу поступают на выход (вход использовать нельзя ).
"Opndrn" - когда, в зависимости от данных, на выходе или "Z" или "0".
Примитивы "Input" ,"Output" и "Bidir" могут описывать сразу несколько пинов и должны быть поименованы соответственно (key[3..0] , pt_left и т.д.).
B.
Теперь, когда данные можно вводить в чип и выводить наружу - нужны провода.
Проводники могут быть одиночные ("Node Line") или шины ("Bus Line") и тоже могут иметь свои имена. Если имена проводников совпадают с именами пинов значит они соединены. В некоторых случаях проводники нужно переименовывать. Для этого можно использовать примитив "Wire"
Имена шин могут иметь две размерности (в некоторых случаях это удобно) и менять порядок бит (на выходе одного элемента, например, bus[3..0], а на входе другого bus[0..3] ). Размерность шины должна точно совпадать с размерностью входа или выхода, к которому она подключена.
C.
Иногда, на вход какого-нибудь компонента или на пин, нужно подать какое-то, не меняющееся во времени, значение (константу). Для этого можно использовать примитивы "GND" и "VCC".
В случае, если константа нужна большая, чтобы не рисовать много "GND" и "VCC" можно использовать параметризованную мегафункцию "LPM_CONSTANT" (здесь и далее "мегафункция"- некоторое количество связанных между собой примитивов,
реализующee определенную функциональность . Обычно называется LPM_XXX).
Установить константу можно , как и примитивы, с помощью меню "Symbol", но двумя способами:
- С помощью визарда. Сдесь все понятно - отвечаешь на вопросы и в итоге получаешь нужный тебе компонент ( на картинке слева ).
- Если в меню "Symbol" убрать галочку "Launch MegaWizard Plug-In", то можно установить так-называемую "чистую" мегафункцию. В этом случае все параметры придётся устанавливать "в ручную", в меню "Properties". Эти параметры видны в табличке возле элемента ( на картинке справа ).
Напоследок пара рекомендаций.
1. Не меняйте геометрическую ориентацию элементов. Поскольку у всех элементов нет дополнительных признаков, где вход,
где выход, входы всегда должны быть слева, а выходы справа.
2. Старайтесь использовать только "чистые" мегафункции. Это облегчит визуальное восприятие схемы, поскольку они всегда
одинаково выглядят. Это облегчит переносимость каких-то фрагментов схем из других проектов, поскольку не тянут за собой никаких файлов ( можно копировать через клипбоард ).
В следующей статье - Часть2. Комбинаторная логика.
Подробнее...