vak: (Знайка)
Свет не сошёлся клином на Altera и Xilinx. Немецкая фирма Cologne Chip производит FPGA собственной архитектуры под названием GateMate. Olimex выпускает платы для разработчиков GateMateA1-EVB по цене от 50 евро.

Народ запихнул в эту FPGA процессор 8080 и запустил на нём древнюю игрушку Space Invaders. Исходники на Верилоге: gitlab.com/x653/spaceinvaders-fpga

vak: (Default)
Появилась опенсорсная реализация процессора 80186 для FPGA. Не только процессор, но и микрокод, биос и вся периферия компьютера. Работает как PC/XT на частоте 68 МГц, то есть в 14 раз быстрее. Прикольно было бы сварганить XT-шку в формате Raspberry Pi, с диском в сети через WiFi.

Сайт проекта: https://www.jamieiles.com/80186/

Исходники на гитхабе: https://github.com/jamieiles/80x86





vak: (Default)
Шпаргалка по установке бесплатной линуксной версии симулятора Questa, бывшего Modelsim. Для чайников: это такая хрень, которая позволяет запускать код, написанный на языке Verilog или SystemVerilog. Или VHDL.

(1) С этого сайта на закладке Individual Files скачиваем пакет "QuestaSetup-21.1.1.850-linux.run".

(2) Делаем файл выполняемым и запускаем. При установке выбираем версию Starter Edition.

(3) Дополнительно ставим нужные линуксные библиотеки: "sudo apt install lsb".

(4) Добавляем папку <dir>/questa_fse/linux_x86_64 в PATH. После этого Modelsim можно вызывать из командной строки.

(5) Вызываем lmhostid, чтобы определить уникальный идентификатор компьютера. Получим одно или несколько значений, каждое из 12 шестнадцатеричных цифр. Нужно только одно значение, любое.
$ lmhostid
lmhostid - Copyright (c) 1989-2019 Flexera. All Rights Reserved.
The FlexNet host ID of this machine is ""e7e664a4555e f96512dc7fc4""
Only use ONE from the list of hostids.
(6) На этом сайте регистрируемся и создаём лицензию "Questa-Intel FPGA Starter Edition". Это бесплатно. В качестве идентификатора выбираем NIC ID и вводим полученное на предыдущем шаге значение. Файл лицензии приходит по email.

(7) Сохраняем файл лицензии и устанавливаем переменную окружения LM_LICENSE_FILE, указывающую его полный путь.

vak: (Default)
Неплохая идея: превратить Raspberry Pico в программатор для Xilinx FPGA. Исходники здесь: https://github.com/kholia/xvc-pico

Но не Xilinx единым жив человек. В основе лежит более общая идея JTAG адаптера для произвольных целей: https://github.com/phdussud/pico-dirtyJtag/

Я как раз вчера искал простой пример компиляции встроенного софта для RP2040, и вот нате.

vak: (Default)
Компилятор Xilinx Vitis HLS построен на основе LLVM. Исходные тексты недавно появились на гитхабе: https://github.com/Xilinx/HLS

Компилятор преобразует программу на языке Си или Си++ в цифровую логику для FPGA. Как там оно всё устроено - ещё предстоит разбираться, но проект многообещающий. Можно попробовать пристегнуть какой-нибудь другой backend и приспособить для чего-нибудь полезного.

vak: (Default)
Один крутой чувак умудрился запустить игру Doom на чипе программируемой логики FPGA.



Вот такая платка за $65: iCEBreaker с чипом Lattice iCE40UP5k FPGA.

Исходные тексты: https://github.com/smunaut/ice40-playground/tree/master/projects/riscv_doom
vak: (Default)
В копилку ценных исходников: открытая реализация точки доступа Wi-Fi на FPGA.

https://github.com/Nuand/bladeRF-wiphy/
vak: (Default)
Евгений [personal profile] x86128 достиг первых успехов с МЭСМ-6 на плате FPGA. На видео видно, как выполняется простейшая программа из трёх команд:
start start '1'
      xta   '77755' ; читаем из GPIO (Switches)
      atx   '77756' ; пишем в GPIO (Leds)
      uj    start
