mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
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:
committed by
GitHub
parent
78bb01ef95
commit
a28002e681
@@ -12,7 +12,7 @@
|
||||
|
||||

|
||||
|
||||
```SystemVerilog
|
||||
```Verilog
|
||||
module
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ endmodule
|
||||
|
||||

|
||||
|
||||
```SystemVerilog
|
||||
```Verilog
|
||||
module box();
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ endmodule
|
||||
|
||||

|
||||
|
||||
```SystemVerilog
|
||||
```Verilog
|
||||
module box(
|
||||
input logic a,
|
||||
input logic b,
|
||||
@@ -49,7 +49,7 @@ endmodule
|
||||
|
||||

|
||||
|
||||
```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`).
|
||||
|
||||

|
||||
|
||||
```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
|
||||
|
||||

|
||||
|
||||
```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?
|
||||
|
||||
|
Reference in New Issue
Block a user