Графический дизайн в Quartus II v10.1 для начинающих.
- Подробности
- Категория: Разное
- Создано 23 Март 2011
- Автор: Юрий Карлов
- Просмотров: 82482
Меня долго терзали сомнения , нужно ли об этом рассказывать, но все-таки решил что нужно, по ряду соображений:
- Альтера еще не выбросила из пакета графический редактор (за что им "низкий поклон").
- В тему "ПЛИС" приходят люди из разных смежных областей, в том числе и из схемотехники, поэтому схемотехническое представление может быть, на начальном этапе, более понятным (особенно для тех, кто уже пытался паять какие-то проводки и микросхемы).
- Мы (для платы Марсоход) имеем дело с очень маленьким и простым чипом, в котором можно реализовать очень небольшие проекты, не требующие каких-то глубоких знаний и уж тем-более коллективного программирования.
(В некоторых случаях дело обходится установкой всего-лишь нескольких примитивов) . - Далеко не все начинающие программисты на 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. Комбинаторная логика.
Комментарии
правой кнопкой мыши на элементе на схеме и в меню свойства, там кажется где-то..
Но поскольку эти выводы не показаны на планировщике, а в даташите EPM3064ATC100 их не нашел, то я несколько "завис.
Фраза для гугла "74245 verilog"
Пробовал составить из готовых элементов ключей, но при компиляции сплошные ошибки. За ранее благодарен.
"Opndrn" - когда, в зависимости от данных, на выходе или "Z" или "0".
Сразу и не понял. Может добавить что это выход с открытым стоком, и подключается через подтягивающий резистор? Например для согласование с 5В логикой.
Когда выход активен, он формирует низкий логический уровень. Когда не активен, резистор подтягивает его с напряжению 5В.
В меню "View" убираете все "Show ..." что вам мешают.
PIN_103
3.3V Schmitt Trigger Input
Его можно запустить из графического редактора или
пин-планера через "Locate".
Выделите нажный обьект и нажмите ПКМ, в пункте
"Locate" будет список "Locate in..." - выберите нужный.
Абсолютно не возражаю, но это уже не "генератор внутри ПЛИС"
ну не откладывая надолго, взял код с
http://www.alteraforum.com/forum/showthread.php?t=709&page=2
пост #15 , вывел на наружные ноги , добавил внутри же инвертор .
залил в DEO0_nano , соединил взод с выходом проводом 30 см длиной - получил 50 МГц . Мерял Rigol_1052.
Если есть надобность , могу оставить один буфер+один инветор, перемычку сделать 5 мм и померять Теком.
200МГц может и выйдет.
На мой взгняд, не всему что "написано" слдует искренне верить.
Возьмите обычную ЛН-ку и соедините у нее вход с выходом - будет генерить?
Все что здесь описано, это не генератор, а усилитель помех по питанию.
Я-бы даже для генрации слечайных чисел такое использовать не рискнул.
http://www.alteraforum.com/forum/showthread.php?t=709&page=2
TrueRNG http://ite.gmu.edu/~kgaj/publications/conferences/GMU_FPGA_2004_slides.pdf
а главное - не могу ссылку найти, но видел сам - какие то немцы продавали USB девайс на CoolRunner на основе последней ссылки. Описывалось , как там у них много разных RO по разному от температуры зависят и друг друга стробируют и как от этого чисто случайное число возникает из ниоткуда.
Очень хотелось-бы посмотреть пример реализации на ПЛИС.
Гочему нельзя ? А как же все true random generator cores, работающие на внутренних генераторах?
Именно внутри ПЛИС генератор сделать нельзя, частотозадающие элементы все-равно будут снаружи.
Об RC -генераторах здесь https://marsohod.org/11-blog/105-freqdependancy
о кварцевых здесь https://marsohod.org/11-blog/133-quarz
Больше не нашёл куда написать, проблема такая:
Хочу создать тактовый генератор 200 МГц на EPM240(или 3032).
Можно ли собрать внутри ПЛИС что то наподобие этого: http://www.radioman-portal.ru/pages/1602/ ?
Подскажите, пожалуйста, существуют ли какие-нибудь опции, влияющие на скорость компиляции проекта? А то так долго...
Честно говоря, никогда так не делал. Обычно, один модуль- один файл.
Как указывается модуль верхнего уровня? Мы можем указать файл как верхний уровень, а если в файле несколько модулей?
У меня Ваши уроки распечатаны, этот пример крутил, но в голове ничего не щелкнуло, пока не сказали!
БОЛЬШОЕ СПАСИБО!
Почитайте здесь: https://marsohod.org/11-blog/79-veriloglesson2
В конце пример на верилоге.
Каждый модуль нужно писать в отдельном файле?
У меня было два модуля в одном файле, графический символ создавался только для одного, имя которого совпадало с именем файла.
Спасибо!
А нельзя как-то просто указать - выход такого модуля на вход такого-то модуля?
Если "Top Level" графический, то для каждого модуля на верилоге нужно создать символ. Делается это в
меню "File > Create/Update > Create Symbol Files for Current File". Затем нужно вставить эти символы в проект
и соединить проводочками.
Подскажите, пожалуйста, в следующем вопросе:
Есть два модуля, написанных на верилоге :-). Как соединить выход одного модуля со входом другого? Использую Альтеру.
Пин в максе всегда работает на ввод, может работать
на вывод (enable=1), и ничего не мешает это делать одновременно.
Посмотрите внимательно на самую первую картинку (из "Resource Property Editor" ). В середине картинки ромбик в квадратике, это , собственно ножка чипа (пин).
Проводок с правой стороны - это входной сигнал - data_in. Он поступает в чип всегда, независимо от сигнала enable.
С левой стороны - выходной буферный элемент , который,
в зависимости от сигнала enable ("0" или "1") может находится в "Z" состоянии, или передавать data_out на пин.
два примитива - "Bidir" и "Tri"." - автор.
Что-то на счет Bidir не совсем вьехал... Enable, если я правильно понял - задает направление передачи: вход или выход; data_out - данные, что нужно выводить, data_in - вводить, правильно я Вас понял? Спасибо.
Это означает, что этот конец провода никуда не подключен. На самом деле момент очень важный,
можно дотянуть провод близко ко входу или выходу
компонента, но подключен он к нему или нет можно
судить только по крестику. Спасибо за вопрос.
форум.Я думаю, много вопросов можно
будет обсудить там
Возможно ли такие же статьи но уже про описательный механизм дизайна. Очень интересует каким образом описываются параметры выходов через "прагмы". TriState и BiDir так же очень интересны в плане применения в шинах. Особенно учитывая тот факт что обособленных выводов на марсоходе маловато и двунаправленнос ть возможный выход из ситуации.