nabbla (nabbla1) wrote,
nabbla
nabbla1

Category:

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

Часть 0 - покупаем, паяем, ставим драйвера и софт
Часть 1 - что это вообще за зверь?
Часть 2 - наша первая схема!
Часть 3 - кнопочки и лампочки
Часть 4 - делитель частоты
Часть 5 - подавление дребезга кнопки
Часть 6 - заканчиваем кнопочки и лампочки
Часть 7 - счетчики и жаба
Часть 8 - передатчик UART
Часть 9 - Hello, wolf!
Часть 'hA - приёмник UART
Часть 'hB - UART и жаба
Часть 'hC - полудуплексный UART.
Часть 'hD - МКО (МКИО, Mil-Std 1553) для бедных, введение.
Часть 'hE - приёмопередатчик МКО "из подручных материалов" (в процессе)
Часть 'hF - модуль передатчика МКО
Часть 'h10 - передатчик сообщений МКО
Часть 'h20 - работа с АЦП ADC124s051
Часть 'h21 - преобразование двоичного кода в двоично-десятичный (BCD)
Часть 'h22 - Bin2Bcd с последовательной выдачей данных
Часть 'h23 - перемножитель беззнаковых чисел с округлением
Часть 'h24 - перемножитель беззнаковых чисел, реализация
Часть 'h25 - передаём показания АЦП на компьютер
Часть 'h26 - работа над ошибками (быстрый UART)
Часть 'h27 - PNG и коды коррекции ошибок CRC32
Часть 'h28 - передатчик изображения PNG
Часть 'h29 - принимаем с ПЛИС изображение PNG
Часть 'h2A - ZLIB и коды коррекции ошибок Adler32
Часть 'h2B - ускоряем Adler32
Часть 'h2C - формирователь потока Zlib
Часть 'h2D - передаём сгенерированное PNG-изображение
Часть 'h2E - делим отрезок на равные части
Часть 'h2F - знаковые умножители, тысячи их!
Часть 'h30 - вычислитель множества Мандельброта
Часть 'h31 - ускоренные сумматоры
Часть 'h32 - ускоренные счётчики (делаем часы)
Часть 'h33 - ускоряем ВСЁ
Часть 'h34 - ускоренные перемножители
Часть 'h35 - умножители совсем просто
Часть 'h36 - уравновешенный четверичный умножитель


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

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

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


И принимаемся за проект. Открываем Quartus, создаём новый проект, называем его как-нибудь. В окне выбора ПЛИС ставим семейство FLEX10KE, а в Device list находим EPF10K200SRC240-1. Можно заметить, что количество 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".

В этот момент мы должны ликовать - вся эта конструкция реально нас слушается :)
Tags: ПЛИС, работа, странные девайсы
Subscribe

  • Так есть ли толк в ковариационной матрице?

    Задался этим вопросом применительно к своему прибору чуть более 2 недель назад. Рыл носом землю с попеременным успехом ( раз, два, три, четыре),…

  • Big Data, чтоб их ... (4)

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

  • Потёмкинская деревня - 2

    В ноябре 2020 года нужно было сделать скриншот несуществующей программы рабочего места под несуществующий прибор, чтобы добавить его в документацию.…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 17 comments

  • Так есть ли толк в ковариационной матрице?

    Задался этим вопросом применительно к своему прибору чуть более 2 недель назад. Рыл носом землю с попеременным успехом ( раз, два, три, четыре),…

  • Big Data, чтоб их ... (4)

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

  • Потёмкинская деревня - 2

    В ноябре 2020 года нужно было сделать скриншот несуществующей программы рабочего места под несуществующий прибор, чтобы добавить его в документацию.…