В верхних адресах находятся регистры периферийных устройств. Программа читает состояние переключателей и записывает его в регистр управления 7-сегментным индикатором.


Подробнее о проекте: https://github.com/besm6/mesm6/wiki

Блог проекта: [community profile] besm6
vak: (Default)
Вячеслав Овсиенко закончил реверс-инжиниринг процессора 1801ВМ2. Исходный код и скрипты для сборки находятся здесь: https://github.com/1801BM1/cpu11/tree/master/vm2

Процессор К1801ВМ2 имеет архитектуру DEC PDP-11, включая расширенный набор команд EIS. Он был разработан в 1982 году, и на нём выпускались компьютеры ДВК-3 и УКНЦ.

vak: (Default)
TinyFPGA - плата FPGA на основе чипа Lattice iCE40 LP8K. В качестве софта используется Yosys, Verilog-синтезатор с открытыми исходными текстами. Плату можно купить за $55 на Ebay.



Вот так выглядит пример мигания светодиодом:



В чипе FPGA имеется 7680 элементарных ячеек (LUT4 плюс триггер) и 16 килобайт блочной памяти. В принципе, должно хватить для МЭСМ-6 в минимальной конфигурации.

Интересно, что в качестве среды программирования задействован редактор Atom. Может быть и нам такой подход сгодится.
vak: (Default)
Платформа состоит из основной платы DE10-Nano ($130) и нашлёпки Super Expansion Board ($60).

На плате DE10-Nano стоит FPGA Intel CycloneV 5CSEBA6U23I7 со встроенным 2-ядерным процессором ARM Cortex-A9. Плюс гигабайт памяти DDR, micro-SD, порты HDMI, Ethernet, USB, ADC.



Дополнительная плата DE-10 Super Expansion Board добавляет часы реального времени, разъём VGA, 32 мегабайта статической памяти, порты VGA и аудио, ещё одну micro-SD и вентилятор.



Исходники и документация лежат на Гитхабе: https://github.com/MiSTer-devel/Main_MiSTer/wiki

Вот пример реализации БК-0011 на этой платформе: https://github.com/MiSTer-devel/BK0011M_MiSTer
vak: (Default)
Год назад я закончил разработку процессора микро-БЭСМ. Проект не получил никакого резонанса в социуме, тем не менее надо будет когда-нибудь довести его до реализации в железе. К примеру на плате DE10-Lite с чипом Altera MAX 10. Получится нечто вроде Arduino, но с системой команд типа БЭСМ-6.



Путь долгий, впрочем. Главное препятствие - теговая архитектура памяти, которая плохо ложится на современную шину адрес/данные. Стоит задача переделать архитектуру и перенести нужные биты из тега (на каждое слово) в регистры приписки (на каждую страницу). Совместимость со старым софтом обеспечивать не нужно, ведь его всё равно нету.

План следующий.
1. Создать ассемблер , который бы работал под Линуксом и понимал системы команд 64-битного режима и 48-битного (бэсм6).
2. Переписать имеющийся комплексный тест на новый ассемблер.
3. Разбить огромный комплексный тест на отдельные составляющие, для упрощения тестирования и модификации.
4. Поправить архитектуру: перенести бит режима бэсм6 и биты защиты в таблицу страниц (регистры приписки).
5. Поправить соответствующие тесты.
6. Изменить процессор (RTL) нужным образом.
7. Изменить микрокод. Поправить тесты микрокода.
8. Изменить внешнюю шину (RTL) так, чтобы она стала совместимой с реализацией на FPGA.
9. Добавить интерфейс к внешней памяти RAM. На плате DE10-Lite её как раз 8 мегабайт.
10. Переделать контроллер прерываний.
11. Добавить периферийные устройства: внешние кнопочки, светодиоды и UART.
12. Запустить на реальной плате.

Как заработает, дальше набор внешних устройств можно расширять: SD-карточка, графический дисплей, SPI, PWM и т.д. Параллельно неплохо бы еще сделать софтверный симулятор на основе SIMH: сильно помогает в отладке софта.
vak: (Default)
NVidia выложила в открытый доступ исходные тексты вычислителя для искусственного интеллекта. Я насчитал в сумме 916 тысяч строк кода на Верилоге. Причём код регулярный и без комментариев: такое ощущение, что сгенерён с какого-то более высокоуровневого языка.

