diff --git a/.pic/Introduction/How FPGA works/fig_13.drawio.svg b/.pic/Introduction/How FPGA works/fig_13.drawio.svg deleted file mode 100644 index 000b08a1..00000000 --- a/.pic/Introduction/How FPGA works/fig_13.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
x
y
f
0
0
f00
0
1
f01
1
0
f10
1
1
f11
y
x
f
LUT
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/fig_13.png b/.pic/Introduction/How FPGA works/fig_13.png new file mode 100644 index 00000000..de25eb4d Binary files /dev/null and b/.pic/Introduction/How FPGA works/fig_13.png differ diff --git a/.pic/Introduction/How FPGA works/fig_14.drawio.svg b/.pic/Introduction/How FPGA works/fig_14.drawio.svg index 97e07ac6..000b08a1 100644 --- a/.pic/Introduction/How FPGA works/fig_14.drawio.svg +++ b/.pic/Introduction/How FPGA works/fig_14.drawio.svg @@ -1,4 +1,4 @@ -
D-триггер
Ведомая D-защелка
RS-триггер
Ведущая D-защелка
RS-триггер
D
Q
Clk
E
E
S
R
S
R
\ No newline at end of file +
x
y
f
0
0
f00
0
1
f01
1
0
f10
1
1
f11
y
x
f
LUT
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/fig_15.drawio.svg b/.pic/Introduction/How FPGA works/fig_15.drawio.svg new file mode 100644 index 00000000..97e07ac6 --- /dev/null +++ b/.pic/Introduction/How FPGA works/fig_15.drawio.svg @@ -0,0 +1,4 @@ + + + +
D-триггер
Ведомая D-защелка
RS-триггер
Ведущая D-защелка
RS-триггер
D
Q
Clk
E
E
S
R
S
R
\ No newline at end of file diff --git a/.pic/Introduction/How FPGA works/fig_17.png b/.pic/Introduction/How FPGA works/fig_18.png similarity index 100% rename from .pic/Introduction/How FPGA works/fig_17.png rename to .pic/Introduction/How FPGA works/fig_18.png diff --git a/.pic/Introduction/How FPGA works/fig_19.jpg b/.pic/Introduction/How FPGA works/fig_19.jpg new file mode 100644 index 00000000..ace00870 Binary files /dev/null and b/.pic/Introduction/How FPGA works/fig_19.jpg differ diff --git a/Introduction/How FPGA works.md b/Introduction/How FPGA works.md index 2ff861b9..cb5bbd67 100644 --- a/Introduction/How FPGA works.md +++ b/Introduction/How FPGA works.md @@ -6,14 +6,16 @@ - [Цифровые схемы](#цифровые-схемы) - [Логические вентили](#логические-вентили) - [Мультиплексоры](#мультиплексоры) + - [Программируемая память](#программируемая-память) - [Таблицы подстановки (Look-Up Tables, LUTs)](#таблицы-подстановки-look-up-tables-luts) - [D-триггеры](#d-триггеры) - [Арифметика](#арифметика) - [Логическая ячейка](#логическая-ячейка) + - [Сеть межсоединений](#сеть-межсоединений) - [Выводы](#выводы) - [Источники](#источники) -> Разделы "Цифровые схемы и логические вентили" и "Таблицы подстановки" являются переводом статьи "[How Does an FPGA Work?[1]](https://learn.sparkfun.com/tutorials/how-does-an-fpga-work/all)" за авторством `Alchitry, Ell C`, распространяемой по лицензии [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). +> Разделы "Цифровые схемы и логические вентили" и "Таблицы подстановки" во многом используют материалы статьи "[How Does an FPGA Work?[1]](https://learn.sparkfun.com/tutorials/how-does-an-fpga-work/all)" за авторством `Alchitry, Ell C`, распространяемой по лицензии [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). ## История появления ПЛИС @@ -101,7 +103,7 @@ _Рисунок 6. Схема логических вентилей **И-НЕ**, ![../.pic/Introduction/How%20FPGA%20works/fig_07.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_07.drawio.svg) -_Рисунок 7. Схема логического вентиля **НЕ** построенного на КМОП транзисторах._ +_Рисунок 7. Схема логического вентиля **НЕ**, построенного на КМОП транзисторах._ КМОП логика далеко не единственный способ построения цифровых элементов, ранее достаточно широко применялись другие варианты построения схем, например только на одном типе транзисторов. Однако наиболее эффективным оказалось использование именно комплементарных пар, и на сегодня такой подход для цифровых схем является доминирующим. @@ -151,21 +153,27 @@ _Рисунок 11. Реализация многоходового логиче _Рисунок 12. Реализация мультиплексора, использующего one-hot кодирование._ -Меняя значение `sel`, мы можем управлять тем, какой из входов мультиплексора будет управлять его выходом. +Меняя значение `sel`, мы можем управлять тем, какой из входов мультиплексора будет идти на его выход. -Теперь, попробуйте представить огромную матрицу мультиплексоров, у которых можно "запрограммировать" управляющий сигнал `sel` (под "запрограммировать" подразумевается "выставить то значение, которое нам нужно"). Это позволит направлять сигналы вашей цифровой схемы туда, куда вам будет нужно. Именно так ПЛИС и управляет тем, куда именно приходят сигналы. +### Программируемая память -Разумеется, программирование связей (**трассировка**, **routing**) миллионов сигналов — дело запутанное, но по своей сути **это всего лишь куча мультиплексоров** (так называемая "**матрица межсоединений**"), у которых управляющий сигнал `sel` подключен к **программируемой памяти**. +Из транзисторов можно построить не только логические элементы, но и элементы памяти. На рис. 8 представлена схема простейшей ячейки статической памяти, состоящей из транзистора и двух инверторов (т.е. суммарно состоящей из 5 транзисторов, поэтому она называется **5T** SRAM). Данная ячейка реализует 1 бит конфигурируемой памяти, являвшейся одним из основных компонентов самой первой ПЛИС. -## Таблицы подстановки (Look-Up Tables, LUTs) +![../.pic/Introduction/How%20FPGA%20works/fig_08.png](../.pic/Introduction/How%20FPGA%20works/fig_13.png) + +_Рисунок 13. Конфигурируемая ячейка памяти ПЛИС Xilinx XC2064[[2, стр. 2-63](https://archive.org/details/programmablegate00xili/page/n93/mode/2up)]._ -Итак, у нас есть способ динамически менять маршрут сигналов и приводить их туда, куда нам нужно. Теперь необходимо понять, как генерировать произвольную логику. И для этого мы снова воспользуемся мультиплексорами, в частности их производными, которые называются **Таблицы подстановки** или **Look-Up Tables** (**LUTs**). +Данная память представляет собой **бистабильную ячейку** — петлю из двух инверторов, в которых "заперто" хранимое значение. Дважды инвертированный сигнал совпадает по значению с исходным, при этом проходя через каждый из инверторов, сигнал обновляет свое значение напряжения, что не позволяет ему угаснуть из-за сопротивления цепи. -Представьте мультиплексор с четырьмя входными сигналами, и двухбитным управляющим сигналом (обратите внимание, что в теперь это сигнал не использует one-hot-кодирование). Но теперь, вместо того чтобы выставлять входные сигналы во внешний мир, давайте подключим их к программируемой памяти. Это означает, что мы можем "запрограммировать" каждый из входов на какое-то константное значение. Поместим то, что у нас получилось в отдельный блок и вот, мы получили двухвходовую **Таблицу подстановки** (далее **LUT**). +Для того чтобы поместить в бистабильную ячейку новое значение, к ее входу подключается еще один транзистор, замыкающий или размыкающий ее с напряжением питания/земли. -![../.pic/Introduction/How%20FPGA%20works/fig_13.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_13.drawio.svg) +## Таблицы подстановки (Look-Up Tables, LUTs) -_Рисунок 13. Реализация таблицы подстановки (Look-Up Table, LUT)._ +Представьте мультиплексор с четырьмя входными сигналами, и двухбитным управляющим сигналом (обратите внимание, что в теперь это сигнал не использует one-hot-кодирование). Но теперь, вместо того чтобы выставлять входные сигналы во внешний мир, давайте подключим их к программируемой памяти. Это означает, что мы можем "запрограммировать" каждый из входов на какое-то константное значение. Поместим то, что у нас получилось в отдельный блок и вот, мы получили двухвходовую **Таблицу подстановки** (**Look-Up Tables**, далее **LUT**). + +![../.pic/Introduction/How%20FPGA%20works/fig_14.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_14.drawio.svg) + +_Рисунок 14. Реализация таблицы подстановки (Look-Up Table, LUT)._ Эти два входа **LUT** являются битами управляющего сигнала мультиплексора, спрятанного внутри **LUT**. Программируя входы мультиплексора (точнее, программируя память, к которой подключены входы мультиплексора), мы можем реализовать на базе **LUT** **любую(!)** логическую функцию, принимающую два входа и возвращающую один выход. @@ -188,9 +196,9 @@ _Рисунок 13. Реализация таблицы подстановки ( **D-триггер** — это цифровой элемент, способный хранить один бит информации. В базовом варианте у этого элемента есть два входа и один выход. Один из входов подает значение, которое будет записано в **D-триггер**, второй вход управляет записью (обычно он называется `clk` или `clock` и подключается к тактирующему синхроимпульсу схемы). Когда управляющий сигнал меняет свое значение с `0` на `1` (либо с `1` на `0`, зависит от схемы), в **D-триггер** записывается значение сигнала данных. Обычно, описывая **D-триггер**, говорится, что он строится из двух **триггеров-защелок** (**D latch**), которые в свою очередь строятся из **RS-триггеров**, однако в конечном итоге, все эти элементы могут быть построены на базе логических вентилей **И**/**ИЛИ**, **НЕ**: -![../.pic/Introduction/How%20FPGA%20works/fig_14.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_14.drawio.svg) +![../.pic/Introduction/How%20FPGA%20works/fig_15.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_15.drawio.svg) -_Рисунок 14. Реализация D-триггера._ +_Рисунок 15. Реализация D-триггера._ ## Арифметика @@ -200,20 +208,20 @@ _Рисунок 14. Реализация D-триггера._ ![../.pic/Labs/lab_01_adder/fig_02.drawio.svg](../.pic/Labs/lab_01_adder/fig_02.drawio.svg) -_Рисунок 15. Реализация полного однобитного сумматора._ +_Рисунок 16. Реализация полного однобитного сумматора._ ## Логическая ячейка И вот, мы подходим к внутреннему устройству ПЛИС. Мы уже узнали, что в ПЛИС есть матрица программируемых мультиплексоров, направляющих сигналы туда, куда нам нужно. -Вторым важным элементом является **логический блок** (обычно состоящих из **логических ячеек**, но для простоты мы отождествим эти два термина). +Вторым важным элементом является **логический блок** (обычно состоящих из **логических ячеек** или **логических элементов**, но для простоты мы отождествим все эти термины). Логический блок содержит одну или несколько **LUT**, **арифметический блок**, и один или несколько **D-триггеров**, которые соединены между собой некоторым количеством мультиплексоров. На _рис. 16_ представлена схема того, как может выглядеть **логический блок**: ![../.pic/Labs/lab_03_memory/fig_02.png](../.pic/Labs/lab_03_memory/fig_02.png) -_Рисунок 16. Схема логической ячейки[[2]](https://en.wikipedia.org/wiki/Field-programmable_gate_array)._ +_Рисунок 17. Схема логической ячейки[[2]](https://en.wikipedia.org/wiki/Field-programmable_gate_array)._ Всё достаточно просто. Логический блок представляет собой цепочку операций: `логическая функция, реализованная через LUT -> арифметическая операция -> Запись в D-триггер`. Каждый из мультиплексоров определяет то, будет ли пропущен какой-либо из этих этапов. Таким образом, конфигурируя каждый логический блок, можно получить следующие вариации кусочка цифровой схемы: @@ -228,9 +236,9 @@ _Рисунок 16. Схема логической ячейки[[2]](https://en А вот реальный пример использования логического блока в ПЛИС `xc7a100tcsg324-1` при реализации Арифметико-логического устройства (АЛУ), подключенного к периферии отладочной платы `Nexys-7`: -![../.pic/Introduction/How%20FPGA%20works/fig_17.png](../.pic/Introduction/How%20FPGA%20works/fig_17.png) +![../.pic/Introduction/How%20FPGA%20works/fig_18.png](../.pic/Introduction/How%20FPGA%20works/fig_18.png) -_Рисунок 17. Пример использования логической ячейки._ +_Рисунок 18. Пример использования логической ячейки._ Здесь вы можете увидеть использование LUT-ов, арифметического блока (ускоренного расчета переноса), и одного из D-триггеров. D-триггеры, обозначенные серым цветом, не используются. @@ -238,6 +246,20 @@ _Рисунок 17. Пример использования логической Помимо логических блоков, в ПЛИС есть и другие примитивы: **Блочная память**, **блоки умножителей** и т.п. +### Сеть межсоединений + +Для того, чтобы разобраться как управлять межсоединением логических блоков, рассмотрим рис. 19, входящий в [патент](https://patents.google.com/patent/US4870302A) на ПЛИС[[4]()]. + +![../.pic/Introduction/How%20FPGA%20works/fig_19.jpg](../.pic/Introduction/How%20FPGA%20works/fig_19.jpg) + +_Рисунок 19. Содержимое ПЛИС в виде межсоединения логических блоков и блоков ввода-вывода._ + +Синим показано 9 логических блоков, желтым — 12 блоков ввода-вывода. Все эти блоки окружены **сетью межсоединений** (interconnect net), представляющей собой матрицу из горизонтальных и вертикальных соединительных линий — межсоединений общего назначения (general purpose interconnect)[[2, 2-66](https://archive.org/details/programmablegate00xili/page/n97/mode/2up)]. + +Косыми чертами в местах пересечения линий обозначены **программируемые точки межсоединений** (**programmable interconnect points**, **PIP**s), представляющие собой транзисторы, затвор которых подключен к программируемой памяти. + +Управляя значением в подключенной к затвору транзистора памяти, можно управлять тем, что из себя будет представлять транзистор в данной точке: разрыв, или цепь. А значит, можно удалять "лишние" участки сети, оставляя только используемые логические блоки, соединенные между собой. + ## Выводы Обобщим сказанное: @@ -245,14 +267,17 @@ _Рисунок 17. Пример использования логической 1. Используя такие элементы, как **транзисторы**, можно собирать **логические вентили**: элементы **И**, **ИЛИ**, **НЕ** и т.п. 2. Используя **логические вентили**, можно создавать схемы, реализующие как **логические функции** (**комбинационные схемы**), так и сложную логику с памятью (**последовательностные схемы**). 3. Из логических вентилей среди прочего строится и такая важная комбинационная схема, как **мультиплексор**: цифровой блок, в зависимости от управляющего сигнала подающий на выход один из входных сигналов. -4. Подключив управляющий сигнал мультиплексора к **программируемой памяти**, можно управлять тем, какие сигналы пойдут на выход и направлять их в нужную часть схемы (**трассировать сигналы**). +4. Кроме того, подключив вход бистабильной ячейки (представляющую собой петлю из двух инверторов) к транзистору, можно получить 1 бит **конфигурируемой памяти**. 5. Подключив входные сигналы мультиплексора к программируемой памяти, можно получить **Таблицу подстановок** (**Look-Up Table**, **LUT**), которая может реализовывать простейшие логические функции. LUT-ы позволяют заменить логические вентили И/ИЛИ/НЕ, и удобны тем, что их можно динамически изменять, логические вентили в свою очередь исполняются на заводе и уже не могут быть изменены после создания. 6. Из логических вентилей так же можно собрать базовую ячейку памяти: **D-триггер**, и такую часто используемую комбинационную схему как **полный однобитный сумматор** (или любой другой часто используемый арифметический блок). 7. Объединив LUT, арифметический блок и D-триггер получается структура в ПЛИС, которая называется **логический блок**. 8. Логический блок (а также другие **примитивы**, такие как **блочная память** или **умножители**) — это множество блоков, которые заранее физически размещаются в кристалле ПЛИС, их количество строго определено конкретной ПЛИС и не может быть изменено. -9. **Конфигурируя примитивы** и **трассируя сигнал** между ними (см. п.4), можно получить **практически любую цифровую схему** (с учетом ограничения ёмкости ПЛИС). +9. Подключая такой бит конфигурируемой памяти к транзисторам, расположенных в узлах **сети межсоединений**, можно управлять тем, где в этой сети будут разрывы, а значит можно оставить только маршрут, по которому сигнал пойдет туда, куда нам нужно (**трассировать сигнал**). +10. **Конфигурируя примитивы** и **трассируя сигнал** между ними (см. п.4), можно получить **практически любую цифровую схему** (с учетом ограничения ёмкости ПЛИС). ## Источники 1. Alchitry, Ell C / [How Does an FPGA Work?](https://learn.sparkfun.com/tutorials/how-does-an-fpga-work/all) -2. [Field-programmable gate array](https://en.wikipedia.org/wiki/Field-programmable_gate_array) +2. Xilinx / [The Programmable Gate Array Data Book](https://archive.org/details/programmablegate00xili) +3. Wikipedia / [Field-programmable gate array](https://en.wikipedia.org/wiki/Field-programmable_gate_array) +4. Ken Shirriff / [Reverse-engineering the first FPGA chip, the XC2064](http://www.righto.com/2020/09/reverse-engineering-first-fpga-chip.html)