Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Вам же надо быстро отремонтировать? У Вас ведь поток? Ремонтируемые изделия меняются?

Это в ремонте бытовой аппаратуры поток, и надо ремонтировать быстро (предложение превышает спрос), а в не бытовой, очень часто бывает нужно просто отремонтировать. Особенно тогда, когда аппаратура преобреталась и устанавливалась одними людьми, а эксплуатируется уже другими, так как первые пошли в рост, и вспоминают об этой технике лишь как о том сколько бабок они наварили на этом проекте.

Ремонтируемые изделия меняются, но меняются по разному, и с разной скоростью. В экономической категории, ремонтируемые изделия меняются за 365 дней, с гарантийной на постгарантийную, а вот с технической точки зрения, изделия меняются за более длительной время. Вы же, как разработчики c опытом, не можете себе позволить каждый год реализовывать новый проект на новой элементной базе, сознательно похерив свои наработки, и уподобиться молодому специалисту.

Так вот, реверс инжиниринг – это отдельная область, просто так туда не попасть.

В общем, если Вы не профессионал в этом деле, то я бы Вам не советовал тратить время. Ну, а если Вы – профессионал, то таких вопросов бы не задавали.

Реверс инжиниринг это решение разных задач. Для разработчика это один из способов создания собственных новых проектов, а для ремонтника это способ реанимации, то есть способ восстановления и сохранения того что уже сделано, и сделано не им. В этом плане, разработчик, вскрывая чужие разработки, создает конкурентную среду своему коллеге, а ремонтник занимается реставрацией, реставрацией чужой собственности, за которую собственник, добровольно и без принуждения, готов платить свои деньги.

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

У меня задача – отремонтировать, и сделать это так чтобы потребитель остался доволен тем фактом, что ремонт осуществлен, и обошелся ему не в стоимость нового, а не более 50-60% от цены нового. Особенно это важно тогда когда, бюджет потребителя не предусматривает расходы на преобретение новой техники, а статья расходов на ремонт остается не освоенной.

Не обижайтесь, ремонтники – народ – не сахар, сами знаете, наверное, как ремонтных форумах относятся к вопросам со стороны.

Я и не обижаюсь. Каждый индивид охраняет место своего обитания. Ну а уж если говорить о профессиональных форумах, то на всех этих форумах постоянным участникам со временем надоедает отвечать на вопросы новичков, особенно если воросы задаются сегодня, а ответы на них были даны еще вчера.

Время создания страницы: 0.226 секунд

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Представим себе, что мы увидели какой-то интересный FPGA проект и захотели запустить его на своей плате, но, проблема – плата у нас другая и микросхема FPGA у нас другая. Как перенести тот проект на нашу плату? Возможен ли такой перенос/портирование и трудно ли его выполнить?

В общем случае портирование FPGA проектов – это не очень простая задача. Зависит от многих факторов. Иногда это возможно, иногда нет. Самое главное: ресурсы платы (установленные компоненты, разъемы, интерфейсы) и ресурсы FPGA чипа (количество доступных логических элементов, объем встроенной памяти, PLL, умножители). К примеру, если исходный проект использует SDR память платы, а на нашей плате этой памяти нет или меньше, чем нужно, то что тут можно сделать? В таком случае полный перенос проекта не возможен. Или, к примеру, для проекта требуется минимум 12 тысяч логических элементов FPGA, а на нашей плате их всего 10, тоже не очень хорошо. В общем, по ресурсам имеющейся платы и FPGA нужно смотреть можно ли реализовать в ней проект или нет. Если же платы хотя бы примерно похожи и емкости чипа хватает, то можно пробовать делать перенос проекта.

У нас на сайте уже накопилось довольно много разных проектов для разных плат серии Марсоход. В этой статье я хочу рассказать, как производить портирование проекта с платы Марсоход2 c FPGA Cyclone III на плату Марсоход2bis, Cyclone IV. Я буду портировать проект “Простой текстовый терминал”.

