mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
Добавление источников в How FPGA works
This commit is contained in:
@@ -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 @@
|
||||
|
||||

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

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

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

|
||||
|
||||
_Рисунок 4. Обозначение логического вентиля **НЕ**._
|
||||
|
||||
Так же существуют вариации базовых вентилей, такие как **И-НЕ**, **ИЛИ-НЕ**, **Исключающее ИЛИ-НЕ**, отличающиеся от исходных тем, что их выходы инвертируются.
|
||||
|
||||
Логические вентили строятся из **транзисторов**. **Транзистор** — это полупроводниковый элемент, может пропускать/блокировать ток в зависимости от поданного напряжения на его управляющий вход.
|
||||
@@ -64,6 +73,8 @@
|
||||
|
||||

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

|
||||
|
||||
_Рисунок 6. Обозначение Мультиплексора._
|
||||
|
||||
Символ `/` на линии `sel` используется, чтобы показать, что этот сигнал шириной 6 бит.
|
||||
|
||||
Число входов мультиплексора может быть различным, но выход у него всегда один.
|
||||
@@ -86,20 +99,28 @@
|
||||
|
||||

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

|
||||
|
||||
_Рисунок 8. Реализация мультиплексора, использующего one-hot кодирование._
|
||||
|
||||
Логический вентиль **ИЛИ** на данной схеме имеет больше двух входов. Подобный вентиль может быть создан в виде каскада логических вентилей **ИЛИ**:
|
||||
|
||||

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

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

|
||||
|
||||
_Рисунок 11. Реализация таблицы подстановки (Look-Up Table, LUT)._
|
||||
|
||||
Эти два входа **LUT** являются битами управляющего сигнала мультиплексора, спрятанного внутри **LUT**. Программируя входы мультиплексора (точнее, программируя память, к которой подключены входы мультиплексора), мы можем получить из **LUT** **любую(!)** логическую функцию, принимающую два входа и возвращающую один выход.
|
||||
|
||||
Допустим мы хотим получить **логическое И**. Для этого, нам потребуется записать в память следующее содержимое:
|
||||
@@ -136,6 +159,8 @@
|
||||
|
||||

|
||||
|
||||
_Рисунок 12. Реализация D-триггера[[2]](https://www.build-electronic-circuits.com/d-flip-flop/)._
|
||||
|
||||
## Арифметика
|
||||
|
||||
Помимо описанных выше блоков (мультиплексоров и построенных на их основе LUT-ов и регистров) выделяется еще один тип блоков, настолько часто используемый в цифровых схемах, что его заранее размещают в ПЛИС в больших количествах: это арифметические блоки. Эти блоки используются при сложении, вычитании, сравнении чисел, реализации счётчиков. В разных ПЛИС могут быть предустановлены разные блоки: где-то это может быть однобитный сумматор, а где-то блок вычисления ускоренного переноса (`carry-chain`).
|
||||
@@ -144,6 +169,8 @@
|
||||
|
||||

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

|
||||
|
||||
_Рисунок 14. Схема логической ячейки[[3]](https://en.wikipedia.org/wiki/Field-programmable_gate_array)._
|
||||
|
||||
Может показаться запутанным, но все достаточно просто. Логический блок представляет собой цепочку операций: `логическая функция, реализованная через LUT -> арифметическая операция -> Запись в D-триггер`. Каждый из мультиплексоров определяет то, будет ли пропущен какой-либо из этих этапов.
|
||||
Таким образом, конфигурируя каждый логический блок, можно получить следующие вариации кусочка цифровой схемы:
|
||||
|
||||
@@ -167,7 +196,9 @@
|
||||
|
||||
А вот реальный пример использования логического блока в ПЛИС `xc7a100tcsg324-1` при реализации Арифметико-логического устройства (АЛУ), подключенного к периферии отладочной платы `Nexys-7`:
|
||||
|
||||

|
||||

|
||||
|
||||
_Рисунок 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)
|
Reference in New Issue
Block a user