Skip to content

Commit

Permalink
Перенос Implementation steps в Introduction
Browse files Browse the repository at this point in the history
  • Loading branch information
HepoH3 committed Jan 31, 2024
1 parent 8cf2198 commit 75192ec
Show file tree
Hide file tree
Showing 13 changed files with 130 additions and 50 deletions.
5 changes: 2 additions & 3 deletions .github/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@

# Введение

- [Зачем читать введение в HDL и работу с ПЛИС](Introduction/README.md)
- [О данном разделе](Introduction/README.md)
- [Что такое Язык Описания Аппаратуры](Introduction/What%20is%20HDL.md)
- [Как работает ПЛИС](Introduction/How%20FPGA%20works.md)

- [Этапы реализации проекта в ПЛИС](Introduction/Implementation%20steps.md)
---

# Лабораторные работы
Expand Down Expand Up @@ -52,7 +52,6 @@
- [Структура директорий в проекте Vivado](Vivado%20Basics/Folder%20Structure%20In%20The%20Project.md)
- [Как сгенерировать схему](Vivado%20Basics/How%20to%20open%20a%20schematic.md)
- [Ошибки элаборации](Vivado%20Basics/Elaboration%20failed.md)
- [Шаги имплементации](Vivado%20Basics/Implementation%20steps.md)
- [Запуск симуляции](Vivado%20Basics/Run%20Simulation.md)
- [Руководство по поиску ошибок](Vivado%20Basics/Debug%20manual.md)
- [Руководство по прошивке ПЛИС](Vivado%20Basics/Program%20nexys%20a7.md)
Expand Down
2 changes: 1 addition & 1 deletion Basic Verilog structures/Multiplexors.md
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ endmodule
2. использование конструкции [`if-else`](#блок-if-else) внутри блока `always`;
3. использование конструкции [`case`](#case-блок) внутри блока always.
3. Во избежание появления [защелок](#защелка) при описании мультиплексора, необходимо убедиться что у блоков `if` есть соответствующие им блоки `else`, а у мультиплексоров описаны все комбинации управляющего сигнала (при необходимости, множество оставшихся комбинаций можно покрыть с помощью комбинации `default`). Появление непреднамеренной защелки в дизайне ведет к ухудшению временных характеристик, избыточному использованию ресурсов, а также непредсказуемому поведению схемы из-за возможного удержания сигнала.
4. Важно отметить, что блоки `if-else` и `case` могут использоваться не только для описания мультиплексоров.
4. Важно отметить, что блоки `if-else` и `case` могут использоваться не только для описания мультиплексоров.
5. Конструкции `if-else` и `case` в рамках данных лабораторных работ можно описывать только внутри блока [`always`](#блок-always). При работе с этим блоком необходимо помнить следующие особенности:
1. Существует несколько типов блока `always`: `always_comb`, `always_ff`, `always_latch`, определяющих то, к чему будет подключена описанная в этом блоке логика: проводу, регистру или защелке соответственно.
2. Внутри блока always следует использовать оператор неблокирующего присваивания `<=`.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Шаги реализации разработанного устройства в ПЛИС
# Этапы реализации проекта в ПЛИС

Для того, чтобы описанное на **языке описания аппаратуры** устройство было реализовано в ПЛИС, необходимо выполнить несколько этапов:

Expand All @@ -16,7 +16,7 @@

Допустим, мы хотим реализовать следующую цифровую схему:

![../.pic/Vivado%20Basics/Implementation%20steps/impl_steps_ref_scheme.drawio.png](../.pic/Vivado%20Basics/Implementation%20steps/impl_steps_ref_scheme.drawio.png)
![../.pic/Introduction/Implementation%20steps/impl_steps_ref_scheme.drawio.png](../.pic/Introduction/Implementation%20steps/impl_steps_ref_scheme.drawio.png)

Её можно описать следующим **SystemVerilog**-кодом:

Expand All @@ -38,7 +38,7 @@ endmodule

Откроются следующие окна:

![../.pic/Vivado%20Basics/Implementation%20steps/impl_elaborated_netlist.png](../.pic/Vivado%20Basics/Implementation%20steps/impl_elaborated_netlist.png)
![../.pic/Introduction/Implementation%20steps/impl_elaborated_netlist.png](../.pic/Introduction/Implementation%20steps/impl_elaborated_netlist.png)

В левом окне мы видим наш нетлист. В нижней части обозначены узлы графа (элементы **ab_i**, **res_i**, **xabc_i**, которые представляют собой **И**, **мультиплексор** и **Исключающее ИЛИ** соответственно. Имена этих элементов схожи с именами проводов, присваиванием которым мы создавали данные элементы)

Expand All @@ -56,7 +56,7 @@ endmodule

После выполнения синтеза у нас появится возможность открыть новый схематик, сделаем это.

![../.pic/Vivado%20Basics/Implementation%20steps/impl_synthesised_netlist.png](../.pic/Vivado%20Basics/Implementation%20steps/impl_synthesised_netlist.png)
![../.pic/Introduction/Implementation%20steps/impl_synthesised_netlist.png](../.pic/Introduction/Implementation%20steps/impl_synthesised_netlist.png)

Мы видим, что между входами/выходами схемы и её внутренней логикой появились новые примитивы — **буферы**. Они нужны, преобразовать уровень напряжения между ножками ПЛИС и внутренней логикой (условно говоря, на вход плис могут приходить сигналы с уровнем `3.3 В`, а внутри ПЛИС примитивы работают с сигналами уровня `1.2 В`).

Expand Down Expand Up @@ -198,17 +198,17 @@ set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { resetn

После выполнения имплементации, нетлист и схема остаются неизменными, однако использованные для реализации схемы примитивы получают свой "адрес" внутри ПЛИС:

![cell_add../.pic/Vivado%20Basics/Implementation%20steps/impl_cell_address.pngress](../.pic/Vivado%20Basics/Implementation%20steps/impl_cell_address.png)
![cell_add../.pic/Introduction/Implementation%20steps/impl_cell_address.pngress](../.pic/Introduction/Implementation%20steps/impl_cell_address.png)

Теперь, мы можем посмотреть на "внутренности" нашей ПЛИС `xc7a100tcsg324-1` и то, как через её примитивы будет реализована наша схема. Для этого, необходимо отрыть имплементированное устройство: `Implementation -> Open implemented design`. Откроется следующее окно:

![../.pic/Vivado%20Basics/Implementation%20steps/impl_fpga_device_full_view.png](../.pic/Vivado%20Basics/Implementation%20steps/impl_fpga_device_full_view.png)
![../.pic/Introduction/Implementation%20steps/impl_fpga_device_full_view.png](../.pic/Introduction/Implementation%20steps/impl_fpga_device_full_view.png)

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

Нас интересует "[бледно-голубая точка](https://ru.wikipedia.org/wiki/Pale_Blue_Dot)", расположенная в нижнем левом углу прямоугольника `X0Y1` (выделено красным). Если отмасштабировать эту зону, мы найдем используемый нами LUT:

![../.pic/Vivado%20Basics/Implementation%20steps/impl_fpga_device_zoomed_view.png](../.pic/Vivado%20Basics/Implementation%20steps/impl_fpga_device_zoomed_view.png)
![../.pic/Introduction/Implementation%20steps/impl_fpga_device_zoomed_view.png](../.pic/Introduction/Implementation%20steps/impl_fpga_device_zoomed_view.png)

Кроме того, если поиграться со свойствами этого примитива, мы сможем найти нашу таблицу истинности, инициализирующую этот примитив.

Expand Down
2 changes: 1 addition & 1 deletion Introduction/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

Затем, для того чтобы закрепить понимание происходящего, вам предлагается прочитать документ "[How FPGA Works](./How%20FPGA%20works.md)", рассказывающий о том, как работает ПЛИС изнутри.

После прочтения второго документа, вам предлагается прочитать документ "[Implementation Steps](../Vivado%20Basics/Implementation%20steps.md)", который был размещен в папке "[Vivado Basics](../Vivado%20Basics/)" поскольку помимо теоретической информации он содержит и практическую информацию по работе с САПР Vivado. Этот документ дополнит ваше понимание о принципе работы ПЛИС и позволит посмотреть на некоторые её реальные элементы изнутри.
И в довершение, вам предлагается прочитать документ "[Implementation Steps](./Implementation%20steps.md)". Этот документ дополнит ваше понимание о принципе работы ПЛИС и позволит посмотреть на некоторые её реальные элементы изнутри.

Обратите внимание, что во втором абзаце не было использовано слово "поймете". Часто это слово несет не тот смысл. Можно прочесть документ и **понять** каждое его слово, но не постигнуть смысла, который в этих слова лежал (**слышать**, но не **слушать**). В романе Роберта Хайнлайна "_Чужок в чужой стране_" вводится особое марсианское слово, непереводимое на земной язык: "**грокать**", которое имеет множество значений. В первом приближении можно подумать, что это слово переводится как "понять", однако это не так. Например, на Марсе очень мало воды и процесс её питья марсианами (по сюжету романа, разумеется) является целым ритуалом, и обозначается этим же словом "грокать". Грокать что-то — означает что это что-то стало частью твоего естества. В отношении информации это означает, это информация стала частью тебя, изменила то как ты думаешь. Грокать — это постичь что-то на самом глубинном уровне, это видеть девушку в красном сквозь завесу падающих зеленых символов. Даже этот абзац расписан для того, чтобы вы не просто поняли что эти документы важно понять — а грокнули то, что эти документы важно грокнуть.

Expand Down
2 changes: 1 addition & 1 deletion Other/VSCode Verilog Simulation.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ end

## Как запустить симуляцию с предоставленными мне файлами?

Если вы пропустили, или не сделали какую-то из лаб, вам потребуется взять готовые модули из ветки [Я-не-смог](https://github.com/MPSU/APS/tree/%D0%AF-%D0%BD%D0%B5-%D1%81%D0%BC%D0%BE%D0%B3). Модули в этих ветках являются нетлистами (описанием модуля на языке Verilog, полученным [после этапа синтеза](../Vivado%20Basics/Implementation%20steps.md)).
Если вы пропустили, или не сделали какую-то из лаб, вам потребуется взять готовые модули из ветки [Я-не-смог](https://github.com/MPSU/APS/tree/%D0%AF-%D0%BD%D0%B5-%D1%81%D0%BC%D0%BE%D0%B3). Модули в этих ветках являются нетлистами (описанием модуля на языке Verilog, полученным [после этапа синтеза](../Introduction/Implementation%20steps.md)).
Для того, чтобы симулятор Icarus Verilog мог работать с этим файлом, необходимо предоставить ему библиотеку примитивов из которых был собран нетлист. Для этого, необходимо выполнить следующие шаги:

1. [Скачать](../../Я-не-смог/unisims.zip) библиотеку примитивов.
Expand Down
Loading

0 comments on commit 75192ec

Please sign in to comment.