В этом проекте реализован текстовый видеоадаптер 56 строк по 180 символов, формируется видеосигнал 1440×900, 60Гц и картинка отображается на VGA дисплее. Плата принимает символы из последовательного порта и печатает их в экран. При этом, если приходит символ 0x0D, это “Enter”/”перевод каретки”, то производится скроллирование экрана. Кроме того, терминал понимает символ табуляции 0x09.

Марсоход2 и Марсоход2bis визуально почти ничем не отличаются, но и на самом деле они производятся на одной и той же печатной плате. Главное отличие этих плат обусловлено установленными чипами.

Плата Марсоход2, FPGA Cyclone III, чип EP3C10E144C8, 10 тысяч логических элементов, 414Кбит встроенной памяти, 2 PLL, 23 (18×18) или 46 (9×9) встроенных умножителей.

Плата Марсоход2bis, FPGA Cyclone IV E, чип EP4CE6E22C8, 6 тысяч логических элементов, 270Кбит встроенной памяти, 2 PLL, 15 (18×18) или 30 (9×9) умножителей.

Плата Марсоход2bis немного дешевле, она в базовой комплектации имеет менее емкий чип. К тому же у Cyclone IV меньше I/O выводов, из-за этого на этой плате три светодиода и одна кнопка, у платы Марсоход2 есть 4 светодиода и две кнопки. Но зато Cyclone IV поддерживается современным программным обеспечением Intel Quartus Prime Lite 18.1 Edition, а для Cyclone III последняя версия квартуса – это Quartus II v13.1.

Посмотрим, смогу ли я перенести проект “Простой текстовый терминал” на плату Марсоход2bis?

Скачаю проект с нашего сайта из раздела згрузки и распакую его:

Начнем с того, что проект сделан в среде Quartus II v13. Этот проект даже нельзя открыть в современной среде Intel Quaruts Prime, так как Cyclone III этой средой не поддерживается. Что делать?

Сейчас вручную создадим новую ревизию этого проекта. Для этого скопируем существующий файл cyclone.qsf (Quartus Settings File) в новый файл m2bis_6K_LE.qsf. Это будут настройки новой ревизии. Ревизиии – это отдельные конфигурации проекта, которые позволяют запускать его на разных платах и чипах.

В новом файле настроек m2bis_6K_LE.qsf меняем строки

set_global_assignment -name FAMILY “Cyclone III”set_global_assignment -name DEVICE EP3C10E144C8

set_global_assignment -name FAMILY “Cyclone IV E”set_global_assignment -name DEVICE EP4CE6E22C8

Таким образом, я указываю, что настройки делаются для конкретной микросхемы EP4CE6E22C8 из серии Cyclone IV E.

Дальше из этого файла удаляем все существующие строки начинающиеся с set_location_assignment. Это назначения конкретного сигнала модуля верхнего уровня из проекта конкретному выводу микросхемы. Вместо старых назначений нужно вставить новые назначения, конкретно для платы Марсоход2bis:

set_location_assignment PIN_24 -to FTDI_BD0set_location_assignment PIN_28 -to FTDI_BD1set_location_assignment PIN_11 -to FTDI_BD2set_location_assignment PIN_10 -to FTDI_BD3

set_location_assignment PIN_25 -to CLK100MHZset_location_assignment PIN_23 -to KEY0

set_location_assignment PIN_70 -to SDRAM_LDQMset_location_assignment PIN_43 -to SDRAM_UDQM

set_location_assignment PIN_55 -to SDRAM_BA0set_location_assignment PIN_58 -to SDRAM_BA1

set_location_assignment PIN_67 -to SDRAM_RASset_location_assignment PIN_68 -to SDRAM_CASset_location_assignment PIN_69 -to SDRAM_WEset_location_assignment PIN_44 -to SDRAM_CLK

set_location_assignment PIN_12 -to DCLKset_location_assignment PIN_13 -to DATA0set_location_assignment PIN_8 -to NCSOset_location_assignment PIN_6 -to ASDO

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

Обращаю внимание, что желательно, чтобы в файле настроек проекта, *.qsf, имена сигналов совпадали по регистру с именами в проекте. То есть если в проекте сигнал назван большими буквами, то рекомендую и в настройках проекта делать назначения по имени сигнала с большими буквами.

