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 могут поправить ситуацию.