Исходники здесь: https://github.com/nvdla/hw
vak: (Default)
Я наконец осилил back annotation в Верилоге. Это когда синтезируется прошивка для Xilinx FPGA, и на этапе, когда уже известно точное расположение всех элементарных примитивов, образуется файл с описанием всех задержек для каждого провода и логического вентиля. Даже есть такой стандартный формат SDF, или Standard Delay Format. После этого синтезированная схема преобразуется обратно в Верилог (структурный) и симулируется, загружая SDF-файл как набор параметров тайминга. Предполагается, что временная диаграмма такой симуляции будет примерно соответствовать реальному железу.

Вот что я получил для упомянутого сигнала цикла вычисления наибольшего общего делителя. Цикл в 20 итераций должет выполняться за 99500 пикосекунд, или почти ровно 100 нсек.



В реальности на осциллографе имеем 500 нсек.



Как-то точность времянки не особо радует. Плюс-минус порядок получается.
vak: (Default)
Так выглядит сигнал цикла вычисления асинхронного НОД на чипе Xilinx Artix-7. Сигнал сильно смазанный, увы, так как мой осциллограф Rigol DS1102E имеет полосу пропускания всего 100МГц.

Async GDC(20,1) on Rigol DS1102E scope
vak: (Default)
Асинхронный наибольший общий делитель на микросхеме Xilinx FPGA Artix-7 занимает вот такое количество ресурсов:
Report Cell Usage:
+----------+------+
|Cell |Count |
+----------+------+
|BUFR | 2|
|LUT2 | 236|
|LUT3 | 4|
|LUT4 | 153|
|LUT5 | 26|
|LUT6 | 102|
|LUT6_2 | 28|
+----------+------+
Здесь LUT2-LUT6 это элементарные логические функции с несколькими входами и одним выходом. Примитив LUT6_2 чуть сложнее, он имеет два выхода. BUFR это повторитель-усилитель сигнала.
vak: (Default)
Вот что происходит с альтеровским софтом Quartus II при попытке синтезировать простую схему асинхронного счётчика, содержащую LUTs с обратными связями.
Фатальная ошибка )
Это если поставить для таких ячеек параметр dont_touch="yes", иначе квартус их просто тихо выкидывает из схемы.
vak: (Default)
Конфигурируем отладочный порт USB Bus Blaster для плат Altera FPGA DE10-Lite под линуксом.

(1) После установки Altera Quartus создаём файл /etc/udev/rules.d/51-altera.rules со следующим содержимым:
# Altera bus Blaster
SUBSYSTEM=="usb",\
ENV{DEVTYPE}=="usb_device",\
ATTR{idVendor}=="09fb",\
ATTR{idProduct}=="6001",\
MODE="0666",\
NAME="bus/usb/$env{BUSNUM}/$env{DEVNUM}",\
RUN+="/bin/chmod 0666 %c"
(2) Активируем новое правило:
$ sudo udevadm control --reload
(3) Копируем данные для работы альтеровского сервиса jtagd:
$ sudo cp /opt/Altera/16.1/quartus/linux64/pgm_parts.txt /etc/jtagd/jtagd.pgm_parts
(4) Чиним известную багу "Unable to read device chain - JTAG chain broken":
$ sudo apt-get install libudev1:i386
$ sudo ln -sf /lib/x86_64-linux-gnu/libudev.so.1 /lib/x86_64-linux-gnu/libudev.so.0
(5) Подключаем плату FPGA и проверяем, что порт работает:
$ /opt/Altera/16.1/quartus/bin/jtagconfig
1) USB-Blaster [4-1]
  031050DD   10M50DA(.|ES)/10M50DC
vak: (Default)
Измерил скорость работы асинхронного алгоритма вычисления наибольшего общего делителя на Xilinx FPGA. Цикл в 20 итераций выполняется чуть меньше чем за 500 наносекунд. Получается 25 нс на итерацию, или 40M итераций в секунду. Для сравнения, если собрать такую схему на рассыпухе (на микросхемах CD4007), будет 72 микросекунды на 20 итераций, или около 280k в секунду.