Итак, назначения сделаны.

Далее добавляем ревизию в проект, в файл cyclone3.qpf (Quartus Project File) добавляю строку с “m2bis_6K_LE” перед существующей строкой “cyclone3”

PROJECT_REVISION = “m2bis_6K_LE”PROJECT_REVISION = “cyclone3”

Теперь проект можно открыть в среде Intel Quartus Prime.

Вы можете попробовать откомпилировать, но сразу скажу, что будут ошибки. Портирование еще не завершено.

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

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Вторая проблема серьезней. Не хватает встроенной памяти для видеоадаптера..

Первое, что можно сделать – это отключить использующийя в проекте модуль SignalTap, он сам по себе занимает какую-то часть внутренней памяти. Этого мало.

Можно попробовать сократить объем памяти приемного фифо. Я пробовал, но все равно не достаточно

Пишу на Verilog HDL вот такой модуль конвертации аттрибутов:

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Этот конвертор нужно вставить в проект в два места: в топ модуль и в модуль Verilog txtd:

Ну и, конечно, в визарде компонента screen2 (Dual-port ram) меняю разрядность памяти с 16-ти бит до 9-ти:

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Теперь кажется все.

Хотелось бы еще обратить внимание на два момента.

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Если про создании нового проекта или при переносе проекта с одной платы на другую мы забудем назначить какой-то вывод, то ничего страшного не произойдет, так как неиспользуемые выводы микросхемы ПЛИС будут включены в режим ввода с высоким входным сопротивлением. Если же в этой опции будет стоять к примеру As output driving ground, то можно получить неприятности: какая-то внешняя микросхема платы будет подавать нам полезный сигнал, а мы со стороны ПЛИС его коротим на землю. Не хорошо будет.

2. Есть еще момент связанный с назначением пинов. В этом же диалоговом окне Device and Pin Options есть пункт Dual Purpose Pins. Может оказаться так, что делаем назначение сигнала на конкретный пин согласно схемы платы, а компилятор и Fitter ругаются, говорят, что этот сигнал сюда нельзя назначить, так как там уже есть другой сигнал. Эту проблему можно попробовать решить здесь:

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Действительно некоторые выводы в FPGA могут играть двойную роль и эта вторая функция может быть отключена или включена. В микросхемах Cyclone III и Cyclone IV есть такие пины – это сигналы для подключения внешней загрузочной флеш памяти: DCLK, Data, nCEO, nCSO и другие.

В данном случае, при переносе проекта мне не нужны Dual-Purpose Pins и неиспользуемые пины уже стоят в As input tri-state. Но будьте внимательны при переносе других проектов. В этох местах может быть установлено не то, что нужно.

Компилирую и запускаю проект в моей плате:

https://youtube.com/watch?v=TDj21Wq-NvM%3Frel%3D0

Все работает! На видео показано, как загружается проект в ПЛИС платы с подключенным VGA монитором, затем запускается программа TeraTerm, с ее помощью на терминал через последовательный порт посылается текстовый файл. Потом запускается программа Putty, она позволяет печатать текст на терминале.

Перенос проекта на другой чип состоялся успешно, но кое-где пришлось шаманить – немножно менять проект для уменьшения требований по необходимой встроенной памяти. И, кстати, теперь проект можно компилировать и в 13м квартусе для прежней микросхемы Cyclone III, так как ревизию для этого чипа я оставил без изменений.

  • Портирование проекта
  • Марсоход2bis
  • Cyclone IV
  • TTY
  • терминал
  • VGA

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Я хочу рассказать о своем новом проекте для платы Марсоход.

Я попытался сделать проект своей маленькой ПЛИС, написать этот проект на Verilog  и реально запустить его внутри настоящей ПЛИС. Наверное такие проекты лучше делать в больших FPGA, но чем наша плата Марсоход хуже? Она так же годится для таких экспериментов, ну может масштаб не большой, но мне важен сам принцип.

Вообще-то, конечно, многим читателям этот проект покажется бестолковым: «Зачем все это?».

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

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

