WIP: APS cumulative update (#98)

* WIP: APS cumulative update

* Update How FPGA works.md

* Перенос раздела "Последовательностная логика" в отдельный док

* Исправление картинки

* Исправление оформления индексов

* Переработка раздела Vivado Basics

* Добавление картинки в руководство по созданию проекта

* Исправление ссылок в анализе rtl

* Обновление изображения в sequential logic

* Исправление ссылок в bug hunting

* Исправление ссылок

* Рефактор руководства по прошивке ПЛИС

* Mass update

* Update fig_10

* Restore fig_02
This commit is contained in:
Andrei Solodovnikov
2024-09-02 10:20:08 +03:00
committed by GitHub
parent 78bb01ef95
commit a28002e681
195 changed files with 3640 additions and 2664 deletions

View File

@@ -12,7 +12,7 @@
![../.pic/Basic%20Verilog%20structures/modules/fig_01.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_01.drawio.svg)
```SystemVerilog
```Verilog
module
@@ -23,7 +23,7 @@ endmodule
![../.pic/Basic%20Verilog%20structures/modules/fig_02.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_02.drawio.svg)
```SystemVerilog
```Verilog
module box();
@@ -34,7 +34,7 @@ endmodule
![../.pic/Basic%20Verilog%20structures/modules/fig_03.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_03.drawio.svg)
```SystemVerilog
```Verilog
module box(
input logic a,
input logic b,
@@ -49,7 +49,7 @@ endmodule
![../.pic/Basic%20Verilog%20structures/modules/fig_04.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_04.drawio.svg)
```SystemVerilog
```Verilog
module box(
input logic a,
input logic b,
@@ -62,13 +62,13 @@ module box(
endmodule
```
Для объявления провода `c` использовалось ключевое слово (тип) `logic`. Этот тип, подобно стволовым клеткам, может быть в конечном итоге привести к созданию как ячеек памяти (регистров), так и проводов, в зависимости от того, как было описано присваивание объекту этого типа. Поэтому в примере выше говорить о том, что был создан провод не совсем корректно, объект схемы `c` станет проводом, когда будет произведено подключение к этому объекту, соответствующее подключению провода.
Для объявления провода `c` использовалось ключевое слово (тип) `logic`. Этот тип может в конечном итоге привести к созданию как ячеек памяти (регистров), так и проводов, в зависимости от того, как было описано присваивание объекту этого типа (подобно тому как стволовые клетки организма могут дифференцироваться в специализированные клетки в зависимости от ситуации). Поэтому в примере выше говорить о том, что был создан провод не совсем корректно, объект схемы `c` станет проводом, когда будет произведено подключение к этому объекту, соответствующее подключению провода.
Подключим провод `c` ко входу `a`. Для этого используется конструкция `assign c = a;`. Такая конструкция называется **непрерывным присваиванием**. Если очень сильно упростить, то непрерывное присваивание схоже со спайкой двух проводов. После подобного присваивания, провод `c` всегда будет иметь то же значение, что и `a` — как только входной сигнал `a` изменит свое значение, внутренний провод `c` также изменит свое значение (проводу `c` будет **непрерывно присваиваться** значение входа `a`).
![../.pic/Basic%20Verilog%20structures/modules/fig_05.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_05.drawio.svg)
```SystemVerilog
```Verilog
module box(
input logic a,
input logic b,
@@ -95,7 +95,7 @@ endmodule
Такую схему можно реализовать следующим описанием:
```SystemVerilog
```Verilog
module box(
input logic a,
input logic b,
@@ -114,7 +114,7 @@ endmodule
![../.pic/Basic%20Verilog%20structures/modules/fig_07.drawio.svg](../.pic/Basic%20Verilog%20structures/modules/fig_07.drawio.svg)
```SystemVerilog
```Verilog
module box(
input logic a,
input logic b,
@@ -155,14 +155,18 @@ endmodule
Используя индекс, можно обратиться к отдельным битам вектора. С помощью диапазона индексов можно получить доступ к диапазону соответствующих битов.
|фрагмент кода|описание|
|-------------|--------|
|sum[0]; | Обращение к младшему биту вектора sum, объявленного выше|
|sum[7:4]; | Обращение к старшим четырем битам 8-битного вектора sum, объявленного выше|
|фрагмент кода|описание |
|-------------|-------------------------------------------------------------------------|
|sum[0]; | Обращение к младшему биту вектора sum, объявленного выше |
|sum[7:5]; | Обращение к старшим трём битам 8-битного вектора sum, объявленного выше |
|sum[5+:3]; | Обращение к трём битам, начиная со пятого (т.е. это аналог предыдущего выражения, удобно использовать, когда известен начальный бит и их количество, а конечный нужно считать через них) |
|sum[7-:3]; | Обращение к трём битам, заканчивая седьмым (т.е. это аналог предыдущего выражения, удобно использовать, когда известен конечный бит и их количество, а начальный нужно считать через них) |
Важно понимать, что векторы могут быть использованы и при описании портов модуля:
_Таблица 1. Способы обращения как к отдельным битам вектора, так и к диапазонам его бит._
```SystemVerilog
Векторы могут быть использованы и при описании портов модуля:
```Verilog
module vector_ex(
input logic [3:0] a, // У данного модуля четырехразрядный вход 'a'
output logic [7:0] b // и восьмиразрядный выход 'b'.
@@ -186,19 +190,18 @@ endmodule
Опишем `inv`:
```SystemVerilog
```Verilog
module inv(
input logic a,
output logic d
);
assign d = ~a;
endmodule
```
Опишем `top`:
```SystemVerilog
```Verilog
module top(
input logic a,
input logic b,
@@ -227,17 +230,7 @@ endmodule
Тогда в нашем описании добавится подключение второго модуля `inv` и провод `c`.
```SystemVerilog
module inv(
input logic a,
output logic d
);
assign d = ~a;
endmodule
```
```SystemVerilog
```Verilog
module top(
input logic a,
input logic b,
@@ -274,20 +267,20 @@ endmodule
___
## Итоги
## Итоги главы
1. Ключевым блоком в иерархии цифровой схемы, описанной на языке SystemVerilog является **модуль**. Модули позволяют выносить части сложной цифровой схемы в отдельные блоки, из которых потом и будет составлена итоговая схема, что сильно упрощает разработку.
2. Условно, модуль можно разделить на следующие части:
1. Объявление модуля:
1. Ключевые слова `module` / `endmodule` определяющие границы описания модуля.
2. Название модуля, следующее за ключевым словом `module`. Описанный модуль представляет собой отдельный тип, имя которого совпадает с названием модуля.
3. Указание входов и выходов (портов) модуля, идущих в круглых скобках после названия модуля. Для указания направления порта модуля используются ключевые слова `input` и `output`. После указание направления порта следует указать тип порта (в рамках данного курса типом портов всегда будет logic), его разрядность, а затем имя.
3. Указание входов и выходов (портов) модуля, идущих в круглых скобках после названия модуля. Для указания направления порта модуля используются ключевые слова `input` и `output`. После указание направления порта следует указать тип порта (в рамках данного курса типом портов всегда будет `logic`), его разрядность, а затем имя.
2. Функциональное описание модуля:
1. Объявление внутренних сигналов модуля (будь то проводов или регистров) с помощью ключевого слова `logic`.
2. Создание при необходимости объектов других модулей.
3. Описание функциональной связи между различными сигналами и объектами внутри описываемого модуля.
## Проверь себя
## Проверьте себя
Как, по-вашему, описать нижеприведенную схему на языке описания аппаратуры SystemVerilog?