Skip to content

Commit

Permalink
Добавление источников в How FPGA works
Browse files Browse the repository at this point in the history
  • Loading branch information
HepoH3 committed Jan 24, 2024
1 parent 9965e87 commit 0fdc5f8
Showing 1 changed file with 39 additions and 2 deletions.
41 changes: 39 additions & 2 deletions Introduction/How FPGA works.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@
- [Арифметика](#арифметика)
- [Логическая ячейка](#логическая-ячейка)
- [Выводы](#выводы)
- [Источники](#источники)

При написании разделов "Цифровые схемы и логические вентили" и "Таблицы подстановки", использовалась статья "[How Does an FPGA Work?](https://learn.sparkfun.com/tutorials/how-does-an-fpga-work/all)".
При написании разделов "Цифровые схемы и логические вентили" и "Таблицы подстановки", использовалась статья "[How Does an FPGA Work?[1]](https://learn.sparkfun.com/tutorials/how-does-an-fpga-work/all)".

## История появления ПЛИС

Expand Down Expand Up @@ -44,18 +45,26 @@

![../.pic/Introduction/How%20FPGA%20works/FPGA_ang_gate.png](../.pic/Introduction/How%20FPGA%20works/FPGA_ang_gate.png)

_Рисунок 1. Обозначение логического вентиля **И**._

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

![../.pic/Introduction/How%20FPGA%20works/FPGA_or_gate.png](../.pic/Introduction/How%20FPGA%20works/FPGA_or_gate.png)

_Рисунок 2. Обозначение логического вентиля **ИЛИ**._

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

![../.pic/Introduction/How%20FPGA%20works/FPGA_xor_gate.png](../.pic/Introduction/How%20FPGA%20works/FPGA_xor_gate.png)

_Рисунок 3. Обозначение логического вентиля **Исключающее ИЛИ**._

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

![../.pic/Introduction/How%20FPGA%20works/FPGA_not_gate.png](../.pic/Introduction/How%20FPGA%20works/FPGA_not_gate.png)

_Рисунок 4. Обозначение логического вентиля **НЕ**._

Так же существуют вариации базовых вентилей, такие как **И-НЕ**, **ИЛИ-НЕ**, **Исключающее ИЛИ-НЕ**, отличающиеся от исходных тем, что их выходы инвертируются.

Логические вентили строятся из **транзисторов**. **Транзистор** — это полупроводниковый элемент, может пропускать/блокировать ток в зависимости от поданного напряжения на его управляющий вход.
Expand All @@ -64,6 +73,8 @@

![../.pic/Introduction/How%20FPGA%20works/FPGA_and_gate_transistor.drawio.png](../.pic/Introduction/How%20FPGA%20works/FPGA_and_gate_transistor.drawio.png)

_Рисунок 5. Обозначение логического вентиля **Схема логического вентиля И, построенного на транзисторах**._

Теперь, имея базовое представление о транзисторах и логических вентилях, мы можем построить из них что-то полезное. Используя одни лишь описанные выше логические вентили можно построить **любую(!)** цифровую схему.

Однако, при описании цифровых схем, некоторые цифровые блоки используются настолько часто, что для них ввели отдельные символы (**сумматоры**, **умножители**, **мультиплексоры**), используемые при описании более сложных схем. Мы рассмотрим один из фундаментальных строительных блоков в ПЛИС — **мультиплексор**.
Expand All @@ -76,6 +87,8 @@

![../.pic/Introduction/How%20FPGA%20works/FPGA_mux_symbol.png](../.pic/Introduction/How%20FPGA%20works/FPGA_mux_symbol.png)

_Рисунок 6. Обозначение Мультиплексора._

Символ `/` на линии `sel` используется, чтобы показать, что этот сигнал шириной 6 бит.

Число входов мультиплексора может быть различным, но выход у него всегда один.
Expand All @@ -86,20 +99,28 @@

![../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_initial.drawio.png](../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_initial.drawio.png)

_Рисунок 7. Реализация мультиплексора, использующего one-hot кодирование._

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

![../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_path.drawio.png](../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_path.drawio.png)

_Рисунок 8. Реализация мультиплексора, использующего one-hot кодирование._

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

![../.pic/Introduction/How%20FPGA%20works/FPGA_or_gate_tree.drawio.png](../.pic/Introduction/How%20FPGA%20works/FPGA_or_gate_tree.drawio.png)

_Рисунок 9. Реализация многоходового логического **ИЛИ**._

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

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

![../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_output.drawio.png](../.pic/Introduction/How%20FPGA%20works/FPGA_mux6in1_onehot_output.drawio.png)

_Рисунок 10. Реализация мультиплексора, использующего one-hot кодирование._

Меняя значение `sel`, мы можем управлять тем, какой из входов мультиплексора будет управлять его выходом.

Теперь, попробуйте представить огромную матрицу мультиплексоров, у которых можно "запрограммировать" управляющий сигнал `sel` (под "запрограммировать" подразумевается "выставить то значение, которое нам нужно"). Это позволит направлять сигналы вашей цифровой схемы туда, куда вам будет нужно. Именно так ПЛИС и управляет тем, куда именно приходят сигналы.
Expand All @@ -114,6 +135,8 @@

![../.pic/Introduction/How%20FPGA%20works/FPGA_lut_scheme.drawio.png](../.pic/Introduction/How%20FPGA%20works/FPGA_lut_scheme.drawio.png)

_Рисунок 11. Реализация таблицы подстановки (Look-Up Table, LUT)._

Эти два входа **LUT** являются битами управляющего сигнала мультиплексора, спрятанного внутри **LUT**. Программируя входы мультиплексора (точнее, программируя память, к которой подключены входы мультиплексора), мы можем получить из **LUT** **любую(!)** логическую функцию, принимающую два входа и возвращающую один выход.

Допустим мы хотим получить **логическое И**. Для этого, нам потребуется записать в память следующее содержимое:
Expand All @@ -136,6 +159,8 @@

![../.pic/Introduction/How%20FPGA%20works/FPGA_d_flip_flop.png](../.pic/Introduction/How%20FPGA%20works/FPGA_d_flip_flop.png)

_Рисунок 12. Реализация D-триггера[[2]](https://www.build-electronic-circuits.com/d-flip-flop/)._

## Арифметика

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

![../.pic/Labs/lab_01_adder/fig_02.drawio.png](../.pic/Labs/lab_01_adder/fig_02.drawio.png)

_Рисунок 13. Реализация полного однобитного сумматора._

## Логическая ячейка

И вот, мы подходим к внутреннему устройству ПЛИС. Мы уже узнали, что в ПЛИС есть матрица программируемых мультиплексоров, направляющих сигналы туда, куда нам нужно.
Expand All @@ -154,6 +181,8 @@

![../.pic/Labs/lab_03_memory/fig_02.png](../.pic/Labs/lab_03_memory/fig_02.png)

_Рисунок 14. Схема логической ячейки[[3]](https://en.wikipedia.org/wiki/Field-programmable_gate_array)._

Может показаться запутанным, но все достаточно просто. Логический блок представляет собой цепочку операций: `логическая функция, реализованная через LUT -> арифметическая операция -> Запись в D-триггер`. Каждый из мультиплексоров определяет то, будет ли пропущен какой-либо из этих этапов.
Таким образом, конфигурируя каждый логический блок, можно получить следующие вариации кусочка цифровой схемы:

Expand All @@ -167,7 +196,9 @@

А вот реальный пример использования логического блока в ПЛИС `xc7a100tcsg324-1` при реализации Арифметико-логического устройства (АЛУ), подключенного к периферии отладочной платы `Nexys-7`:

![real_logic_cell](../.pic/Introduction/How%20FPGA%20works/FPGA_logic_cell.png)
![../.pic/Introduction/How%20FPGA%20works/FPGA_logic_cell.png](../.pic/Introduction/How%20FPGA%20works/FPGA_logic_cell.png)

_Рисунок 15. Пример использования логической ячейки._

Здесь вы можете увидеть использование LUT-ов, блока расчета ускоренного переноса, и одного из D-триггеров. D-триггеры, обозначенные серым цветом, не используются.

Expand All @@ -188,3 +219,9 @@
7. Объединив LUT, арифметический блок и D-триггер получается структура в ПЛИС, которая называется **логический блок**.
8. Логический блок (а также другие **примитивы**, такие как **блочная память** или **умножители**) — это множество блоков, которые заранее физически размещаются в кристалле ПЛИС, их количество строго определено конкретной ПЛИС и не может быть изменено.
9. **Конфигурируя примитивы** и **маршрутизируя сигнал** между ними (см. п.4), можно получить **практически любую цифровую схему** (с учетом ограничения ёмкости ПЛИС).

## Источники

1. [How Does an FPGA Work?](https://learn.sparkfun.com/tutorials/how-does-an-fpga-work/all)
2. [The D Flip-Flop (Quickstart Tutorial)](https://www.build-electronic-circuits.com/d-flip-flop/)
3. [Field-programmable gate array](https://en.wikipedia.org/wiki/Field-programmable_gate_array)

0 comments on commit 0fdc5f8

Please sign in to comment.