Чтобы избежать путаницы в терминах я предлагаю в этой статье настоящую реальную микросхему CPLD называть «ПЛИС», а свое разрабатываемое программируемое логическое устройство называть «мПЛИС» – тоесть «моя ПЛИС» или «маленькая ПЛИС».

1. Внутреннее устройство.

Наверное вы уже знакомы с внутренним устройством микросхем ПЛИС (CPLD и FPGA) компании Altera. Сама компания Альтера достаточно подробно все описывает в своей документации. Например, микросхемы CPLD серии MAX II описаны здесь:

Конечно, я не смогу «побыстрому» повторить весь функционал известных микросхем, но какие-то базовые принципы я думаю получится воплотить. Самое главное – это реализовать  программируемый логический элемент LogicElement (LE). Второе – это программируемая коммутация соединений между логическими элементами. Оба эти компонента при включении ПЛИС должны быть инициализированы нужным образом, чтобы моя мПЛИС начала работать. В общем прямая аналогия с настоящими микросхемами. Например, FPGA при включении пуста, но потом в нее заливается образ проекта из специальной внешней микросхемы флеш памяти и вот она уже работает. Микросхемы серии MAX II компании Альтера реализованы примерно так же, только сама флеш находится внутри корпуса ПЛИС.

Пожалуй начну с описания логического элемента.

2. Логический Элемент.

Логический элемент состоит из Look-Up Table (LUT) и одного регистра-триггера. Как вы знаете, цифровые схемы работают синхронно с тактовой частотой. С каждым импульсом тактовой частоты схема переходит в следующее состояние. Все состояние схемы хранится в регистрах, а следующее состояние для каждого регистра вычисляется логическими функциями на входе данных этих триггеров. Вот собственно логическая функция для триггера в ПЛИС реализуется с помощью таблицы истинности Look-Up Table (LUT).

Логическая функция для каждого триггера у нас будет четырехвходовая – как функция от четырех возможных сигналов. Значит сама таблица истинности должна иметь 2^4=16 ячеек памяти и четыре входных сигнала LUT являются адресом для чтения результата из нашей таблицы. Не забудьте, что мы делаем программируемую логику, значит мы должны реализовать начальную загрузку таблицы Look-Up Table.  Как же это сделать?

Посмотрите на эту схему Рисунок 2. Здесь я нарисовал 16 регистров, соединенных последовательно – это и есть таблица Look-Up Table. Если установлен сигнал lds, и подавать тактовую частоту ldclk, то данные из входного сигнала ldi будут последовательно распространяться через все регистры на выход ldo. Таким образом, можно через последовательный интерфейс за 16 тактов загрузить всю таблицу. Входные сигналы in0, in1, in2, in3 все вместе являются селекторами для мультиплексора, который и выбирает результат из таблицы Look-Up, реализуя любую логическую функцию от четырех аргументов.

На языке описания аппаратуры Verilog можно описать такую Look-Up Table вот так:

Если посмотрите на Рисунок 1, то увидите, что выход LUT подключен ко входу данных триггера логического элемента. Однако, мой логический элемент имеет три выхода: один выход это выход триггера, который фиксирует значение LUT, второй – это выход непосредственно LUT и третий – это выход который идет на выходной пин моей мПЛИС. Для чего делать выход LUT? Если нужная логическая функция сложная, имеет больше 4х аргументов, то несколько LUT могут быть соединены каскадно, чтобы реализовать ее.

Небольшое замечание по поводу выходного пина. Видите мультиплексор, который выбирает источник сигнала для выходного пина? На выходной пин можно вывести либо выход LUT либо выход регистра. Этот мультиплексор так же программируемый и инициализируется при включении мПЛИС. Вообще в проекте много мультиплексоров и все они «программируемые». Давайте рассмотрим их подробнее.

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

Вот, например, четырехвходовый программируемый мультиплексор / коммутатор:

