mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 09:10:10 +00:00
Initial commit
This commit is contained in:
83
Introduction/About FPGA.md
Normal file
83
Introduction/About FPGA.md
Normal file
@@ -0,0 +1,83 @@
|
||||
# Хочу под ПЛИС!
|
||||
|
||||
`статья 2020 года`
|
||||
|
||||
Ну, раз хочешь под [ПЛИС](https://marsohod.org/index.php/ourblog/11-blog/265-fpga) проектировать, то мы просто не могли пройти мимо. Не очень дорогая, но невероятно универсальная для цифровой электроники вещь. Можно назвать не иначе, как конструктором Lego для взрослых, только детальки имеют нанометровые размеры, и ты можешь сделать все что угодно. Ну, пока «пластилин» не закончится, она ведь не резиновая, хотя современные дешевые ПЛИС позволяют разворачивать на себе относительно большие проекты.
|
||||
|
||||

|
||||
|
||||
Гибкость! Гибкость помогает реализовать просто гигантский полет фантазии. Хочешь, [нейроночку](https://habr.com/ru/post/349750/) [запусти](https://cyberleninka.ru/article/n/ustroystvo-na-osnove-plis-dlya-raspoznavaniya-rukopisnyh-tsifr-na-izobrazheniyah). Хочешь, [книжку небольшую](https://www.amazon.com/Designing-Video-Game-Hardware-Verilog/dp/1728619440) прочитай за недельку, да видео-игру запили. Или крутую обработку каких-нибудь данных для студенческого проекта или курсовой. Или процессор разверни, да не один, а сразу несколько, и все они зачем-то будут общаться друг с другом, [вон сколько](https://opencores.org/projects?expanded=Processor&language=Verilog) бесплатных доступно для скачивания. Да-да, для скачивания. [Процессор можно описать](https://ru.wikipedia.org/wiki/Soft-микропроцессор), например, на verilog (что ты и делаешь на лабах по АПС вообще-то) и просто скачать его код и развернуть у себя на отладке. Или [клеточный автомат](https://marsohod.org/projects/marsohod2/276-2014-09-04-09-57-27) реализуй, просто так, по-приколу. Или [измеритель дивергенции](http://www.mindspring.com/~tomtitor/index.html), почему нет. Или вот, в [интернетах ваших](https://marsohod.org), не менее 60 проектов различного уровня сложности, все в одном месте, и многое прям сделать хочется. ПЛИС — это настолько шикарная вещь, что легендарные the Beatles даже песню написали о желании приобрести ее. Так что не тормози, скорее заимей себе такую. Во-первых, это весело, а во-вторых это тебе точно пригодится в будущем.
|
||||
|
||||
Понимаю-понимаю. Область новая, неизведанная, как выбирать — не понятно, а вещь хоть и не самая дорогая, но и не особо дешевая, тем более для студента. Так что ниже, для тебя подготовлена подборочка недорогих ПЛИС от [Николая](https://://t.me/ternovoy_n) (ему можно задавать вопросы), которые точно сгодятся для [первых шагов](https://cxem.net/mc/mc380.php) в этот удивительный мир digital design.
|
||||
|
||||
На первых порах предлагается использовать проблемно-ориентированный подход в обучении. То есть, сразу поставь себе какую-нибудь простую задачу, связанную с разработкой на ПЛИС и пробуй ее решить, в процессе этого обучаясь. Получение результата вызывает невероятно позитивные эмоции, тем самым питает и помогает в достижении новых горизонтов.
|
||||
|
||||
В помощь тебе [классический курс по verilog hdl](http://iosifk.narod.ru/hdl_coding/verilog.htm) на русском. Про youtube и google/yandex не забывай, там легко найдешь ответы на первые вопросы о подключении и настройке. Про САПРы будет сказано в подборке.
|
||||
|
||||
А когда прям затянет и захочешь глубоко и серьезно, то вот тебе [отличная статья](https://habr.com/ru/post/281525/) со списком тем, которые должен освоить разработчик под ПЛИС, рекомендуемой литературой по каждой из тем, набором тестовых вопросов и лабораторных работ, а еще с классическими ошибками новичков и советами по их исправлению.
|
||||
|
||||
Итак, твоему вниманию представляется проштампованный список от команды АПС.
|
||||
|
||||
––
|
||||
|
||||
### Altera Cyclone IV EP4CE6 FPGA Development Board
|
||||
|
||||

|
||||
|
||||
**~3040 рублей**
|
||||
|
||||
Можно найти на [aliexpress](https://aliexpress.ru/item/32691369830.html?spm=2114.13010708.0.0.3bf733edolPr16).
|
||||
|
||||
Из достоинств этой платы, можно отметить относительно низкую цену, наличие базовой периферии для минимальной визуализации данных (есть семисегментные индикаторы). Данная плата максимально приближена к той, что вы будете использовать на лабораторных работах по АПС в 2020/2021 учебном году. Плюс уже знакомый САПР Altera Quartus II.
|
||||
|
||||
> Особенно внимательно нужно выбирать отладочные платы с aliexpress и ebay - бывают фейки, читай отзывы, комментарии. Указанная плата уже прошла проверку временем, и я могу быть уверен, что вы сможете получить обратную связь от производителя, в случае возникновения у вас проблем с доставкой или заводским браком. Так же, вы сможете найти открытые исходники электрической схемы на платы, схемы соединений и огромное количество демопроектов, на базе которых вы сможете начать свое обучение. Данную плату я заказывал лично 2 года назад, проблем с ней не было, но некачественно переведенная документация с китайского на английский немного осложняла мне работу.
|
||||
|
||||
––
|
||||
|
||||
### Отладочная плата с ПЛИС Altera EP2C5T144
|
||||
|
||||

|
||||
|
||||
**~ 1100 рублей**
|
||||
|
||||
[Еще одна отладка](https://www.ebay.com/itm/CycloneII-EP2C5T144-FPGA-Development-Board-ALTERA-USB-Blaster-JTAG-programmer/192501574934?hash=item2cd1fced16:g:88wAAOSw1m9axIQa) с ПЛИС от Altera, только с [ebay](https://www.ebay.com/sch/i.html?_from=R40&_trksid=m570.l1313&_nkw=Altera+CycloneII+EP2C5T144+FPGA+Mini+Development+Learn+Core+Board+E081&_sacat=0) и тоже доставка бесплатная. Еще дешевле предыдущих — несомненный плюс, но совсем нет периферии — минус. Но периферию эту всегда докупить можно, так что минус устраняемый. Написано, что доставляют по всему миру бесплатно, но иногда бывает, что весь мир не включает Россию — если узнаешь ответ, то скажи. Еще один как бы минус — для Cyclone II (именно такая ПЛИС тут и стоит) потребуется относительно старый САПР Quartus 13 (сейчас 19). Для начала пути это вообще никаких проблем создать не должно, а душа ведь просит последнюю версию. Но какая цена хорошая.
|
||||
|
||||
––
|
||||
|
||||
### TinyFPGA BX
|
||||
|
||||

|
||||
|
||||
**~ 2900 рублей**
|
||||
|
||||
[TinyFPGA BX](https://www.crowdsupply.com/tinyfpga/tinyfpga-ax-bx) одна из самых дешевых и доступных плат. Относительно низкая цена объясняется достаточно бедной периферией, однако для вас найдется 24 GPIO пина (конфигурируемых порта ввода\вывода), к которым вы сможете подключить различную периферию (например различные датчики температуры, движения, света, да всего, что угодно). На плате установлена ПЛИС [iCE40LP8K](https://www.latticesemi.com/ice40) фирмы [Lattice](https://www.latticesemi.com/en). Стоит отметить, что с ПЛИС данного семейства можно работать при помощи архаичного и «недружелюбного» САПРа [iceCUBE2](https://www.latticesemi.com/iCEcube2), однако данная ПЛИС полностью поддерживается и OpenSource проектом iceStorm, о котором подробнее можно прочитать по [ссылке](https://github.com/YosysHQ/icestorm).
|
||||
|
||||
––
|
||||
|
||||
### iCEBreaker FPGA
|
||||
|
||||

|
||||
|
||||
**~ 5500 рублей**
|
||||
|
||||
[Отладочная плата](https://www.crowdsupply.com/1bitsquared/icebreaker-fpga) на базе ПЛИС вендора Lattice, семейства [ice40UP](http://www.latticesemi.com/Products/FPGAandCPLD/iCE40UltraPlus).
|
||||
|
||||
Особенность данной платы заключается в том, что вокруг неё активно развивается OpenSourse сообщество. Зайди на страничку, посмотри видео. Работать с данной платой, можно не только используя САПР [Radiant](https://www.latticesemi.com/radiant) от вендора, но и пользоваться OpenSource проектом [iceStorm](https://github.com/YosysHQ/icestorm), подробнее об этом, вы сможете прочитать на их странице.
|
||||
|
||||
Периферии, кроме классических портов ввода\вывода (GPIO), кнопок и светодиодов — нет. Поэтому придется так же докупить необходимые модули и соединительные провода для их подключения.
|
||||
|
||||
––
|
||||
|
||||
В данный список, очень хотелось бы добавить современные отладочные платы от Xilinx (лидера по производству ПЛИС), однако в связи с санкциями, закупка плат данного вендора весьма проблематична, а местные дистрибьюторы достаточно сильно завышают цену. Однако, ситуация в любой момент сможет измениться, а для вас, как для студентов, доступна опция Academic Price – существенная скидка на покупку платы. Поэтому заинтересованным рекомендую мониторить [этот сайт](https://store.digilentinc.com).
|
||||
|
||||
Так же стоит отметить [сайт с платами](https://www.terasic.com.tw/en/) от Intel (Altera), но самая дешевая стоит 55$ по академической цене.
|
||||
|
||||
Конечно, есть варианты обхода доставки плат от официальных иностранных представителей через такие сервисы, как [Бандеролька](https://qwintry.com/ru) и прочие, но накладные расходы на доставку порой могут превышать стоимость самой платы. Поэтому о рентабельности данной затеи судить только вам самим. Либо! Вы можете написать мне о своем желании купить скопом, чтобы сэкономить, и когда наберется, скажем, человек 5, скооперироваться и сделать общий заказ.
|
||||
|
||||
––
|
||||
|
||||
### Проект Марсоход
|
||||
|
||||
Напоследок, не могу не поделиться с вами проектом [Марсоход](https://marsohod.org) (ссылки на него уже фигурировали выше). На их сайте вы найдете учебные материалы по основам цифровой схемотехники и разработки под ПЛИС. [Тут](https://marsohod.org/projects) приведена ссылка на проекты от Марсоход, которые реализованы под конкретные платы их собственного производства. В зависимости от заинтересовавшего вас проекта вы сможете выбрать подходящую вам плату.
|
||||
|
||||
Успехов!
|
188
Introduction/How FPGA works.md
Normal file
188
Introduction/How FPGA works.md
Normal file
@@ -0,0 +1,188 @@
|
||||
# Что такое ПЛИС и как она работает
|
||||
|
||||
- [Что такое ПЛИС и как она работает](#что-такое-плис-и-как-она-работает)
|
||||
- [История появления ПЛИС](#история-появления-плис)
|
||||
- [Цифровые схемы и логические вентили](#цифровые-схемы-и-логические-вентили)
|
||||
- [Цифровые схемы](#цифровые-схемы)
|
||||
- [Логические вентили](#логические-вентили)
|
||||
- [Мультиплексоры](#мультиплексоры)
|
||||
- [Таблицы подстановки (Look-Up Tables, LUTs)](#таблицы-подстановки-look-up-tables-luts)
|
||||
- [D-триггеры](#d-триггеры)
|
||||
- [Арифметика](#арифметика)
|
||||
- [Логическая ячейка](#логическая-ячейка)
|
||||
- [Выводы](#выводы)
|
||||
|
||||
## История появления ПЛИС
|
||||
|
||||
До появления интегральных схем, электронные схемы собирались из отдельных элементов, как модель, собранная из кубиков Lego. В случае, если при сборке электронной схемы была допущена ошибка, вы могли исправить её ручной корректировкой соединения элементов подобно исправлению ошибки, допущенной при сборке модели Lego.
|
||||
С улучшением технологических процессов произошла миниатюризация базовых элементов, из которых состоят электронные схемы, что привело к появлению интегральных схем — электронных схем, выполненных на полупроводниковой подложке и заключенных в неразборный корпус.
|
||||
В большинстве случаев, исправить ошибку, допущенную при разработке и изготовлении интегральной схемы становится невозможным. С учетом того, что изготовление прототипа интегральной схемы является затратным мероприятием (от десятков тысяч до миллионов долларов в зависимости от тех процесса и площади изготавливаемого кристалла), возникла необходимость в способе проверки прототипа схемы до изготовления её прототипа. Так появились **программируемые логические интегральные схемы** (**ПЛИС**).
|
||||
ПЛИС содержит некое конечное множество базовых блоков (примитивов), программируемые блоки межсоединений примитивов и блоки ввода-вывода. Подав определенный набор воздействий на ПЛИС (**запрограммировав** её), можно настроить примитивы, их межсоединения между собой и блоками ввода-вывода, чтобы получить определенную цифровую схему. Удобство ПЛИС заключается в том, что в случае обнаружения ошибки на прототипе, исполненном в ПЛИС, вы можете исправить свою цифровую схему, и повторно запрограммировать ПЛИС.
|
||||
Кроме того, эффективно использовать ПЛИС не как средство дешевого прототипирования, но и как средство реализации конечного продукта в случае малого тиража (дешевле купить и запрограммировать готовую партию ПЛИС, чем изготовить партию собственных микросхем).
|
||||
|
||||
Стоит оговориться, что обычно под термином ПЛИС подразумевается конкретный тип программируемых схем: **FPGA** (**field-programmable gate array**, **программируемая пользователем вентильная матрица**) здесь и далее термин **ПЛИС** будет использоваться как синоним **FPGA**.
|
||||
|
||||
Давайте разберемся что же это за устройство и как оно работает изнутри, но перед этим необходимо провести ликбез по цифровым схемам и логическим вентилям.
|
||||
|
||||
## Цифровые схемы и логические вентили
|
||||
|
||||
### Цифровые схемы
|
||||
|
||||
В электронике, словом "цифровая" описывают схемы, которые абстрагируются от непрерывных (аналоговых) значений напряжений, вместо этого используется только два дискретных значения: `0` и `1`. На текущем уровне абстракции нас не интересуют конкретные значения напряжений и пороги этих значений. К примеру, ПЛИС часто используются значения `1.2` В в качестве `1` и `0 В` в качестве `0`. Если реальным значением сигнала будет напряжение `0.8 В`, что достаточно близко к `1.2 В`, оно всё ещё будет считаться `1`.
|
||||
Цифровые схемы разрабатываются таким образом, чтобы устанавливать крайние значения напряжений (сигнал, имеющий значение напряжения `0.8 В`, пройдя через очередной логический вентиль будет иметь значение напряжения около `1.2 В`), что делает их крайне устойчивыми к шумам и влиянию внешнего мира.
|
||||
Таким образом, концепция "цифровой схемы" позволяет нам уйти от всего этого сложного поведения на уровне напряжений, давая нам возможность разрабатывать схему в идеальном мире, где у напряжения может быть всего два значения: `0` и `1`. А обеспечением этих условий будут заниматься базовые блоки, из которых мы будем строить цифровые схемы.
|
||||
|
||||
Эти базовые блоки называются **логическими вентилями**.
|
||||
|
||||
### Логические вентили
|
||||
|
||||
Существует множество логических вентилей, но чаще всего используется четыре из них: **И**, **ИЛИ**, **Исключающее ИЛИ**, **НЕ**. Каждый из этих элементов принимает на вход **цифровое значение** (см. [**цифровая схема**](#цифровые-схемы)), выполняет определенную **логическую функцию** над входами и подает на выход результат этой функции в виде **цифрового значения**.
|
||||
|
||||
Логический вентиль **И** принимает два входа и выдает на выход значение `1` только в том случае, если оба входа равны `1`. Если хотя бы один из входов `0`, то на выходе будет `0`. На схемах, логический вентиль **И** отображается следующим образом:
|
||||
|
||||

|
||||
|
||||
Логический вентиль **ИЛИ** принимает два входа и выдает на выход значение `1` в случае, если хотя бы один из входов равен `1`. Если оба входа равны `0`, то на выходе будет `0`. На схемах, логический вентиль **ИЛИ** отображается следующим образом:
|
||||
|
||||

|
||||
|
||||
Логический вентиль **Исключающее ИЛИ** принимает два входа и выдает на выход значение `1` в случае, если значения входов не равны между собой (один из них равен `1`, а другой `0`). Если значения входов равны между собой (оба равны `0` или оба равны `1`), то на выходе будет `1`. На схемах, логический вентиль **Исключающее ИЛИ** отображается следующим образом:
|
||||
|
||||

|
||||
|
||||
Логический вентиль **НЕ** является самым простым вентилем. Он принимает один вход и подает на выход его инверсию. Если на вход пришло значение `0`, то на выходе будет `1`, если на вход пришло значение `1`, то на выходе будет `0`. На схемах, логический вентиль **НЕ** отображается следующим образом:
|
||||
|
||||

|
||||
|
||||
Так же существуют вариации базовых вентилей, такие как **И-НЕ**, **ИЛИ-НЕ**, **Исключающее ИЛИ-НЕ**, отличающиеся от исходных тем, что их выходы инвертируются.
|
||||
|
||||
Логические вентили строятся из **транзисторов**. **Транзистор** — это полупроводниковый элемент, может пропускать/блокировать ток в зависимости от поданного напряжения на его управляющий вход.
|
||||
|
||||
На приведенном ниже рисунке показан способ построения логического вентиля **И** на базе двух транзисторов. Подача значения `1` на вход **А** или **B** "открывает" соответствующий транзистор. Если оба транзистора открыты, на выход идет **напряжение питания** (`1` в контексте **цифровых значений**). В случае, если хотя бы на одном входе **А** или **B** будет значение `0`, соответствующий транзистор будет закрыт (можно считать что он превратится в разрыв цепи). В этом случае выход будет подключен к **земле** (`0` в контексте цифровых значений). Как вы видите, напряжение на выход подается от **источников постоянного питания** или **земли**, а не от входов вентиля, именно этим и обеспечивается постоянное обновление напряжения и устойчивость **цифровых схем** к помехам.
|
||||
|
||||

|
||||
|
||||
Теперь, имея базовое представление о транзисторах и логических вентилях, мы можем построить из них что-то полезное. Используя одни лишь описанные выше логические вентили можно построить **любую(!)** цифровую схему.
|
||||
|
||||
Однако, при описаний цифровых схем, некоторые цифровые блоки используются настолько часто, что для них ввели отдельные символы (**сумматоры**, **умножители**, **мультиплексоры**), используемые при описании более сложных схем. Мы рассмотрим один из фундаментальных строительных блоков в ПЛИС — **мультиплексор**.
|
||||
|
||||
### Мультиплексоры
|
||||
|
||||
Мультиплексор — это устройство, которое в зависимости от значения **управляющего сигнала** подает на выход значение одного из входных сигналов.
|
||||
|
||||
Схематически, мультиплексор обозначается следующим образом:
|
||||
|
||||

|
||||
|
||||
Символ `/` на линии `sel` используется, чтобы показать что этот сигнал шириной 6 бит.
|
||||
|
||||
Число входов мультиплексора может быть различным, но выход у него всегда один.
|
||||
|
||||
**Способ, которым кодируется значение управляющего сигнала может также различаться**. Простейшая цифровая схема мультиплексора получится, если использовать `one-hot`-кодирование. При таком кодировании, значение **многоразрядного** сигнала **всегда** содержит **ровно одну** `1`. Информация, которую несет закодированный таким образом сигнал содержится в положении этой `1` внутри многоразрядного сигнала.
|
||||
|
||||
Посмотрим, как можно реализовать мультиплексор с управляющим сигналом, использующим `one-hot`-кодирование, используя только логические вентили **И**, **ИЛИ**:
|
||||
|
||||

|
||||
|
||||
Если мы выставим значение управляющего сигнала, равное `000010`, означающее что только **первый** бит этого сигнала (**счет ведется с нуля**) будет равен **единице** (`sel[1] = 1`), то увидим, что на один из входов каждого логического вентиля **И** будет подано значение `0`. Исключением будет логический вентиль **И** для входа `b`, на вход которого будет подано значение `1`. Это означает, что все логические вентили **И** (кроме первого, на который подается вход `b`) будут выдавать на выход `0` (см. [Логические вентили](#логические-вентили)) вне зависимости от того, что было подано на входы a,c,d,e и f. Единственным входом, который будет на что-то влиять окажется вход `b`. Когда он равен `1`, на выходе соответствующего логического вентиля **И** окажется значение `1`. Когда он равен `0` на выходе **И** окажется значение `0`. Иными словами, выход **И** будет повторять значение `b`.
|
||||
|
||||

|
||||
|
||||
Логический вентиль **ИЛИ** на данной схеме имеет больше двух входов. Подобный вентиль может быть создан в виде каскада логических вентилей **ИЛИ**:
|
||||
|
||||

|
||||
|
||||
**Многовходовой вентиль ИЛИ** ведет себя ровно так же, как двухвходовой: он выдает на выход значение `1` когда хотя бы один из входов равен `1`. В случае, если все входы равны `0`, на выход **ИЛИ** пойдет `0`.
|
||||
|
||||
Но для нашей схемы мультиплексора гарантируется, что каждый вход **ИЛИ** кроме одного будет равняться `0` (поскольку выход каждого **И** кроме одного будет равен `0`). Это означает, что выход **многовходового ИЛИ** будет зависеть только от **одного** входа (в случае, когда `sel = 000010` — от входа `b`).
|
||||
|
||||

|
||||
|
||||
Меняя значение `sel`, мы можем управлять тем, какой из входов мультиплексора будет управлять его выходом.
|
||||
|
||||
Теперь, попробуйте представить огромную матрицу мультиплексоров, у которых можно "запрограммировать" управляющий сигнал `sel` (под "запрограммировать" подразумевается "выставить то значение, которое нам нужно"). Это позволит направлять сигналы вашей цифровой схемы туда, куда вам будет нужно. Именно так ПЛИС и управляет тем, куда именно приходят сигналы.
|
||||
|
||||
Разумеется, **маршрутизация миллионов сигналов** — дело запутанное, но по своей сути **это всего лишь куча мультиплексоров, у которых управляющий сигнал `sel` подключен к программируемой памяти**.
|
||||
|
||||
## Таблицы подстановки (Look-Up Tables, LUTs)
|
||||
|
||||
Итак, у нас есть способ динамически менять маршрут сигналов и приводить их туда, куда нам нужно. Теперь необходимо понять, как генерировать произвольную логику. И для этого мы снова воспользуемся мультиплексорами, в частности их производными, которые называются **Таблицы подстановки** или **Look-Up Tables** (**LUTs**).
|
||||
|
||||
Представьте мультиплексор с четырьмя входными сигналами, и двухбитным управляющим сигналом (обратите внимание, что в теперь это сигнал не использует `one-hot`-кодирование). Но теперь, вместо того, чтобы выставлять входные сигналы во внешний мир, давайте подключим их к программируемой памяти. Это означает, что мы можем "запрограммировать" каждый из входов на какое-то константное значение. Поместим то что у нас получилось в отдельный блок и вот, мы получили двухвходовую **Таблицу подстановки** (далее **LUT**).
|
||||
|
||||

|
||||
|
||||
Эти два входа **LUT** являются битами управляющего сигнала мультиплексора, спрятанного внутри **LUT**. Программируя входы мультиплексора (точнее, программируя память, к которой подключены входы мультиплексора), мы можем получить из **LUT** **любую(!)** логическую функцию, принимающую два входа и возвращающую один выход.
|
||||
|
||||
Допустим мы хотим получить **логическое И**. Для этого, нам потребуется записать в память следующее содержимое:
|
||||
|
||||
|Адрес (In[1:0])| Значение |
|
||||
|---------------|----------|
|
||||
| 00 | 0 |
|
||||
| 01 | 0 |
|
||||
| 10 | 0 |
|
||||
| 11 | 1 |
|
||||
|
||||
Это простейший пример — обычно **LUT**-ы имеют больше входов, что позволяет им реализовывать более сложную логику.
|
||||
|
||||
## D-триггеры
|
||||
|
||||
Как вы уже поняли, используя неограниченное количество LUT-ов, вы можете построить цифровую схему, реализующую логическую функцию любой сложности. Однако цифровые схемы не ограничиваются реализацией одних только логических функций (цифровые схемы, реализующие логическую функцию называются **комбинационными**, поскольку выход зависит только от комбинации входов). Например, так не построить цифровую схему, реализующую процессор. Для таких схем, нужны элементы памяти. Заметим, что речь идет не о программируемой памяти, задавая значения которой мы управляем тем, куда будут направлены сигналы, и какие логические функции будут реализовывать LUT-ы. Речь идет о ячейках памяти, которые будут использоваться логикой самой схемы.
|
||||
Такой базовой ячейкой памяти является **D-триггер**, из которых можно собрать другие ячейки памяти, например **регистры** (а из регистров можно собрать **память с произвольным доступом** (**random access memory**, **RAM**)), **сдвиговые регистры** и т.п.
|
||||
|
||||
**D-триггер** — это цифровой элемент, способный хранить один бит информации. В базовом варианте у этого элемента есть два входа и один выход. Один из входов подает значение, которое будет записано в **D-триггер**, второй вход управляет записью (обычно он называется `clk` или `clock` и подключается к тактирующему синхроимпульсу схемы). Когда управляющий сигнал меняет свое значение с `0` на `1` (либо с `1` на `0`, зависит от схемы), в **D-триггер** записывается значение сигнала данных. Обычно, описывая **D-триггер**, говорится, что он строится из двух защелок, которые в свою очередь строятся из **RS-триггеров**, однако в конечном итоге, все эти элементы строятся на базе логических вентилей **И**/**ИЛИ**, **НЕ**:
|
||||
|
||||

|
||||
|
||||
## Арифметика
|
||||
|
||||
Помимо прочего, описанных выше блоков (мультиплексоров и построенных на их основе LUT-ов и регистров) выделяется еще один тип блоков, настолько часто используемый в цифровых схемах, что его заранее размещают в ПЛИС в больших количествах: это арифметические блоки. Эти блоки используются при сложении, вычитании, сравнении чисел, реализации счётчиков. В разных ПЛИС могут быть предустановлены разные блоки: где-то это может быть однобитный сумматор, а где-то блок вычисления ускоренного переноса (`carry-chain`).
|
||||
|
||||
Все эти блоки могут быть реализованы через логические вентили, например так можно реализовать сумматор:
|
||||
|
||||

|
||||
|
||||
## Логическая ячейка
|
||||
|
||||
И вот, мы подходим к внутреннему устройству ПЛИС. Мы уже узнали, что в ПЛИС есть матрица программируемых мультиплексоров, направляющих сигналы туда, куда нам нужно.
|
||||
Вторым важным элементом является **логический блок** (обычно состоящих из **логических ячеек**, но для простоты мы отождествим эти два термина).
|
||||
|
||||
Логический блок содержит одну или несколько **LUT**, **арифметический блок**, и один или несколько **D-триггеров**, которые соединены между собой некоторым количеством мультиплексоров.
|
||||
Ниже представлена схема того, как может выглядеть **логический блок**:
|
||||
|
||||

|
||||
|
||||
Может показаться запутанным, но все достаточно просто. Логический блок представляет собой цепочку операций: `логическая функция, реализованная через LUT -> арифметическая операция -> Запись в D-триггер`. Каждый из мультиплексоров определяет то, будет ли пропущен какой-либо из этих этапов.
|
||||
Таким образом, конфигурируя каждый логический блок, можно получить следующие вариации кусочка цифровой схемы:
|
||||
|
||||
1. Комбинационная схема (логическая функция, реализованная в LUT)
|
||||
2. Арифметическая операция
|
||||
3. Запись данных в D-триггер
|
||||
4. Комбинационная схема, с записью результата в D-триггер
|
||||
5. Арифметическая операция с записью результата в D-триггер
|
||||
6. Комбинационная схема с последующей арифметической операцией
|
||||
7. Комбинационная схема с последующей арифметической операцией и записью в D-триггер
|
||||
|
||||
А вот реальный пример использования логического блока в ПЛИС `xc7a100tcsg324-1` при реализации Арифметико-логического устройства (АЛУ), подключенного к периферии отладочной платы `Nexys-7`:
|
||||
|
||||

|
||||
|
||||
Здесь вы можете увидеть использование LUT-ов, блока расчета ускоренного переноса, и одного из D-триггеров. D-триггеры, обозначенные серым цветом, не используются.
|
||||
|
||||
Располагая большим наборов таких логических блоков, и имея возможность межсоединять их нужным вам образом, вы получаете широчайшие возможности по реализации практически любой цифровой схемы (ограничением является только ёмкость ПЛИС, т.е. количество подобных логических блоков, входов выходов и т.п.).
|
||||
|
||||
Помимо логических блоков, в ПЛИС есть и другие примитивы: **Блочная память**, **блоки умножителей** и т.п.
|
||||
|
||||
## Выводы
|
||||
|
||||
Обобщим сказанное:
|
||||
|
||||
1. Используя такие полупроводниковые элементы, как **транзисторы**, можно собирать **логические вентили**: элементы **И**, **ИЛИ**, **НЕ** и т.п.
|
||||
2. Используя **логические вентили**, можно создавать схемы, реализующие как **логические функции** (**комбинационные схемы**), так и сложную логику с памятью (**синхронные схемы**).
|
||||
3. Из логических вентилей среди прочего строится и такая важная комбинационная схема, как **мультиплексор**: цифровой блок, в зависимости от управляющего сигнала подающий на выход один из входных сигналов.
|
||||
4. Подключив управляющий сигнал мультиплексора к **программируемой памяти** можно управлять тем, какие сигналы пойдут на выход и направлять их в нужную часть схемы (**маршрутизировать сигналы**).
|
||||
5. Подключив входные сигналы мультиплексора к программируемой памяти, можно получить **Таблицу подстановок** (**Look-Up Table**, **LUT**), которая может реализовывать простейшие логические функции. LUT-ы позволяют заменить логические вентили И/ИЛИ/НЕ, и удобны тем, что их можно динамически изменять, логические вентили в свою очередь исполняются на заводе и уже не могут быть изменены после создания.
|
||||
6. Из логических вентилей так же можно собрать базовую ячейку памяти: **D-триггер**, и такую часто используемую комбинационную схему как **полный однобитный сумматор** (или любой другой часто используемый арифметический блок).
|
||||
7. Объединив LUT, арифметический блок и D-триггер получается структура в ПЛИС, которая называется **логический блок**.
|
||||
8. Логический блок (а так же другие **примитивы**, такие как **блочная память** или **умножители**) — это множество блоков, которые заранее физически размещаются в кристалле ПЛИС, их количество строго определено конкретной ПЛИС и не может быть изменено.
|
||||
9. **Конфигурируя примитивы** и **маршрутизируя сигнал** между ними (см. п.4), можно получить **практически любую цифровую схему** (с учетом ограничения ёмкости ПЛИС).
|
60
Introduction/What is HDL.md
Normal file
60
Introduction/What is HDL.md
Normal file
@@ -0,0 +1,60 @@
|
||||
# Что такое язык описания аппаратуры (HDL)
|
||||
|
||||
На заре появления цифровой электроники, цифровые схемы в виде диаграммы на бумаге были маленькими, а их реализация в виде физической аппаратуры — большой. В процессе развития электроники (и её преобразования в микроэлектронику) цифровые схемы на бумаге становились всё больше, а относительный размер их реализации в виде физических микросхем — всё меньше. На рисунке ниже, вы можете увидеть диаграмму цифровой схемы устройства intel 4004, выпущенного в 1971 году.
|
||||
|
||||

|
||||
|
||||
Данная микросхема состоит из 2300 транзисторов.
|
||||
За прошедшие полсотни лет сложность цифровых схем выросла коллосально. Современные процессоры для настольных компьютеров состоят из десятков миллиардов транзисторов. Диаграмма выше при печати в оригинальном размере займет прямоугольник размером 115х140см с площадью около 1.6м<sup>2</sup> . Предполагая, что площадь печати имеет прямопропорциональную зависимость от количества транзисторов, получим что печать диаграммы современных процессоров потребует площадь в 16млн. м<sup>2</sup>, что эквивалентно квадрату со стороной в 4км.
|
||||
|
||||
<img src="../.pic/Introduction/What%20is%20HDL/ancient_city.png" alt="Старый город" width="400"/>
|
||||
|
||||
Как вы можете догадаться в какой-то момент между 1971-ым и 2022-ым годами инженеры перестали разрабатывать цифровые схемы, рисуя их на бумаге.
|
||||
Разумеется, разрабатывая устройство, не обязательно вырисовывать на схеме каждый транзистор — можно управлять сложностью, переходя с одного уровня абстракции на другой. Например начинать разработку схемы с соединения функциональных блоков, а затем рисовать схему для каждого отдельного блока.
|
||||
К примеру, схему intel 4004 можно представить в следующем виде:
|
||||
|
||||
<img src="../.pic/Introduction/What%20is%20HDL/4004_arch.png" alt="../.pic/Introduction/What%20is%20HDL/4004_arch.png" width="500"/>
|
||||
|
||||
Однако несмотря на это, даже отдельные блоки порой бывают довольно сложны. Возьмем блок аппаратного шифрования по алгоритму AES на рисунке ниже:
|
||||
|
||||

|
||||
|
||||
Заметьте, что даже этот блок не является атомарным. Каждая операция Исключающего ИЛИ, умножения, мультиплексирования сигнала и таблицы подстановки — это отдельные блоки, функционал которых еще надо реализовать.
|
||||
В какой-то момент, инженеры поняли что проще описать цифровую схему в тексовом представлении, нежели в графическом.
|
||||
Как можно описать цифровую схему текстом? Рассмотрим цифровую схему полусумматора:
|
||||
|
||||

|
||||
|
||||
Это **устройство** (_полусумматор_) имеет два **входа**: _a_ и _b_, а так же два **выхода**: _S_ и _P_.
|
||||
Выход _S_ является **результатом** логической операции **Исключающее ИЛИ** от операндов _a_ и _b_.
|
||||
Выход _P_ является **результатом** логической операции **И** от операндов _a_ и _b_.
|
||||
|
||||
Текст выше и является тем описанием, по которому можно воссоздать эту цифровую схему. Если стандартизировать описание схемы, то в нем можно будет оставить только слова, выделенные жирным и курсивом. Пример того, как можно было бы описать эту схему по стандарту IEEE 1364-2005 (язык описания аппаратуры (Hardware Description Language — HDL) Verilog):
|
||||
|
||||
``` Verilog
|
||||
module half_sum( // устройство полусумматор cо
|
||||
input a, // входом a,
|
||||
input b, // входом b,
|
||||
output S, // выходом S и
|
||||
output P // выходом P.
|
||||
);
|
||||
|
||||
assign S = a ^ b; // Где выход S является результатом Исключающего ИЛИ от a и b,
|
||||
assign P = a & b; // а выход P является результатом логического И от a и b.
|
||||
|
||||
endmodule
|
||||
```
|
||||
|
||||
На первый взгляд кажется, что такое описание даже больше, чем записанное естественным языком, однако так кажется только из-за переноса строк и некоторой избыточности в описании входов и выходов, которая была добавлена для повышения читаемости. То же самое описание можно было записать и в виде:
|
||||
|
||||
``` Verilog
|
||||
module half_sum(input a, b, output S, P);
|
||||
assign S = a ^ b;
|
||||
assign P = a & b;
|
||||
endmodule
|
||||
```
|
||||
|
||||
Обратите внимание, что код на языке Verilog описывает устройство целиком, одномоментно. Это описание схемы выше, а не построчное выполнение программы.
|
||||
Может показаться, что описывать устройство текстом сложнее, чем рисовать схему, тем более, что сперва мы **уже нарисовали схему**, а затем её описали. Однако, с практикой описание схемы в текстовом виде становится намного проще и не требует диаграммы. Для описания достаточно только спецификации: формальной записи того, что должно делать устройство, по которой разрабатывается алгоритм, который затем претворяется в описание на HDL.
|
||||
|
||||
Занятный факт: ранее было высказано предположение о том, что инженеры перестали разрабатывать устройства, рисуя цифровые схемы в промежуток времени между 1971-ым и 2022-ым годами. Так вот, первая конференция, посвященная языкам описания аппаратуры состоялась в 1973-ем году. Таким образом, Intel 4004 можно считать одним из последних цифровых устройств, разработанных без использования языков описания аппаратуры.
|
Reference in New Issue
Block a user