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 в секунду.
vak: (Default)
Довёл я наконец до ума библиотеку асинхронных компонентов для Xilinx FPGA, и затолкал на плату пример вычисления наибольшего общего делителя. В большинстве случаев он даже корректно работает. :) Вводим с переключателей два шестнадцатеричных числа, нажимаем на кнопку, получаем результат. Вот как это выглядит:



Здесь НОД(0x34, 0x27) даёт результат 0xd. В десятичном виде это НОД(52, 39) -> 13.

Но иногда схема врёт. И это ожидаемо, так как для арифметических вычислений я полагаюсь на синтезатор Xilinx Vivado, а он без понятия, что надо генерить "позитивную" логику. Задействовать стандартные примитивы типа CARRY4 нельзя, потому что нарушается монотонность. Получаются вот такие глюки:



Можно видеть, что сигналы out_hidata и out_lodata иногда встают одновременно, и это ошибка. Долдно быть так:



Выход в том, чтобы не доверять арифметические вычисления стандартному синтезатору Verilog, а порождать нужную позитивной логики в структурном виде. Тогда синтезатор уже не сможет ничего испортить.
vak: (Default)
Появилась статья, суммирующая положительный опыт применения открытого процессорного ядра MIPSfpga в образовательных целях.

https://www.ncsu.edu/wcae/ISCA2017/papers/chaver.pdf
vak: (Default)
В продолжение темы 1, 2: слушайте радиопередачу про предстоящий на следующей неделе в Киеве семинар по микроэлектронике для школьников.

Аудиофайл (на украинском языке): https://hromadskeradio.org/sites/default/files/media/zvuk/hr_hh_2017-04-22_hutka.mp3

Частичная расшифровка: "Українські школярі вчитимуться проектувати мікросхеми, які застосовують Аpple та Tesla"
vak: (Default)
В конце апреля в Киеве пройдёт экспериментальный семинар для старших и младших школьников по обучению современной цифровой электронике. Программа семинара и форма для регистрации доступны на сайте: http://electronics-ukraine.com/


vak: (Default)
С какой максимальной скоростью может работать асинхронный процессор на FPGA? Многие считают, что это в принципе невозможно, а я тем временем решил измерить реальную цифру. Возьмём пустой цикл следующего вида:
    forever
        continue;
Еслибы существовал транслятор с SystemVerilog в асинхронные компоненты, он бы породил такую схему:
                 ,---. out ,---.
    activate ---o| # |----o|run|
                 `---'     `---'
                 Loop     Continue
Примитив Continue я уже упоминал недавно. Loop это компонент, реализующий бесконечный цикл. У него два синхропорта: по ведомому порту он получает сигнал активации, после чего начинает генерить последовательность импульсов на ведущем порту. Реализуется он следующим образом:
    module Loop (sync.slave activate, sync.master out);

        wire req = activate.req & !out.ack;

        BUFR b (.O(out.req), .I(req));

        assign activate.ack = '0;
    endmodule
Работает схема так:



С точки зрения формальной логики буфер BUFR здесь не требуется. Однако без него схема не работает. У семейства Xilinx Artix7 есть три типа подходящых буферов на выбор: BUFG, BUGH и BUFR. Я загрузил прошивку в плату Digilent Basys3 и измерил результат для всех трёх вариантов. Самая высокая частота получается с BUFR, а именно 309 МГц. Это будет верхний предел для скорости асинхронного процессора на данном типе FPGA.
vak: (Default)
Все слышали про курский вокзал FPGA, но мало кто видел. :)
Внутреннее устройство самого хитрого элемента FPGA, а именно четёрехвходовой логической таблицы LUT4, можно увидеть на рисунке из патента US6667635:

Patent US6667635

Шестнадцать элементов RB 301-316 с левой стороны это биты сдвигового регистра, задаваемые при конфигурации микросхемы FPGA. Дальше ряд вентилей 311-326 попарно выбирает значения, в зависимости от входа IN1. Полученные 8 бит поступают на вход следующего ряда вентилей 331-338. Из них выбираются 4 бита в зависимости от входа IN2. Вентили 351-354 превращают их в два бита под управлением входа IN3. В конце концов вентили 361 и 362 выдают результат.
vak: (Улыбка)
Так выглядит самый маленький чип из семейства Xilinx Artix-7 (xc7a15ti), заполненный вентилями TH22 на 88%.





У диджилента есть подходящая платка с этим чипом, всего за $75.

Сюда помещается 8150 асинхронных гейтов - больше, чем 4656 в чипе xc3s500e. Но на самом деле эффективность использования чипа хуже, так как из-за архитектурных ограничений Artix-7 удаётся задействовать только 12.5% от имеющихся регистров. В семействе Spartan-3 были доступны 50% регистров.
vak: (Улыбка)
Как много NCL-вентилей можно поместить в FPGA? По одному в каждый слайс. Вот пример чипа xc3s500e, набитого гейтами TH22 под завязку: всего 4656 вентилей, по числу слайсов.