Селектор для мультиплексора берется с выходов двух триггеров, которые загружаются последовательно с помощью сигналов ldi, ldclk и lds за 2 такта. Вход ldi и выход ldo используются для последовательного соединения всех модулей проекта. Вы помните, как сделана инициализыция LUT этими же сигналами? Здесь используется та же методика.

Реализация такого мультиплексора на Verilog может выглядеть вот так:

В моем проекте чрезвычайно простой мПЛИС из четырех логических элементов используются 4-х и 8-ми входовые программируемые коммутаторы.

Так, например, каждый вход LUT имеет 8ми входовый коммутатор, который позволяет подключить к нему либо любой из выходов любого триггера любого Логического Элемента, либо выход LUT любого логического элемента (кроме выхода своего LUT) либо один из входов ПЛИС.  Вот посмотрите на этот ужасный Рисунок 4:

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Зелеными линиями показаны все возможные связи, которые уже как бы реализованы. Только одно соединение из восьми возможных для каждого входа каждого LUT станет активным после загрузки пользовательского проекта благодаря программируемым мультиплексорам.

Кроме этого, каждый Логический Элемент имеет вход тактовой частоты и к нему, с помощью программируемого 4х входового коммутатора/мультиплексора можно подключить либо «глобальный» сигнал тактовой частоты  (есть у меня в мПЛИС и такой) либо один из выходов триггеров любого логического элемента, кроме выхода регистра своего Логического Элемента.

Точно так же 4х входовым программируемым мультиплексором можно комутировать входы Enable каждого логического элемента.

3. Загрузка пользовательского проекта в мПЛИС.

Еще раз про загрузку пользователького проекта в мою мПЛИС. Я уже говорил, что каждая LUT и каждый программируемый мультиплексор используют для загрузки (начальной инициализации) сигналы ldi, ldclk, lds и ldo. Выход ldo одного модуля соединен со входом ldi следующего и так далее. С помощью этих сигналов все компонены ПЛИС объединены в один очень длинный последовательный регистр, содержащий образ пользовательского проекта – «прошивку».

Чтобы проект стартовал в нашей ПЛИС нужно на вход lds подать единицу, на вход ldi последовательно задвигать образ проекта синхронно с тактовой частотой ldclk. Образ проекта пройдет «насквозь» все модули и выйдет на выход ldo последнего модуля.Вот так инициализируется один логический элемент и его связи (а таких элементов у меня всего четыре):

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

В исходном состоянии все триггера в которые загружается образ проекта содержат нули. Первый загружаемый бит в нашей прошивке должен быть всегда единицей – это будет признаком окончания загрузки. Как только на выходе ldo последнего модуля появляется единица – значит пора останавливать загрузку проекта и мПЛИС переходит в рабочее состояние.

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

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

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

А действительно, чем страшны эти обратные связи? Да просто схема может не работать, она может, например возбуждаться или оказываться в каком-то неизвестном состоянии. Такие обратные связи могут плохо симулироваться.

Ну конечно, если пользователь разработал устройство с такими обратными связями, то это остается на его совести. А что делать мне, разработчику мПЛИС, когда такие неправильные связи будут самопроизвольно образовываться где-то в процессе последовательной загрузки мПЛИС?

Я собственно понял, что в моем проекте что-то не правильно, когда iverilog отказывался симулировать мой проект. Причем некоторые проекты-образы я тестбенчем спокойно загружал в мою мПЛИС и симулировал, а некоторые образы (без изменения собственно схемы мПЛИС) приводили к краху симулятора iverilog в процессе загрузки образа.

Пришлось предпринять дополнительные меры, чтобы во время загрузки проекта он не работал. Я добился этого путем принудительного подавления выходных сигналов мультиплексоров в ноль во время активного сигнала lds.

Весь код на Verilog, описывающий мПЛИС можно посмотреть здесь.

После того, как код мПЛИС был написан нужно было как-то начинать его тестировать. Лучше всего начинать тесты с симуляции модулей. Для этих целей я написал специальный testbech на Verilog. Для симуляции я использую чрезвычайно простое средство iverilog (Icarus Verilog).

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

Формат текстового файла для проектов мПЛИС я выбрал / придумал вот такой:

