FPGA chips

Изучаем САПР Altera Quartus II / Intel Quartus Prime, язык описания аппаратуры Verilog HDL и кое-что про VHDL. Программируем FPGA Altera / Intel Cyclone III, Cyclone IV, MAX II, MAX10. Экспериментируем с платами разработчика  FPGA серии Марсоход, Марсоход2, Марсоход3. А еще разбираемся с FPGA Gowin.


Обнаружена ошибка в утилите программатора mbftdi. При программировании в Ubuntu Linux платы Марсоход2 из командной строки был возможен выход указателя за границы выделенного буфера. Ошибка вызывала Segmentation Fault и загрузки образа из SVF файла в ПЛИС Cyclone III не происходило. Сейчас ошибка исправлена.

Исходный текст (и exe для Windows) обновленной программы можно взять в разделе загрузки

Второй способ получить исходные тексты - это GitHub:

git clone https://github.com/marsohod4you/MBFTDI-SVF-Player.git

Для использования в Linux нужно откомпилировать программу. Для этого сперва возьмите библиотеки FTDI на их сайте: http://www.ftdichip.com/Drivers/D2XX/Linux/libftd2xx1.1.12.tar.gz и распакуйте где-то в домашней директории. Затем исправьте пути к библиотекам FTDI в файле linux/Makefile. Потом компиляция:

make

Получается исполняемый файл mbftdi.

К сожалению загрузка SVF файла в ПЛИС в Linux требует сперва выгрузить родной драйвер последовательного порта (так написано в документации FTDI):

sudo rmmod ftdi_sio

Затем программирование ПЛИС:

sudo ./mbftdi YourFile.svf

Потом можно опять загрузить драйвер последовательного порта:

sudo insmod ftdi_sio.ko

Только нужно знать путь к этому драйверу ftdi_sio.ko, обычно он лежит где-то в директории /lib

В ОС Windows можно просто брать исполняемый файл mbftdi.exe из архива и запускать его.

Вообще-то оригинальный проект Amber уже имел встроенный контроллер DDR. Я же его за ненадобностью выбросил, потому, что на нашей плате Марсоход2 стоит не DDR память, а SDRAM. Память SDRAM, конечно, проще, чем DDR. Она не требует отдельного питания и выделения специальных банков выводов с микросхемы ПЛИС. Однако, теперь у нас есть проблема – как подключить SDRAM к системе?

Не будем изобретать велосипед, а возьмем какой-нибудь готовый контроллер с opencores.org. Я выбираю вот этот:

OpenCores sdram controller

Похоже это то, что нужно:

Description

Feature:
• 8/16/32 Configurable SDRAM data width
• Wish Bone compatible
• Application clock and SDRAM clock can be async
• Programmable column address
• Support for industry-standard SDRAM devices and modules
• Supports all standard SDRAM functions
• Fully Synchronous; All signals registered on positive edge of system clock
• One chip-select signals
• Support SDRAM with four bank
• Programmable CAS latency
• Data mask signals for partial write operations
• Bank management architecture, which minimizes latency
• Automatic controlled refresh
• Static synchronous design
• Fully synthesizable

Выкачал исходники с сайта OpenCores (я говорил, что там много полезного можно найти) и положил их в папку нашего проекта Amber hw/vlog/sdram.

Вывод в консоль последовательного порта сообщения Hello, World!

Теперь уже работает – после нескольких исправлений в коде проекта Amber. Сейчас программа hello-world, написаннная на языке C и откомпилированная для ARM запускается в плате Марсоход2. Программа печатает сообщение функцией printf(..), которая отсылает его нам через последовательный порт на скорости 921600 бит/сек. А дело было так.

После первой неудачной попытки запустить проект Amber в плате Марсоход2 нужно подумать, что же делать дальше. Есть несколько вариантов:
Пункт первый – использование SignalTap, позволит «вживую» увидеть некоторые сигналы внутри процессора Amber, но проблема в том, что я точно не знаю куда смотреть, на какие сигналы обращать внимание. Все сразу посмотреть конечно нельзя, выбор сигналов для исследования требует последующей перекомпиляции, которая занимает время (примерно 12 минут на моем ноутбуке). Значит придется потратить довольно много времени на итерации исследуя одну или другую группу сигналов.

Пункт второй наверное самый правильный, поскольку позволит просимулировать все, включая такие родные компоненты Альтеры, как PLL или блоки памяти ALTSYNCRAM.
Честно говоря,  ModelSim мне не нравится – и главное причин в общем никаких нет – вполне нормальный инструмент. Наверное я его просто не до конца освоил.

Я буду пробовать симулировать с помощью Icarus Verilog, простой консольный симулятор. Конечно, сейчас моя симуляция будет не полной, она будет иметь ограничения связанные как раз с PLL и блоками памяти.

Итак, для нашей системы на кристалле нужна программа, которая бы стартовала из bootrom. Естественно, нужно начинать с чего-то самого простого. В папке нашего проекта Amber есть такая программа sw/hello-world. Я так понимаю при включении процессора он должен выводить в консоль, в последовательный порт вот это сообщение “Hello, World!”.

Попробуем!