+3 )
vak: (Улыбка)
Обычно считается, что FPGA не годятся для асинхронной логики. Родной софт от Xilinx способствует этому предубеждению: при попытке создать latch традиционными средствами языка Verilog, к примеру:
    always @(*)
        if (set)
            z <= 1;
        else if (clr)
            z <= 0;
получаем серию страшных предупреждений типа:
WARNING:Xst:737 - Found 1-bit latch for signal <z>. Latches may
be generated from incomplete case or if statements. We do not
recommend the use of latches in FPGA/CPLD designs, as they may
lead to timing problems.

(*) This 1 clock signal(s) are generated by combinatorial logic,
and XST is not able to identify which are the primary clock signals.
Please use the CLOCK_SIGNAL constraint to specify the clock signal(s)
generated by combinatorial logic.

WARNING:PhysDesignRules:372 - Gated clock. Clock net clr is sourced by a
combinatorial pin. This is not good design practice. Use the CE pin to
control the loading of data into the flip-flop.
Между тем, задача отлично решается посредством компонента FDCPE из библиотеки Xilinx. Немного лёгкого шаманства, и он превращается в асинхронную защёлку:
module th22 (input a, input b, output z);
    assign set = a & b;
    assign clr = !a & !b;

    FDCPE latch (
        .Q   (z),      // Data output
        .D   (0),      // Data input
        .C   (0),      // Clock input
        .CE  (0),      // Clock enable 
        .PRE (set),    // Asynchronous set 
        .CLR (clr)     // Asynchronous clear 
    );
endmodule
vak: (Улыбка)
Основной сайт проекта: http://www.clifford.at/yosys/
Исходники на Гитхабе: https://github.com/cliffordwolf/yosys
Краткое введение: http://www.clifford.at/yosys/files/yosys-austrochip2013.pdf
Полное описание: http://www.clifford.at/yosys/files/yosys_manual.pdf

Характеристики:
• Обрабатывает практически любой синтезируемый дизайн на языке Verilog-2005.
Преобразует Verilog в BLIF / EDIF / BTOR / SMT-LIB / упрощённый RTL Verilog / и т.п.
Встроенные формальные методы проверки свойств и эквивалентности.
Отображение на стандартные библиотеки ASIC (в формате Liberty).
Отображение на Xilinx 7 серии и Lattice iCE40 FPGA.
vak: (Улыбка)
Полезная страничка для построения карт Карно произвольных логических функций: http://tablica-istinnosti.ru/ru/

К примеру, вводим функцию: A ∨ B ∧ C ∧ D

Получаем:
A B C D

Для построения карты Карно, построим таблицу истинности данной функции:

A
B
C
D
B C
B C D
A B C D
0 0 0 0 0 0 0
0 0 0 1 0 0 0
0 0 1 0 0 0 0
0 0 1 1 0 0 0
0 1 0 0 0 0 0
0 1 0 1 0 0 0
0 1 1 0 1 0 0
0 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 1 0 0 1
1 0 1 0 0 0 1
1 0 1 1 0 0 1
1 1 0 0 0 0 1
1 1 0 1 0 0 1
1 1 1 0 1 0 1
1 1 1 1 1 1 1

После этого заполним карту Карно, используя полученные значения:

AB\CD 00 01 11 10
00 0 0 0 0
01 0 0 1 0
11 1 1 1 1
10 1 1 1 1
vak: (Улыбка)
Такое ощущение, что грядёт тихая революция в области цифровой логики: переход на асинхронный дизайн. Любопытный, но малоизвестный факт: в 2012 году Интел предоставил стартапу Achronix свои заводы для производства асинхронных FPGA-чипов.

Есть несколько методологий асинхронного дизайна. Одна из них, под названием Null Convention Logic (сокращённо NCL), в качестве базового элемента использует так называемый пороговый вентиль. Обозначается он так:



Как и традиционный логический вентиль типа И или ИЛИ, он имеет несколько входов, один выход и, возможно, инверсию выхода. Кроме того, у него есть параметр M - порог срабатывания. К примеру, вентиль с порогом 2 переходит в активное состояние, когда как минимум два входа активны. В неактивное состояние пороговый вентиль переходит, когда все входы неактивны. Заметьте: вентиль с порогом M>1 обладает гистерезисом. Пока количество активных входов меньше порога, он сохраняет предыдущее состояние.

Из таких вентилей, применяя dual-rail протокол, можно строить цифровые логические схемы произвольной сложности. Например, так выглядит однобитный полный сумматор:


Для сравнения, полный сумматор на традиционной логике:



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


Представьте, что через некоторое время, усилиями биохимиков и генетиков, можно будет выращивать "живые" нейронные сети заданной конфигурации. Если вы помните, в известной новелле Азимова про три закона робототехники, всё начиналось с изобретения позитронного мозга. Возможно, не так долго осталось ждать.

До сих пор разработка асинхронных логических схем осложнялась отсутствием возможности прототипирования и отладки их с использованием FPGA. Чипы Achronix могут поправить ситуацию.