Это текстовый файл.

В начале каждой его строки в двоичном виде описан байт. Мне предстоит «побитное ручное программирование», типа как раньше в перфокартах дырочки пробивали

Каждый байт в строке я мысленно делю на 2 половины по 4 бита. Старшая тетрада обозначает сколько бит из младшей тетрады являются значимыми.В мПЛИС будет загружаться младшая тетрада старшими битами вперед, но только несколько бит. Например, первый байт всегда «00011000» – это значит взять и записать в мПЛИС один бит из младшей тетрады, в данном примере это единица. Этот бит, когда последовательно насквозь пройдет все триггера содержащие прошивку в мПЛИС, выйдет на последнем сигнале ldo и обозначает конец загрузки проекта – это как сигнал CONFIG_DONE.

Этот формат мне кажется удобным, потому, что я могу сразу четко выделить строки, который отвечают за разные компоненты проекта мПЛИС. Так, следующий одиночный бит (описываемый как 00011000, тоесть 0001 бит из потока 1000) конфигурирует выходной пин мПЛИС. Он определяет пин подключен к LUT или триггеру логического элемента. Дальше идут 4 строки по 4 бита – это значение таблицы LUT. Потом 4 строки по 3 бита – программируют мультиплексоры на входах LUT. Ну и так далее. Все вместе должно позволить мне мысленно создавать прошивку и описывать ее битами в файле.

Такой текстовый файл можно легко считать с помощью тестбенча на языке Verilog:

После того, как файл считан в массив value, тестбенч загружает образ проекта в мПЛИС. Для этого я написал задачу sendbits. Ей нужны параметры num_bits (это старшая тетрада каждого байта массива) и val – это младшая тетрада байта массива.

#5 ldclk = ~ldclk;

Еще одна задача, которую решает мой тестбенч – создание файла, описывающего содержимое flash памяти UFM реальной ПЛИС, в которой я потом собираюсь пробовать мой мПЛИС. Файл с расширением *.MIF – Memory Initialization File нужен квартусу для компиляции проекта для платы Марсоход и ее чипа MAX II.

Весь текст программы тестбенча можно посмотреть вот здесь.

Интересно, что получается при симуляции проекта. Сперва я компилирую тестбенч и мПЛИС с помощью iverilog (запуск из командной строки)

Потом вручную готовлю несколько разных текстовых файлов – прошивок для мПЛИС image.dat и с ними запускаю симулятор:

Просмотр получившихся временных диаграмм  делаем с помощью утилиты gtkwave из комплекта iverilog.

При симуляции проекта мПЛИС ведет себя по-разному в зависимости какой image.dat дашь симулятору. Тестбенч считывает его и загружает его в мПЛИС. Иными словами – что загружается в мПЛИС, так она и работает!

Вот теперь самое интересное – несколько проектов для мПЛИС, которые я разработал.

5. Тестовые проекты для мПЛИС.

5.1. Четырехбитный битный двоичный счетчик

У меня нет компилятора для моей мПЛИС, но первое, что я хотел сделать для нее на Verilog выглядит вот так:

Я ручками «скомпилировал» этот код в вот такой файл для мПЛИС:

После симулирования смотрим временные диаграммы в gtkwave и убеждаемся, что счетчик работает правильно:

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

5.2. Четырехбитный счетчик по модулю 10

На языке Verilog такой счетчик можно описать вот так:

Для того, чтобы сделать счетчик по модулю 10 нужно всего-навсего взять мой предыдущий проект двоичного счетчика и заменить таблицы LUT для трех старших регистров счетчика. Это я и сделал:

Результат симуляции получается вот такой:

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Максимальное число на счетчике получается 9, что и требовалось.

5.3. Трехбитный счетчик с выходом COUT.

Вот код счетчика с дополнительным выходом COUT:

cout; cout = (counter == 3’b111);

Для реализации такого кода требуется три регистра со своими LUT и еще одна просто LUT нужна для вычисления COUT.Обратите внимание, во второй строчке «pin3 out select» выбирает для выходного пина выход LUT.

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

5.4. Сдвиговый регистр.

