diff --git a/Introduction/How FPGA works.md b/Introduction/How FPGA works.md index 247abda..4ba3d09 100644 --- a/Introduction/How FPGA works.md +++ b/Introduction/How FPGA works.md @@ -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)". ## История появления ПЛИС @@ -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. Обозначение логического вентиля **НЕ**._ + Так же существуют вариации базовых вентилей, такие как **И-НЕ**, **ИЛИ-НЕ**, **Исключающее ИЛИ-НЕ**, отличающиеся от исходных тем, что их выходы инвертируются. Логические вентили строятся из **транзисторов**. **Транзистор** — это полупроводниковый элемент, может пропускать/блокировать ток в зависимости от поданного напряжения на его управляющий вход. @@ -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. Обозначение логического вентиля **Схема логического вентиля И, построенного на транзисторах**._ + Теперь, имея базовое представление о транзисторах и логических вентилях, мы можем построить из них что-то полезное. Используя одни лишь описанные выше логические вентили можно построить **любую(!)** цифровую схему. Однако, при описании цифровых схем, некоторые цифровые блоки используются настолько часто, что для них ввели отдельные символы (**сумматоры**, **умножители**, **мультиплексоры**), используемые при описании более сложных схем. Мы рассмотрим один из фундаментальных строительных блоков в ПЛИС — **мультиплексор**. @@ -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 бит. Число входов мультиплексора может быть различным, но выход у него всегда один. @@ -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` (под "запрограммировать" подразумевается "выставить то значение, которое нам нужно"). Это позволит направлять сигналы вашей цифровой схемы туда, куда вам будет нужно. Именно так ПЛИС и управляет тем, куда именно приходят сигналы. @@ -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** **любую(!)** логическую функцию, принимающую два входа и возвращающую один выход. Допустим мы хотим получить **логическое И**. Для этого, нам потребуется записать в память следующее содержимое: @@ -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`). @@ -144,6 +169,8 @@ ![../.pic/Labs/lab_01_adder/fig_02.drawio.png](../.pic/Labs/lab_01_adder/fig_02.drawio.png) +_Рисунок 13. Реализация полного однобитного сумматора._ + ## Логическая ячейка И вот, мы подходим к внутреннему устройству ПЛИС. Мы уже узнали, что в ПЛИС есть матрица программируемых мультиплексоров, направляющих сигналы туда, куда нам нужно. @@ -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-триггер`. Каждый из мультиплексоров определяет то, будет ли пропущен какой-либо из этих этапов. Таким образом, конфигурируя каждый логический блок, можно получить следующие вариации кусочка цифровой схемы: @@ -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-триггеры, обозначенные серым цветом, не используются. @@ -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) \ No newline at end of file