Значения сигналов на входних пинах мПЛИС объединяются по «ИЛИ» и заносится в младший разряд сдвигового регистра.Все четыре триггера сдвигового регистра выведены на выходные пины.

Код проекта, который я хочу сделать на Verilog:

Я вручную «скомпилировал» этот код в вот такой файл для своей мПЛИС:

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Итак, у меня получилось сделать простейшую программируемую «маленькую ПЛИС» из четырех элементов!

Однако все это была теория. А сможет мой код описывающий мПЛИС работать внутри настойщей ПЛИС? Может!

6. Проект мПЛИС для платы Марсоход

После того, как код был протестирован на симуляторе, я решил испытать его в реальной ПЛИС. Был сделан проект для платы Марсоход. Схема проекта (самый верхний уровень) выглядит вот так:

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

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

Еще несколько замечаний по сигналам проекта.

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

Весь проект можно взять здесь:

Выше я показывал 4 проектика для мПЛИС – это двоичный счетчик, счетчик по модулю 10, счетчик с сигналом COUT и сдвиговый регистр.

7. Кому это надо?

Я обещал рассказать, зачем все это может понадобиться.

Конечно, это сугубо мое мнение, мне кажется, что в ближайшем будущем логические элементы ПЛИС станут неотъемлимой частью очень многих микросхем: процессоров, систем на кристалле, image sensors и прочих. Этот процесс уже потихоньку идет.

Может и нам нужно подумать в эту сторону?

  • проектирование ПЛИС
  • Look-Up Table
  • Verilog
  • Verilog testbench
  • Icarus Verilog
  • проект Quartus II

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

Выход из сложившейся ситуации напрашивается сам собой и заключается он в том, чтобы рядом с ПЛИС разместить микросхему памяти и из нее каждый раз после подачи питания загружать прошивку. Единственное, что стоит добавить, что прошивка хранится не в обычной флэшке, а в специальной микросхеме — последовательно конфигурационном ПЗУ. У Altera — это микросхемы серии EPCS или EPCQ, программируемые по интерфейсу Active Serial. Это и есть второй способ, смысл его в том, чтобы запрограммировать микросхему последовательно конфигурационного ПЗУ, а после подачи питания ПЛИС вычитает из неё прошивку.Но тут напрашивается другой вопрос, получается для программирования микросхемы последовательно конфигурационного ПЗУ необходим отдельный разъем?Оказывается разработчики ПЛИС позаботились об этом и ПЛИС может выступать посредником между интерфейсами JTAG и Active Serial. То есть получает она прошивку по JTAG интерфейсу, а записывает её в ПЗУ, используя Active Serial. С теорией разобрались и можно приступать к практике.

Загрузка прошивки в ПЛИС через jtag интерфейс.

По моей просьбе продавец отправил мне на почту схему отладочной платы и несколько простых проектов. В одном из проектов был найден файл с расширением .sof, который необходим для прошивки. Для того, чтобы прошить ПЛИС по jtag необходимо:

  • запустить Quartus
  • выбрать Programmer во вкладке Tools

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Загрузка прошивки в ПЗУ с интерфейсом Active Serial через jtag.

В той же папке откуда был взят файл .sof был найден файл с расширением .pof. Файлы с таким расширением необходимо зашивать, подключившись непосредственно к ПЗУ, но мне хотелось прошить плату без лишних телодвижений через jtag. Для этого из файла .sof необходимо было получить файл с расширением .jic.

Для конвертации .sof файла в .jic необходимо:

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

  • в открывшемся меню выбрать в поле Programming file type выбрать JTAG IndirectConfiguration File (.jic)
  • в поле Configuration device выбираем тип ПЗУ, расположенного на плате
  • в поле Mode выбираем режим прошивки
  • в поле File name определяем имя и директорию выходного файла

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Теперь подготовленный файл можно скормить ПЛИС, а она изменит прошивку ПЗУ.

Как снять слой 64х64 с коннектора?? и проекты Altera Quartus II для борта марсохода

Оцените статью
Huawei Devices
Добавить комментарий