From f793a5be7f9f01dff032a448e2bf8ede0e409d0b Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 12:03:49 +0300 Subject: [PATCH 01/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0?= =?UTF-8?q?=D1=82=D0=BA=D0=B8=20=D0=B2=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5?= =?UTF-8?q?=D0=B4=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=BD=D0=BE=D0=B9=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ERRATA.md | 26 +++++++++++++++++++++----- Introduction/Sequential logic.md | 2 +- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ERRATA.md b/ERRATA.md index 67d80bc..15f6e04 100644 --- a/ERRATA.md +++ b/ERRATA.md @@ -2,6 +2,22 @@ ![http://95.215.8.74:5000/days_since_last_commit.png](http://95.215.8.74:5000/days_since_last_commit.png) +**27.10.2025**: Исправлена опечатка в описании функционального поведения ведомой защёлки в составе D-триггера на стр. 41: + +```diff +- пока сигнал `clk = 0` ++ пока сигнал `clk = 1` +``` + +
+ Исправленная версия предложения + +Несмотря на то, что ведомая защёлка "прозрачна" всё то время, пока сигнал `clk = 1`, данные в ней остаются стабильными, поскольку выход ведущей защёлки больше не может измениться. + +
+ +

+ **22.05.2025**: Исправлено несоответствие в названиях модулей в ЛР10-12. - `irq_controller` следует читать как `interrupt_controller`; @@ -18,7 +34,7 @@ _Рисунок II.12-3. Структурная схема блока приор - +

**13.05.2025**: Исправлен рисунок II.8-3 — исправлена опечатка в названии нижнего сигнала (`mem_wd_i` → `mem_wd_o`). @@ -47,7 +63,7 @@ _Рисунок II.12-3. Структурная схема блока приор - +

**11.07.2025**: Обнаружена ошибка вёрстки в примере использования битовых сдвигов на стр. 79. Операции по установке, очистке и чтению N-го бита выглядят следующим образом: @@ -57,7 +73,7 @@ X = X & ~(1 << N); // Очистка N-го бита Y = (X & (1 << N)) != 0; // Чтение N-го бита ``` - +

**11.07.2025**: Исправлена опечатка в предпоследнем абзаце стр. 227 (в конце первого предложения должен был быть написан **LMA**): @@ -73,13 +89,13 @@ Y = (X & (1 << N)) != 0; // Чтение N-го бита - +

**16.06.2025**: Исправлена ошибка в _листинге II.14-2_. Предпоследнюю инструкцию (`lw a0, 40(a0)`) следует читать как `lw a0, 24(a0)`. - +

**29.03.2025**: Исправлен рисунок II.4-4 — убрана логика безусловного перехода, т.к. она должна была появиться только в следующем параграфе. diff --git a/Introduction/Sequential logic.md b/Introduction/Sequential logic.md index f0594ff..9a2687d 100644 --- a/Introduction/Sequential logic.md +++ b/Introduction/Sequential logic.md @@ -86,7 +86,7 @@ D-триггер — это элемент статической памяти, _Рисунок 5. Схема и таблица истинности D-триггера._ -Принцип работы D-триггера, схема которого представлена на _рис. 5_ заключается в том, что управляющий сигнал `E` одной защёлки является инверсией управляющего сигнала `E` другой защёлки. Это значит, что пока одна защёлка "прозрачна" и принимает данные со входа — другая "непрозрачна" и данные не принимает. В момент, когда тактовый синхроимпульс меняет своё значение с `0` на `1`, ведущая защёлка становится "непрозрачной" для новых данных с входа `D`, и "запертые" в ней данные попадают в только что открывшуюся ведомую защёлку. Несмотря на то, что ведомая защёлка "прозрачна" всё то время, пока сигнал `clk = 0`, данные в ней остаются стабильными, поскольку выход ведущей защёлки больше не может измениться. +Принцип работы D-триггера, схема которого представлена на _рис. 5_ заключается в том, что управляющий сигнал `E` одной защёлки является инверсией управляющего сигнала `E` другой защёлки. Это значит, что пока одна защёлка "прозрачна" и принимает данные со входа — другая "непрозрачна" и данные не принимает. В момент, когда тактовый синхроимпульс меняет своё значение с `0` на `1`, ведущая защёлка становится "непрозрачной" для новых данных с входа `D`, и "запертые" в ней данные попадают в только что открывшуюся ведомую защёлку. Несмотря на то, что ведомая защёлка "прозрачна" всё то время, пока сигнал `clk = 1`, данные в ней остаются стабильными, поскольку выход ведущей защёлки больше не может измениться. Описанные схемы бистабильных ячеек представляют собой скорее математическое описание элементов памяти — так проще объяснить принцип их работы. Если ваша технология позволяет реализовать элементы И, ИЛИ и НЕ — значит вы точно можете реализовать подобные элементы. При этом, используя особенности конкретной технологии, данные схемы можно реализовывать более эффективно. D-защёлку, к примеру, можно реализовать схемой, представленной на _рис. 6_. From dd9a7a20254d1e6342a621d21c06d19ebd042512 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 12:17:32 +0300 Subject: [PATCH 02/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=20Q=20=D0=B2=20=D1=81=D1=85=D0=B5=D0=BC=D0=B5=20=D1=8F?= =?UTF-8?q?=D1=87=D0=B5=D0=B9=D0=BA=D0=B8=20=D0=BF=D0=B0=D0=BC=D1=8F=D1=82?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Инвертированный выход Q̅ отображался без черты сверху в рис. 13 и 6 второй и третьей главы введения соответственно. --- .../Sequential logic/fig_06.drawio.svg | 129 +----------------- ERRATA.md | 11 ++ 2 files changed, 15 insertions(+), 125 deletions(-) diff --git a/.pic/Introduction/Sequential logic/fig_06.drawio.svg b/.pic/Introduction/Sequential logic/fig_06.drawio.svg index d98ff87..82e7757 100644 --- a/.pic/Introduction/Sequential logic/fig_06.drawio.svg +++ b/.pic/Introduction/Sequential logic/fig_06.drawio.svg @@ -1,125 +1,4 @@ - - - - - - - - - - - - - - - - - - - - -
-
-
- DATA -
-
-
-
- - DATA - -
-
- - - - - -
-
-
- READ or WRITE -
-
-
-
- - READ or WRITE - -
-
- - - - - -
-
-
-

- - -
- Q -

-
-
-
-
- - ... - -
-
- - - - - - -
-
-
- Q -
-
-
-
- - Q - -
-
- - - - -
-
-
- - CONFIGURATION -
- CONTROL -
-
-
-
-
- - CONFIGURATION... - -
-
- -
- - - - - Text is not SVG - cannot display - - - -
\ No newline at end of file + + + +
DATA
READ or WRITE


Q
CONFIGURATION
CONTROL
\ No newline at end of file diff --git a/ERRATA.md b/ERRATA.md index 15f6e04..bb36671 100644 --- a/ERRATA.md +++ b/ERRATA.md @@ -2,6 +2,17 @@ ![http://95.215.8.74:5000/days_since_last_commit.png](http://95.215.8.74:5000/days_since_last_commit.png) +**27.10.2025**: Исправлено отображение инверсии выхода Q̅ в _рисунках I.2-13_ и _I.3-6_. + +
+ Исправленная версия рисунка + +![.pic/Introduction/Sequential%20logic/fig_06.drawio.svg](.pic/Introduction/Sequential%20logic/fig_06.drawio.svg) + +
+ +

+ **27.10.2025**: Исправлена опечатка в описании функционального поведения ведомой защёлки в составе D-триггера на стр. 41: ```diff From 9e3042a2bb415e1d7ac6acf82c828fc48a629eac Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 12:24:55 +0300 Subject: [PATCH 03/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0?= =?UTF-8?q?=D1=82=D0=BA=D0=B8=20=D0=B2=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B5=20"=D0=9A=D0=B0=D0=BA=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20=D0=9F=D0=9B=D0=98=D0=A1?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Introduction/How FPGA works.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Introduction/How FPGA works.md b/Introduction/How FPGA works.md index a5ad840..d644e3f 100644 --- a/Introduction/How FPGA works.md +++ b/Introduction/How FPGA works.md @@ -175,7 +175,7 @@ _Рисунок 13. Программируемая ячейка памяти П ## Таблицы подстановки (Look-Up Tables, LUTs) -Представьте мультиплексор с четырьмя входными сигналами и двухбитным управляющим сигналом (обратите внимание, что в теперь это сигнал использует обычное двоичное кодирование). Но теперь, вместо того чтобы выставлять входные сигналы во внешний мир, давайте подключим их к программируемой памяти. Это означает, что мы можем "запрограммировать" каждый из входов на какое-то константное значение. Поместим то, что у нас получилось, в отдельный блок и вот, мы получили двухвходовую **Таблицу подстановки** (**Look-Up Tables**, далее **LUT**). +Представьте мультиплексор с четырьмя входными сигналами и двухбитным управляющим сигналом (обратите внимание, что теперь это сигнал использует обычное двоичное кодирование). Но теперь, вместо того чтобы выставлять входные сигналы во внешний мир, давайте подключим их к программируемой памяти. Это означает, что мы можем "запрограммировать" каждый из входов на какое-то константное значение. Поместим то, что у нас получилось, в отдельный блок и вот, мы получили двухвходовую **Таблицу подстановки** (**Look-Up Tables**, далее **LUT**). ![../.pic/Introduction/How%20FPGA%20works/fig_14.drawio.svg](../.pic/Introduction/How%20FPGA%20works/fig_14.drawio.svg) From 2e90212df9b68fb9d12bddde6c00d53683d8e808 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 12:37:45 +0300 Subject: [PATCH 04/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D1=81=D1=8B=D0=BB=D0=BE?= =?UTF-8?q?=D0=BA=20=D0=BD=D0=B0=20=D0=B8=D1=81=D1=82=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D0=B8=D0=BA=D0=B8=20=D0=B2=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B5=20"=D0=9F=D0=BE=D1=81=D0=BB=D0=B5?= =?UTF-8?q?=D0=B4=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=BD=D0=B0=D1=8F=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Introduction/Sequential logic.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Introduction/Sequential logic.md b/Introduction/Sequential logic.md index 9a2687d..8b8ae13 100644 --- a/Introduction/Sequential logic.md +++ b/Introduction/Sequential logic.md @@ -22,10 +22,13 @@ _Рисунок 1. Пример комбинационной (а), и после Последовательностная логика делится на **синхронную** и **асинхронную**. -**Синхронной логикой** называется такая логика, которая обновляет своё состояние (содержимое ячеек памяти) одновременно (**синхронно**) с фронтом тактового сигнала. В свою очередь **асинхронная последовательностная логика** — это логика, которая может обновлять своё состояние **асинхронно** (т.е. без привязки к фронту тактового синхроимпульса). Бывает также и синхронная логика с асинхронными сигналами предустановки/сброса. +**Синхронной логикой** называется такая логика, которая обновляет своё состояние (содержимое ячеек памяти) одновременно (**синхронно**) с фронтом тактового сигнала*. В свою очередь **асинхронная последовательностная логика** — это логика, которая может обновлять своё состояние **асинхронно** (т.е. без привязки к фронту тактового синхроимпульса). Бывает также и синхронная логика с асинхронными сигналами предустановки/сброса. Комбинационная логика по своей природе является асинхронной, поэтому в зависимости от контекста под "асинхронной логикой" может подразумеваться как комбинационная логика, так и последовательностная логика, которая может обновлять значение не по фронту тактового синхроимпульса. +> [!Info] +> В некоторых источниках синхронной логикой могут называть и ту, что работает по уровню (а не фронту) единого источника тактового синхроимпульса [[1, стр. 164](https://reader.lanbook.com/book/241166?lms=d92e0036d4c90623ffd0a8ecc34dee72)]. + ## Бистабильные ячейки **Бистабильная ячейка** — это элемент статической памяти, способный принимать одно из двух устойчивых состояний, соответствующих цифровым значениям "0" или "1". @@ -92,7 +95,7 @@ _Рисунок 5. Схема и таблица истинности D-триг ![../.pic/Introduction/Sequential%20logic/fig_06.drawio.svg](../.pic/Introduction/Sequential%20logic/fig_06.drawio.svg) -_Рисунок 6. Конфигурируемая ячейка памяти ПЛИС Xilinx XC2064 [[1, стр. 2-63](https://archive.org/details/programmablegate00xili/page/n93/mode/2up)]._ +_Рисунок 6. Конфигурируемая ячейка памяти ПЛИС Xilinx XC2064 [[2, стр. 2-63](https://archive.org/details/programmablegate00xili/page/n93/mode/2up)]._ ## Метастабильность @@ -179,6 +182,7 @@ _Рисунок 10. Схема и временная диаграмма прос ## Список источников -1. Xilinx / [The Programmable Gate Array Data Book](https://archive.org/details/programmablegate00xili); -2. J. Wakerly, Digital Design: Principles and Practices (5th Edition). Pearson, 2017; -3. [Метастабильность триггера и межтактовая синхронизация](https://habr.com/ru/articles/254869/). +1. [Д.М. Харрис, С.Л. Харрис / Цифровая схемотехника и архитектура компьютера: RISC-V / пер. с англ. В. С. Яценков, А. Ю. Романов; под. ред. А. Ю. Романова / М.: ДМК Пресс, 2021](https://e.lanbook.com/book/241166); +2. Xilinx / [The Programmable Gate Array Data Book](https://archive.org/details/programmablegate00xili); +3. J. Wakerly, Digital Design: Principles and Practices (5th Edition). Pearson, 2017; +4. [Метастабильность триггера и межтактовая синхронизация](https://habr.com/ru/articles/254869/). From 93d0a1eb67f624851bd94a2ac48309746f0ae7d1 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 14:00:14 +0300 Subject: [PATCH 05/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B8=D1=81=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B2=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=20"=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D1=8C=20=D1=81?= =?UTF-8?q?=D0=B5=D0=B1=D1=8F"=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=20=D0=BF=D0=BE=20=D0=BE=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8E=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/fig_10.drawio.svg | 303 +----------------- 1 file changed, 4 insertions(+), 299 deletions(-) diff --git a/.pic/Basic Verilog structures/modules/fig_10.drawio.svg b/.pic/Basic Verilog structures/modules/fig_10.drawio.svg index 1569db8..cc00a65 100644 --- a/.pic/Basic Verilog structures/modules/fig_10.drawio.svg +++ b/.pic/Basic Verilog structures/modules/fig_10.drawio.svg @@ -1,299 +1,4 @@ - - - - - - - - - -
-
-
- - top - -
-
-
-
- - top - -
-
- - - - -
-
-
- - a - -
-
-
-
- - a - -
-
- - - - -
-
-
- - b - -
-
-
-
- - b - -
-
- - - - -
-
-
- - q - -
-
-
-
- - q - -
-
- - - - - - - -
-
-
- - or - -
-
-
-
- - or - -
-
- - - -
-
-
- - a - -
-
-
-
- - a - -
-
- - - -
-
-
- - b - -
-
-
-
- - b - -
-
- - - -
-
-
- - or - -
-
-
-
- - or - -
-
- - - - - -
-
-
- - a - -
-
-
-
- - a - -
-
- - - -
-
-
- - d - -
-
-
-
- - d - -
-
- - - -
-
-
- - c - -
-
-
-
- - c - -
-
- - - - - -
-
-
- - b - -
-
-
-
- - b - -
-
- - - - - - - - -
-
-
- 2 -
-
-
-
- - 2 - -
-
- - - - - -
-
-
- [0] -
-
-
-
- - [0] - -
-
- - - -
-
-
- [1] -
-
-
-
- - [1] - -
-
- -
- - - - - Text is not SVG - cannot display - - - -
\ No newline at end of file + + + +
top
top
a
a
b
b
q
q
or
or
a
a
b
b
or
or
a
a
d
d
c
c
b
b
2
2
[1]
[1]
[0]
[0]
Text is not SVG - cannot display
\ No newline at end of file From 16901043486298a2ab81b345a6f8f951a59da7c9 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 14:01:51 +0300 Subject: [PATCH 06/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0?= =?UTF-8?q?=D1=82=D0=BA=D0=B8=20=D0=B2=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B5=20"=D0=9E=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=D0=B9?= =?UTF-8?q?=20=D0=BD=D0=B0=20SystemVerilog"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Basic Verilog structures/Modules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic Verilog structures/Modules.md b/Basic Verilog structures/Modules.md index 95e2530..497e6be 100644 --- a/Basic Verilog structures/Modules.md +++ b/Basic Verilog structures/Modules.md @@ -162,7 +162,7 @@ endmodule |-------------|-------------------------------------------------------------------------| |sum[0]; | Обращение к младшему биту вектора sum, объявленного выше | |sum[7:5]; | Обращение к старшим трём битам 8-битного вектора sum, объявленного выше | -|sum[5+:3]; | Обращение к трём битам, начиная со пятого (т.е. это аналог предыдущего выражения, удобно использовать, когда известен начальный бит и их количество, а конечный нужно считать через них) | +|sum[5+:3]; | Обращение к трём битам, начиная с пятого (т.е. это аналог предыдущего выражения, удобно использовать, когда известен начальный бит и их количество, а конечный нужно считать через них) | |sum[7-:3]; | Обращение к трём битам, заканчивая седьмым (т.е. это аналог предыдущего выражения, удобно использовать, когда известен конечный бит и их количество, а начальный нужно считать через них) | _Таблица 1. Способы обращения как к отдельным битам вектора, так и к диапазонам его бит._ From b8f85cdac90f11749e9adbe11946d573dde99116 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 14:06:46 +0300 Subject: [PATCH 07/25] =?UTF-8?q?=D0=A3=D1=82=D0=BE=D1=87=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=84=D0=BE=D1=80=D0=BC=D1=83=D0=BB=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=B2=20=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B5=20=D0=BF=D0=BE=20=D0=BE?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D1=8E=20=D0=BC=D1=83=D0=BB?= =?UTF-8?q?=D1=8C=D1=82=D0=B8=D0=BF=D0=BB=D0=B5=D0=BA=D1=81=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Basic Verilog structures/Multiplexors.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic Verilog structures/Multiplexors.md b/Basic Verilog structures/Multiplexors.md index 8ce0622..fba4fd5 100644 --- a/Basic Verilog structures/Multiplexors.md +++ b/Basic Verilog structures/Multiplexors.md @@ -61,7 +61,7 @@ assign Y = S==1 ? D1 : D0; ## Блок always -Блок `always` — это специальный блок, который позволяет описывать комбинационные и последовательностные схемы (см. документ "[Последовательностная логика](../Introduction/Sequential%20logic.md)"), используя более сложные конструкции, такие как `if-else`, `case`. На самом деле, в языке SystemVerilog помимо общего блока `always`, которым можно описать любой вид логики, существует множество специализированных блоков, предназначенных для описания отдельно комбинационной, синхронной и последовательностной асинхронной логики соответственно: +Блок `always` — это специальный блок, который позволяет описывать комбинационные и последовательностные схемы (см. документ "[Последовательностная логика](../Introduction/Sequential%20logic.md)"), используя более сложные конструкции, такие как `if-else`, `case`. На самом деле, в языке SystemVerilog помимо общего блока `always`, которым можно описать любой вид логики, существует множество специализированных блоков, предназначенных для описания отдельно комбинационной, последовательностной синхронной и асинхронной логики соответственно: - always_comb - always_ff From ad437aa56152089a2c25125843b27260c1507843 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 14:07:50 +0300 Subject: [PATCH 08/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82?= =?UTF-8?q?=D1=83=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=20=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B5=20=D0=BF=D0=BE=20=D0=BE?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D1=8E=20=D0=BC=D1=83=D0=BB?= =?UTF-8?q?=D1=8C=D1=82=D0=B8=D0=BF=D0=BB=D0=B5=D0=BA=D1=81=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Basic Verilog structures/Multiplexors.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Basic Verilog structures/Multiplexors.md b/Basic Verilog structures/Multiplexors.md index fba4fd5..35be89e 100644 --- a/Basic Verilog structures/Multiplexors.md +++ b/Basic Verilog structures/Multiplexors.md @@ -67,7 +67,7 @@ assign Y = S==1 ? D1 : D0; - always_ff - always_latch -Мультиплексор можно описать в любом из этих блоков, разница будет лишь в том, к чему именно будет подключен выход мультиплексора: к проводу, регистру, или защелке. +Мультиплексор можно описать в любом из этих блоков, разница будет лишь в том, к чему именно будет подключен выход мультиплексора: к проводу, регистру или защелке. В зависимости от вида `always`-блока используется один из двух видов присваиваний: **блокирующее присваивание** (`=`) и **неблокирующего присваивания** (`<=`). Подробно о различиях между присваиваниями рассказано в [этом документе](Assignments.md). До его прочтения запомните: @@ -86,7 +86,7 @@ assign Y = S==1 ? D1 : D0; Далее описывается присваивание сигнала, который должен идти на выход при управляющем сигнале равном единице (значение до оператора `:` в тернарном операторе). -После, в блоке `else` описывается присваивание сигнала, который должен идти на выход при управляющем сигнале равном нулю (значение после оператора `:` в тернарном операторе). +После в блоке `else` описывается присваивание сигнала, который должен идти на выход при управляющем сигнале, равном нулю (значение после оператора `:` в тернарном операторе). ```Verilog logic Y; From 070b21bb176280cf150d734bd3b998e5bb5e467f Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 14:13:11 +0300 Subject: [PATCH 09/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=84=D0=BE=D1=80=D0=BC=D1=83?= =?UTF-8?q?=D0=BB=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=B2=20=D0=B8?= =?UTF-8?q?=D1=82=D0=BE=D0=B3=D0=B0=D1=85=20=D0=B3=D0=BB=D0=B0=D0=B2=D1=8B?= =?UTF-8?q?=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Introduction/Sequential logic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Introduction/Sequential logic.md b/Introduction/Sequential logic.md index 8b8ae13..d590917 100644 --- a/Introduction/Sequential logic.md +++ b/Introduction/Sequential logic.md @@ -176,7 +176,7 @@ _Рисунок 10. Схема и временная диаграмма прос 11. **D-триггер** — это бистабильная ячейка, которая подобно D-защёлке имеет входы `clk` и `D`, но который сохраняет данные только в момент одного из фронтов тактового синхроимпульса (положительного или отрицательного фронта). Как и любые бистабильные ячейки, D-триггер подвержен явлению **метастабильности**. Метастабильность в D-триггере может возникнуть, если данные на входе `D` меняются во временном окне, расположенном в окрестностях фронта тактового синхроимпульса, определяемом следующими двумя параметрами: 1. Tsetup (**setup time**) — **время предустановки**. Это интервал, в течение которого сигнал на входе должен оставаться неизменным перед наступлением фронта тактового сигнала. 2. Thold (**hold time**) — **время удержания**. Это интервал, в течение которого сигнал на входе должен оставаться стабильным после наступления фронта тактового сигнала. -12. **Метастабильное состояние** — это состояние бистабильной ячейки, при котором та не находится ни в одном из стабильных цифровых состояниях: `0`/`1`, находясь при этом примерно посередине между ними. Через неопределённый (но предсказуемое с точки зрения вероятностей) промежуток времени, бистабильная ячейка может выйти из этого состояния, приняв любое из значений `0`/`1`. +12. **Метастабильное состояние** — это состояние бистабильной ячейки, при котором та не находится ни в одном из стабильных цифровых состояниях `0`/`1`, находясь при этом примерно посередине между ними. Через неопределённый промежуток времени (длину которого можно оценить с точки зрения вероятностей) бистабильная ячейка может выйти из этого состояния, приняв любое из значений `0`/`1`. 13. В большинстве случаев метастабильность является нежелательным явлением в цифровой схеме. Причиной такого явления может стать работа схемы на частоте, не подходящей для имеющегося у данной схемы критического пути. Для того, чтобы узнать, сможет ли схема работать на заданной частоте, проводится **статический временной анализ** (**static timing analysis**, **STA**). 14. Метастабильность может возникнуть и в случае, если сигнал данных по своей природе является асинхронным тактовому сигналу бистабильной ячейки: он может передаваться по событиям из внешнего мира, или с выхода бистабильных ячеек, работающих от других тактовых синхроимпульсов (подобная ситуация называется **пересечением тактовых доменов**, **clock domain crossing**, **CDC**). From fc8c9f8063f4ca3d72d7534e2b77b2aaf0d4857b Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 14:27:24 +0300 Subject: [PATCH 10/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B0=D0=B4=D0=B5=D0=B6?= =?UTF-8?q?=D0=B0=20=D0=B2=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=20=D0=BE=20=D0=BF=D1=80=D0=B8=D1=81=D0=B2=D0=B0?= =?UTF-8?q?=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Basic Verilog structures/Assignments.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Basic Verilog structures/Assignments.md b/Basic Verilog structures/Assignments.md index 2bab3e1..f35bf72 100644 --- a/Basic Verilog structures/Assignments.md +++ b/Basic Verilog structures/Assignments.md @@ -9,7 +9,7 @@ Начать придется издалека. Несмотря на то, что SystemVerilog является **языком описания аппаратуры**, он так же является и языком для верификации описанной аппаратуры (слово `Verilog` является объединением двух слов: `verification` и `logic` [[2](http://archive.computerhistory.org/resources/access/text/2013/11/102746653-05-01-acc.pdf), стр. 24]). Для целей верификации в языке выделено целое подмножество конструкций, которые не могут быть использованы для описания аппаратуры — так называемое "_несинтезируемое подмножество языка SystemVerilog_". Разумеется, часть языка, которая может быть использована для описания аппаратуры ("_синтезируемое подмножество языка SystemVerilog_") тоже может использоваться в верификации. -Давайте для начала разберемся в том, как будут использоваться операторы присваивания при программном моделировании (так называемой симуляции) — одним из инструментов верификации. Разобравшись в поведении операторов во время симуляции, будет куда проще объяснить результат использования операторов при синтезе цифровой схемы. +Давайте для начала разберемся в том, как будут использоваться операторы присваивания при программном моделировании (так называемой симуляции) — одном из инструментов верификации. Разобравшись в поведении операторов во время симуляции, будет куда проще объяснить результат использования операторов при синтезе цифровой схемы. Введем пару сокращений для удобства дальнейшего повествования: From ab2b9630083dbc689dea1a7b3beb3b56f04293b3 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 14:52:34 +0300 Subject: [PATCH 11/25] =?UTF-8?q?=D0=A3=D1=82=D0=BE=D1=87=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=84=D0=BE=D1=80=D0=BC=D1=83=D0=BB=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BE=D0=BA=20=D0=B2=20=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B5=20=D0=BE=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=D1=81=D0=B2=D0=B0=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Basic Verilog structures/Assignments.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Basic Verilog structures/Assignments.md b/Basic Verilog structures/Assignments.md index f35bf72..c9bc7c8 100644 --- a/Basic Verilog structures/Assignments.md +++ b/Basic Verilog structures/Assignments.md @@ -45,7 +45,7 @@ _Листинг 1. Пример непрерывного и процедурно Под "программными блоками" подразумеваются блоки `always` (всех типов) и `initial`. Есть и другие программные блоки, но в рамках данного курса лабораторных работ вы с ними не столкнетесь. Вообще говоря, синтаксис языка SystemVerilog допускает использование оператора `assign` внутри программного блока (так называемое "**процедурное непрерывное присваивание**") [[2, стр. 256]](https://ieeexplore.ieee.org/document/10458102), однако в рамках данного курса не существует ни одной ситуации, когда это может потребоваться и со 100% вероятностью будет ошибочно. -В отличие от непрерывного присваивания, **процедурное присваивание может быть использовано только в программных блоках**. +В отличие от непрерывного присваивания, **процедурное присваивание может быть использовано только в программных блоках** (процедурное присваивание в общем-то и является присваиванием, произошедшим в программном блоке). С точки зрения моделирования (не описания аппаратуры), программный блок — это программа (в привычном вам понимании парадигмы программирования), исполняющаяся в отдельном процессе. Программные блоки исполняются независимо друг от друга по определенным событиям. @@ -74,7 +74,7 @@ _Рисунок 1. Пример цепочки блокирующих присв 1. Сперва вычисляется `RHS` первого присваивания программного блока — константа `5`. 2. Затем, вычисленное значение записывается в LHS первого присваивания — сигнал `a` становится равным `5`. 3. Далее вычисляется `RHS` следующего присваивания — `a`, которое к этому моменту уже равно `5`. -4. Поскольку вычисленное `RHS` равняется `5` то `LHS` второго присваивания (`b`) тоже становится равным `5`. +4. Поскольку вычисленное `RHS` равняется `5`, `LHS` второго присваивания (`b`) тоже становится равным `5`. 5. Аналогичным образом `c` тоже становится равным `5`. Обратите внимание, что все это произошло в нулевой момент времени. На временной диаграмме Vivado просто отобразится, что все сигналы одновременно стали равны `5`, однако с точки зрения симулятора это было не так. Другие симуляторы (например `QuestaSim`) позволяют настроить временную диаграмму таким образом, чтобы отображались все переходы между присваиваниями. From c930d2d06910e505371feb3e04db1c000919bccb Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 14:52:52 +0300 Subject: [PATCH 12/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82?= =?UTF-8?q?=D1=83=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=20=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B5=20=D0=BE=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=D1=81=D0=B2=D0=B0=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Basic Verilog structures/Assignments.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Basic Verilog structures/Assignments.md b/Basic Verilog structures/Assignments.md index c9bc7c8..79b1dac 100644 --- a/Basic Verilog structures/Assignments.md +++ b/Basic Verilog structures/Assignments.md @@ -234,7 +234,7 @@ assign out = c; endmodule ``` -_Листинг 4. Цепочка блокирующих присваиваний в порядке обратном приведенному в Листинге 2._ +_Листинг 4. Цепочка блокирующих присваиваний в порядке, обратном приведенному в Листинге 2._ В этом случае, линтер не сообщит ни о каких ошибках, а Vivado сгенерирует схему, аналогичную _рис. 8_ @@ -369,7 +369,7 @@ _Листинг 7. Пример цепочки блокирующих присв > Обратите внимание на то, что `always_ff` поменялся на `always_comb`. -Как вы думаете, какая схема будет сгенерирована по описанию, представленному _Листинга 7_, и что произойдет с этой схемой, если заменить в нем все блокирующие присваивания на неблокирующие? +Как вы думаете, какая схема будет сгенерирована по описанию, представленному в _листинге 7_, и что произойдет с этой схемой, если заменить в нем все блокирующие присваивания на неблокирующие? --- From db58f701456a7bfef7560be11ef46145cff964e3 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 14:55:42 +0300 Subject: [PATCH 13/25] =?UTF-8?q?=D0=9B=D0=A02.=20=D0=98=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=82=D1=83=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Labs/02. Arithmetic-logic unit/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Labs/02. Arithmetic-logic unit/README.md b/Labs/02. Arithmetic-logic unit/README.md index 14b32f7..f522e04 100644 --- a/Labs/02. Arithmetic-logic unit/README.md +++ b/Labs/02. Arithmetic-logic unit/README.md @@ -266,7 +266,7 @@ _Таблица 2. Список операций сравнения._ **Выражения в этих двух таблицах приведены для примера. Не все из них можно просто переписать — часть этих выражений надо дополнить. Чтобы вы не копировали выражения, в них вставлены неподдерживаемые символы.** -Несмотря на разделение на вычислительные операции, и операции сравнения, в _Таблице 1_ (вычислительных операция) оказалось две операции `SLTS` и `SLTU`, которые выполняют сравнения. В итоге у нас есть две похожие пары инструкций: +Несмотря на разделение на вычислительные операции, и операции сравнения, в _Таблице 1_ (вычислительных операций) оказалось две операции: `SLTS` и `SLTU`, которые выполняют сравнения. В итоге у нас есть две похожие пары инструкций: - `LTS` - `LTU` From c75a3bc2f3d54d3d4fb007155d2ddce5b111d1db Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 14:59:37 +0300 Subject: [PATCH 14/25] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=20=D0=BF=D0=BE=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D1=83=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Vivado Basics/03. Project manager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Vivado Basics/03. Project manager.md b/Vivado Basics/03. Project manager.md index 21338e0..b9ead71 100644 --- a/Vivado Basics/03. Project manager.md +++ b/Vivado Basics/03. Project manager.md @@ -93,7 +93,7 @@ _Рисунок 6. Уведомление об обновлении иерарх После того, как Vivado закончит обновлять иерархию (и, если при создании файла вы отказались указывать порты модуля, нажав на кнопку `Cancel`), рядом с папкой `Design Sources` появится стрелка, позволяющая развернуть эту папку, внутри которой обнаружится подпапка `Non-module Files` с созданным нами файлом. Новый файл пометили таким образом, поскольку он не содержит модуля. Как только в нем окажется описание какого-нибудь модуля, эта подпапка пропадёт. -Откроем редактор двойным кликом по файлу `max_min.sv` и опишем в нём код, приведённый в листинге 1. В коде _листингов 1-3_ могут содержаться логические ошибки — они запланированы и будут найдены и исправлены в главе "Руководство по поиску и исправлению ошибок". +Откроем редактор двойным кликом по файлу `max_min.sv` и опишем в нём код, приведённый в листинге 1. В коде _листингов 1-3_ могут содержаться логические ошибки — они запланированы и будут найдены и исправлены в документе "[Руководство по поиску функциональных ошибок](./05.%20Bug%20hunting.md)". ```Verilog module max_min( From de5a19a41bc5225bde86b846e1811e81c82f85ed Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 15:03:55 +0300 Subject: [PATCH 15/25] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BE=D1=8E=D0=B7=D0=B0=20?= =?UTF-8?q?=D0=B2=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=20"=D0=BC=D0=B5=D0=BD=D0=B5=D0=B4=D0=B6=D0=B5=D1=80=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Vivado Basics/03. Project manager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Vivado Basics/03. Project manager.md b/Vivado Basics/03. Project manager.md index b9ead71..87d2406 100644 --- a/Vivado Basics/03. Project manager.md +++ b/Vivado Basics/03. Project manager.md @@ -41,7 +41,7 @@ _Рисунок 1. Окно исходных кодов проекта._ `Simulation Sources` хранит в себе иерархию верификационного окружения, **включая модули из папки** `Design Sources` — т.е. все модули (как синтезируемые, так и не синтезируемые), которые будут использованы при моделировании. -> Обратите внимание на то, вкладка `Hierarchy` не содержит файлов. Здесь отображается иерархия модулей проекта. Один модуль может быть использован несколько раз — и в этом случае он будет столько же раз отображён в иерархии, хотя файл, хранящий описание этого модуля останется один (см. _рис. 6_). +> Обратите внимание на то, что вкладка `Hierarchy` не содержит файлов. Здесь отображается иерархия модулей проекта. Один модуль может быть использован несколько раз — и в этом случае он будет столько же раз отображён в иерархии, хотя файл, хранящий описание этого модуля останется один (см. _рис. 6_). #### Добавление файла в проект From 8bb0dc396eee7dc09855312a02d909fa7ba1b8f9 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 27 Oct 2025 15:05:42 +0300 Subject: [PATCH 16/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B0=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D0=B8=20=D0=B2=20=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B5=20"=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=B4=D0=B6=D0=B5=D1=80=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Vivado Basics/03. Project manager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Vivado Basics/03. Project manager.md b/Vivado Basics/03. Project manager.md index 87d2406..323a2bf 100644 --- a/Vivado Basics/03. Project manager.md +++ b/Vivado Basics/03. Project manager.md @@ -51,7 +51,7 @@ _Рисунок 1. Окно исходных кодов проекта._ - файлы ограничений для синтеза схемы под конкретную ПЛИС (`Constraints`); - файлы проектируемой схемы (`Design Sources`); -- файлы верификационного окружения для верификации схемы (`Simulation Sources`). +- файлы верификационного окружения проектируемой схемы (`Simulation Sources`). ![../.pic/Vivado%20Basics/03.%20Project%20manager/fig_02.png](../.pic/Vivado%20Basics/03.%20Project%20manager/fig_02.png) From 8e9bea28de83dffbb4851899b78874065bcc37d6 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Tue, 28 Oct 2025 15:30:13 +0300 Subject: [PATCH 17/25] =?UTF-8?q?=D0=A1=D1=82=D0=B8=D0=BB=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B5=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=20"=D0=BC=D0=B5=D0=BD=D0=B5=D0=B4=D0=B6=D0=B5?= =?UTF-8?q?=D1=80=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Vivado Basics/03. Project manager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Vivado Basics/03. Project manager.md b/Vivado Basics/03. Project manager.md index 323a2bf..177570d 100644 --- a/Vivado Basics/03. Project manager.md +++ b/Vivado Basics/03. Project manager.md @@ -166,7 +166,7 @@ endmodule _Листинг 3. Описание модуля vector\_abs._ -В `Simulation Sources` добавьте файл tb_vector_abs, описываемый _листингом 4_. +В `Simulation Sources` добавьте файл `tb_vector_abs`, описываемый _листингом 4_. ```Verilog module tb_vector_abs(); From 449bccc4ca7674b431f5d2dc21d3d69f4dac12a4 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Tue, 28 Oct 2025 15:31:10 +0300 Subject: [PATCH 18/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82?= =?UTF-8?q?=D1=83=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=20=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B5=20"=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=B4=D0=B6=D0=B5=D1=80=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Vivado Basics/03. Project manager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Vivado Basics/03. Project manager.md b/Vivado Basics/03. Project manager.md index 177570d..f0712c8 100644 --- a/Vivado Basics/03. Project manager.md +++ b/Vivado Basics/03. Project manager.md @@ -251,7 +251,7 @@ _Рисунок 8. Иерархия проекта, представленная _Рисунок 9. Выбор модуля верхнего уровня (показана середина выпадающего списка)._ -Обратите внимание на то, как строится иерархия проекта. Модули, являющиеся объектами других модулей "вложены" в эти модули. Причем в иерархии проекта сперва указывается имя объекта модуля, затем через двоеточие имя самого модуля. В скобках указывается имя файла, где модуль описан. Модуль, который не содержится в других модулях не имеет имени объекта модуля (т.к. нет сущности, которая бы этот объект создавала). Если модуль будет содержать несколько объектов одного и того же модуля, в иерархии будут отображены все эти объекты — именно поэтому нужно понимать, чем иерархия модулей отличается от дерева файлов. Несмотря на то, что модуль описан всего в одном файле, в иерархии проекта может встречаться несколько экземпляров одного и того же модуля. +Обратите внимание на то, как строится иерархия проекта. Модули, являющиеся объектами других модулей "вложены" в эти модули. Причем в иерархии проекта сперва указывается имя объекта модуля, затем через двоеточие имя самого модуля. В скобках указывается имя файла, где модуль описан. Модуль, который не содержится в других модулях, не имеет имени объекта модуля (т.к. нет сущности, которая бы этот объект создавала). Если модуль будет содержать несколько объектов одного и того же модуля, в иерархии будут отображены все эти объекты — именно поэтому нужно понимать, чем иерархия модулей отличается от дерева файлов. Несмотря на то, что модуль описан всего в одном файле, в иерархии проекта может встречаться несколько экземпляров одного и того же модуля. Добавьте в `Simulation Sources` файл `tb_vector_abs`, содержимое которого представлено в _листинге 4_. From 530aeb2b13d0ab6337703c417b87b298e89f3ea6 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Tue, 28 Oct 2025 15:31:29 +0300 Subject: [PATCH 19/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D1=83=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=80=D1=83=D1=8E=D1=89=D0=B5=D0=B3=D0=BE=D1=81=D1=8F=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D1=82=D0=B0=20=D0=B2=20=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B5=20"=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=B4=D0=B6=D0=B5=D1=80=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Vivado Basics/03. Project manager.md | 65 ---------------------------- 1 file changed, 65 deletions(-) diff --git a/Vivado Basics/03. Project manager.md b/Vivado Basics/03. Project manager.md index f0712c8..d499fc0 100644 --- a/Vivado Basics/03. Project manager.md +++ b/Vivado Basics/03. Project manager.md @@ -253,71 +253,6 @@ _Рисунок 9. Выбор модуля верхнего уровня (пок Обратите внимание на то, как строится иерархия проекта. Модули, являющиеся объектами других модулей "вложены" в эти модули. Причем в иерархии проекта сперва указывается имя объекта модуля, затем через двоеточие имя самого модуля. В скобках указывается имя файла, где модуль описан. Модуль, который не содержится в других модулях, не имеет имени объекта модуля (т.к. нет сущности, которая бы этот объект создавала). Если модуль будет содержать несколько объектов одного и того же модуля, в иерархии будут отображены все эти объекты — именно поэтому нужно понимать, чем иерархия модулей отличается от дерева файлов. Несмотря на то, что модуль описан всего в одном файле, в иерархии проекта может встречаться несколько экземпляров одного и того же модуля. -Добавьте в `Simulation Sources` файл `tb_vector_abs`, содержимое которого представлено в _листинге 4_. - -```Verilog -module tb_vector_abs(); - -logic [31:0] a; -logic [31:0] b; -logic [31:0] res; - -vector_abs dut( - .x(a), - .y(b), - .abs(res) -); -integer err_count = 0; - -task check_result(input logic [31:0]a, b, res); -begin : check_result - reg [31:0] ref_res; - ref_res = a < b? a/2 + b : a + b/2; - if (res !== ref_res) begin - $display("Incorrect res at time %0t:", $time); - $display("a = %0d, b = %0d", a, b); - $display("design res = %0d", res); - $display("reference res = %0d", ref_res); - $display("------------------"); - err_count = err_count + 1'b1; - end -end -endtask - -initial begin : test - integer i; - $timeformat(-9,0,"ns"); - a = 0; b = 0; - #5; - check_result(a,b,res); - - - a = 1; b = 1; - #5; - check_result(a,b,res); - - a = 3; b = 4; - #5; - check_result(a,b,res); - - - for(i = 0; i < 100; i=i+1) begin - a = $random()&32'hff; b = $random()&32'hff; - #5; - check_result(a,b,res); - end - - $display("Test has been finished with %d errors", err_count); - if(err_count == 0) begin - $display("SUCCESS!"); - end - $finish(); -end -endmodule -``` - -_Листинг 4. Описание модуля tb\_vector\_abs._ - #### Ошибки иерархии В случае, если при создании какого-либо из файлов вы ошиблись с папкой назначения (добавили файл, предназначенный для `Design Sources` в `Simulation Sources` или наоборот), вы можете перенести этот файл в нужную папку без необходимости его удаления и повторного добавления. Для этого кликните по нужному файлу правой кнопкой мыши и выберите `Move to Design/Simulation sources` (см. _рис. 10_). From 46233e3a6ac3662801b9a4afff3ca8da302f7e66 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Tue, 28 Oct 2025 15:41:28 +0300 Subject: [PATCH 20/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B0=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D0=B8=20=D0=B2=20=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B5=20=D0=BE=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D1=83=D1=81=D0=BA=D0=B5=20=D1=81=D0=B8=D0=BC=D1=83=D0=BB?= =?UTF-8?q?=D1=8F=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Vivado Basics/04. Simulation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Vivado Basics/04. Simulation.md b/Vivado Basics/04. Simulation.md index ed2897c..c460978 100644 --- a/Vivado Basics/04. Simulation.md +++ b/Vivado Basics/04. Simulation.md @@ -14,7 +14,7 @@ _Рисунок 1. Запуск симуляции через вкладку `SIMULATION` окна `Flow Navigator`._ -1. В иерархии проекта нажать по папке `sim_1` правой кнопкой мыши, далее выбрать `Run Simulation` → `Run Behavioral Simulation`. +2. В иерархии проекта нажать по папке `sim_1` правой кнопкой мыши, далее выбрать `Run Simulation` → `Run Behavioral Simulation`. ![../.pic/Vivado%20Basics/04.%20Simulation/fig_02.png](../.pic/Vivado%20Basics/04.%20Simulation/fig_02.png) @@ -55,7 +55,7 @@ _Рисунок 3. Окно симуляции._ 4. перезапустить симуляцию (по умолчанию горячей клавиши нет, но может быть добавлена в настройках); 5. закрыть симуляцию. -Отличие сброса симуляции от её перезапуска отличается в следующем. При сбросе симуляции очищаются промоделированные значения добавленных на временную диаграмму сигналов (сами сигналы остаются на месте), при этом время симуляции перемещается на нулевую отметку (т.е симуляция начнется заново). Подобное действие может быть необходимо в случае отладки, или же если посреди моделирования вы добавили на временную диаграмму новые сигналы, и хотите увидеть их поведение с самого начала симуляции. При сбросе симуляции не выполняется компиляция исходников (даже если их содержимое было изменено). +Отличие сброса симуляции от её перезапуска заключается в следующем. При сбросе симуляции очищаются промоделированные значения добавленных на временную диаграмму сигналов (сами сигналы остаются на месте), при этом время симуляции перемещается на нулевую отметку (т.е симуляция начнется заново). Подобное действие может быть необходимо в случае отладки, или же если посреди моделирования вы добавили на временную диаграмму новые сигналы, и хотите увидеть их поведение с самого начала симуляции. При сбросе симуляции не выполняется компиляция исходников (даже если их содержимое было изменено). Перезапуск симуляции похож на закрытие симуляции и повторное её открытие. При этом, если в исходниках происходили изменения — файлы будут перекомпилированы. Обратите внимание, что Vivado в первую очередь обнаруживает только изменения, сделанные из собственного редактора. В случае, если файлы были изменены извне (в особенности это касается `mem`-файлов, которые начинают использоваться начиная с четвертой лабораторной работы) — Vivado может не обнаружить новых изменений. В случае, если симуляция ранее уже запускалась и с тех пор Vivado не обнаружил изменений в файлах — повторная компиляция, не производится и симуляция запускается средствами уже скомпилированных объектов. В случае, если изменения были сделаны извне, но Vivado их не обнаружил, можно очистить предыдущую сборку нажав правой кнопкой мыши по кнопки `Simulation` в окне `Flow Navigator` и выбрав `Reset Behavioral Simulation` (см. _рис. 4_). From e82ec9a8361122e1824ecf9f0189ce41b9a58409 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Tue, 28 Oct 2025 15:41:48 +0300 Subject: [PATCH 21/25] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=83=D0=BD=D0=BA=D1=82?= =?UTF-8?q?=D1=83=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=20=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B5=20=D0=BE=20=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D1=83=D0=BB=D1=8F=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Vivado Basics/04. Simulation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Vivado Basics/04. Simulation.md b/Vivado Basics/04. Simulation.md index c460978..ca42bf5 100644 --- a/Vivado Basics/04. Simulation.md +++ b/Vivado Basics/04. Simulation.md @@ -57,7 +57,7 @@ _Рисунок 3. Окно симуляции._ Отличие сброса симуляции от её перезапуска заключается в следующем. При сбросе симуляции очищаются промоделированные значения добавленных на временную диаграмму сигналов (сами сигналы остаются на месте), при этом время симуляции перемещается на нулевую отметку (т.е симуляция начнется заново). Подобное действие может быть необходимо в случае отладки, или же если посреди моделирования вы добавили на временную диаграмму новые сигналы, и хотите увидеть их поведение с самого начала симуляции. При сбросе симуляции не выполняется компиляция исходников (даже если их содержимое было изменено). -Перезапуск симуляции похож на закрытие симуляции и повторное её открытие. При этом, если в исходниках происходили изменения — файлы будут перекомпилированы. Обратите внимание, что Vivado в первую очередь обнаруживает только изменения, сделанные из собственного редактора. В случае, если файлы были изменены извне (в особенности это касается `mem`-файлов, которые начинают использоваться начиная с четвертой лабораторной работы) — Vivado может не обнаружить новых изменений. В случае, если симуляция ранее уже запускалась и с тех пор Vivado не обнаружил изменений в файлах — повторная компиляция, не производится и симуляция запускается средствами уже скомпилированных объектов. В случае, если изменения были сделаны извне, но Vivado их не обнаружил, можно очистить предыдущую сборку нажав правой кнопкой мыши по кнопки `Simulation` в окне `Flow Navigator` и выбрав `Reset Behavioral Simulation` (см. _рис. 4_). +Перезапуск симуляции похож на закрытие симуляции и повторное её открытие. При этом, если в исходниках происходили изменения — файлы будут перекомпилированы. Обратите внимание, что Vivado в первую очередь обнаруживает только изменения, сделанные из собственного редактора. В случае, если файлы были изменены извне (в особенности это касается `mem`-файлов, которые начинают использоваться с четвертой лабораторной работы) — Vivado может не обнаружить новых изменений. В случае, если симуляция ранее уже запускалась и с тех пор Vivado не обнаружил изменений в файлах — повторная компиляция не производится, и симуляция запускается средствами уже скомпилированных объектов. В случае, если изменения были сделаны извне, но Vivado их не обнаружил, можно очистить предыдущую сборку, нажав правой кнопкой мыши по `Simulation` в окне `Flow Navigator` и выбрав `Reset Behavioral Simulation` (см. _рис. 4_). ![../.pic/Vivado%20Basics/04.%20Simulation/fig_04.png](../.pic/Vivado%20Basics/04.%20Simulation/fig_04.png) @@ -69,4 +69,4 @@ _Рисунок 4. Сброс файлов симуляции._ > Если вы изменили модуль верхнего уровня в `Simulation Sources`, вам необходимо закрыть текущую симуляцию. Без этого новая не сможет запуститься и будет выдавать ошибку "boost filesystem remove: Процесс не может получить доступ к файлу". Подробнее об этой ошибке рассказано можно прочесть в "[Списке типичных ошибок в Vivado](../Other/FAQ.md)". -Подробнее о поиске ошибок и работе с временной диаграммой рассказано в главе "Руководство по поиску ошибок". +Подробнее о поиске ошибок и работе с временной диаграммой рассказано в главе "[Руководство по поиску функциональных ошибок](05.%20Bug%20hunting.md)". From 200fb19e501b8c500455f881918b0ee6dc544e45 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Tue, 28 Oct 2025 15:50:10 +0300 Subject: [PATCH 22/25] =?UTF-8?q?=D0=A1=D1=82=D0=B8=D0=BB=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=20"=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=B1=D0=BE=D0=BA"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Vivado Basics/05. Bug hunting.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Vivado Basics/05. Bug hunting.md b/Vivado Basics/05. Bug hunting.md index f383501..74241dc 100644 --- a/Vivado Basics/05. Bug hunting.md +++ b/Vivado Basics/05. Bug hunting.md @@ -31,13 +31,13 @@ 1. Обычно всё начинается с сообщения в логе тестов (никто не проверяет глазами временную диаграмму сложных проектов, состоящую из тысяч сигналов, меняющихся миллионы раз за микросекунду), но на наших лабораторных работах с относительно простыми модулями, этот шаг иногда может быть и пропущен. Сообщение в логе обычно содержит следующую ключевую информацию: имя сигнала, на котором установилось неверное значение, и время, когда это произошло. Чем лучше написано верификационное окружение, тем больше ключевой информации будет отражено в сообщении, поэтому его написание является своего рода искусством. -1. Получив имя сигнала и время, мы отправляемся на временную диаграмму и проверяем нашу ошибку. Как это сделать? Необходимо определить по коду, какие сигналы и каким образом управляют нашим сигналом. Вариантов может быть несколько: +2. Получив имя сигнала и время, мы отправляемся на временную диаграмму и проверяем нашу ошибку. Как это сделать? Необходимо определить по коду, какие сигналы и каким образом управляют нашим сигналом. Вариантов может быть несколько: 1. Управляющие сигналы имеют корректное значение, но логика, по которой они управляют сигналом неверна, из-за этого на нем возникает неверное значение. Это идеальный случай, при возникновении которого мы сразу же находим причину проблемы и исправляем ее. 2. Логика управления верна, а какая-то часть управляющих сигналов имеет неверное значение (пусть для примера, неверное значение будет на управляющем сигнале `X`). Это означает, что обнаруженное несоответствие сигналов является уже следствием какой-то ошибки, и мы должны вернуться к шагу 2, проверяя источники для сигнала со значением `X`. Так происходит до тех пор, пока мы не попадаем в тип 1. 3. Логика управления и значения управляющих сигналов верны. Это самый сложный тип ошибок, который заключается либо в ошибке в спецификации разрабатываемого устройства, либо в САПРе или компонентах, влияющих на его работу. В рамках данного курса вас не должны заботить данные ошибки, и при их возникновении вам стоит обратиться к преподавателю (предварительно убедившись, что ошибка совершенно точно не подходит под первые два варианта). 4. Любая возможная комбинация всех предыдущих типов. -2. Обнаружив первопричину ошибки, мы исправляем ее (возможно дополняя набор тестов, или внеся правки в спецификацию), и повторно запускаем все тесты, чтобы убедиться в двух вещах: +3. Обнаружив первопричину ошибки, мы исправляем ее (возможно дополняя набор тестов, или внеся правки в спецификацию), и повторно запускаем все тесты, чтобы убедиться в двух вещах: 1. ошибка действительно исправлена 2. исправление ошибки не породило новых ошибок @@ -61,7 +61,7 @@ _Рисунок 2. Пример конкретной ошибки в тесте. ## Поиск ошибки на временной диаграмме -Давайте найдем это место на временной диаграмме. Обычно, сразу после запуска симуляции на временной диаграмме отображено место, где симуляция остановилась (возможно с очень неподходящим масштабом). Для начала подгоним масштаб таким образом, чтобы вся временная диаграмма умещалась в окне. Это делается либо нажатием правой кнопкой мыши по в области отображения сигналов, с выбором "Full View" во всплывающем меню, либо нажатием соответствующей кнопки на панели временной диаграммы (см. _рис. 4_), либо нажатием комбинации клавиш `Ctrl+0`. Затем найдем приблизительное место рядом с тем временем, что нас интересует, установим там курсор, и приблизим масштаб (покрутив колесиком мыши при зажатой клавише `Ctrl`), периодически уточняя местоположения курсора, пока не найдем интересующее нас место. +Давайте найдем это место на временной диаграмме. Обычно, сразу после запуска симуляции на временной диаграмме отображено место, где симуляция остановилась (возможно с очень неподходящим масштабом). Для начала подгоним масштаб таким образом, чтобы вся временная диаграмма умещалась в окне. Это делается либо нажатием правой кнопкой мыши по области отображения сигналов, с выбором "Full View" во всплывающем меню, либо нажатием соответствующей кнопки на панели временной диаграммы (см. _рис. 4_), либо нажатием комбинации клавиш `Ctrl+0`. Затем найдем приблизительное место рядом с тем временем, что нас интересует, установим там курсор, и приблизим масштаб (покрутив колесиком мыши при зажатой клавише `Ctrl`), периодически уточняя местоположения курсора, пока не найдем интересующее нас место. ![../.pic/Vivado%20Basics/05.%20Bug%20hunting/fig_03.png](../.pic/Vivado%20Basics/05.%20Bug%20hunting/fig_03.png) @@ -259,7 +259,7 @@ _Рисунок 19. Результат моделирования после и В логе сообщается о 102 найденных ошибках. Ровно на одну ошибку меньше, чем было ранее. Это не означает, что в проекте осталось 102 ошибки, только то, что, исправив данную ошибку — мы действительно что-то исправили, и один из тестовых сценариев, который ранее завершался ошибкой, теперь завершился без неё. -Помните, что если в проекте много ошибок, то часть ошибок может выправлять поведение других ошибок (хоть и не всегда, но иногда минус на минус может выдать плюс контексте ошибок проекта), поэтому надо с осторожностью полагаться на число найденных ошибок, если это число больше нуля. +Помните, что если в проекте много ошибок, то часть ошибок может выправлять поведение других ошибок (хоть и не всегда, но иногда минус на минус может выдать плюс в контексте ошибок проекта), поэтому надо с осторожностью полагаться на число найденных ошибок, если это число больше нуля. Посмотрим на нашу временную диаграмму снова, и выберем дальнейшие действия: @@ -303,7 +303,7 @@ _Рисунок 21. Первая ошибка в новом логе модел assign abs = max + min_half; ``` -Выход `abs` зависит от двух внутренних сигналов: max и `min_half`. В соответствии с нашим алгоритмом, либо проблема в логике, связывающей эти два сигнала (операции сложения), либо в значении какого-то из этих сигналов, либо комбинации этих вариантов. +Выход `abs` зависит от двух внутренних сигналов: `max` и `min_half`. В соответствии с нашим алгоритмом, либо проблема в логике, связывающей эти два сигнала (операции сложения), либо в значении какого-то из этих сигналов, либо комбинации этих вариантов. Изучив модуль, мы понимаем, что в логике этого присваивания проблем нет, т.к. оно повторяет логику формулы `max + min/2`, складывая максимум с половиной минимума. Значит проблема в значении какого-то из этих сигналов (или обоих из них). Посчитаем значения этих сигналов самостоятельно (для сложного проекта эти значения посчитала бы модель): From 40911947d622ac080758dc41977bdf09e08a670d Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Tue, 28 Oct 2025 15:54:43 +0300 Subject: [PATCH 23/25] =?UTF-8?q?=D0=A1=D1=82=D0=B8=D0=BB=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=20=D0=BF=D0=BE=20=D0=BE=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8E=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Basic Verilog structures/Registers.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Basic Verilog structures/Registers.md b/Basic Verilog structures/Registers.md index d7b0675..351b8d2 100644 --- a/Basic Verilog structures/Registers.md +++ b/Basic Verilog structures/Registers.md @@ -59,7 +59,7 @@ end ``` > [!IMPORTANT] -> Обратите внимание на оператор `<=`. В данном случае, это не знак "меньше либо равно", а оператор **неблокирующего присваивания**. Существует оператор **блокирующего присваивания** (`=`), который может поменять способ построения схемы для такого же выражения справа от оператора. Хоть это и плохая практика в обучении, но пока вам надо просто запомнить: **при описании записи в регистр всегда используйте оператор неблокирующего присваивания `<=`**. Подробнее о рассказано в документе "[О различиях между блокирующими и неблокирующими присваиваниями](./Assignments.md)". +> Обратите внимание на оператор `<=`. В данном случае, это не знак "меньше либо равно", а оператор **неблокирующего присваивания**. Существует оператор **блокирующего присваивания** (`=`), который может поменять способ построения схемы для такого же выражения справа от оператора. Хоть это и плохая практика в обучении, но пока вам надо просто запомнить: **при описании записи в регистр всегда используйте оператор неблокирующего присваивания `<=`**. Подробнее рассказано в документе "[О различиях между блокирующими и неблокирующими присваиваниями](./Assignments.md)". Помимо прочего, нам необходимо связать выход схемы с выходом регистра. Это можно сделать уже известным вам оператором **непрерывного присваивания** `assign`. @@ -113,7 +113,7 @@ endmodule Обратите внимание на очередность условий. В первую очередь, мы проверяем условие **сброса**, и только после этого условие **разрешения на запись**. Если сперва проверить разрешение на запись, а затем в блоке `else` описать логику сброса, то регистр не будет сбрасываться в случае, если `enable` будет равен `1` (запись в регистр будет приоритетней его сброса). Если сброс описать не в блоке `else`, а в отдельном блоке `if`, то может возникнуть неопределенное поведение: нельзя однозначно сказать, что запишется в регистр, если одновременно придут сигналы `reset` и `enable`. Поэтому при наличии сигнала сброса, остальная логика по записи в регистр должна размещаться в блоке `else`. -Кроме того, САПР-ы смотрят на паттерн описания элемента схемы, и когда распознают его, реализуют элемент так как задумывал разработчик. Поэтому при описании регистра всегда сперва описывается сигнал сброса (если он используется) и только затем в блоке `else` описывается вся остальная часть логики записи. +Кроме того, САПР смотрят на паттерн описания элемента схемы и, когда распознают его, реализуют элемент так, как задумывал разработчик. Поэтому при описании регистра всегда сперва описывается сигнал сброса (если он используется) и только затем в блоке `else` описывается вся остальная часть логики записи. Итоговая схема регистра со сбросом и сигналом разрешения записи: @@ -193,7 +193,7 @@ endmodule Поэтому так важно разобраться в базовом способе описания регистра. -Более того, с точки зрения синтезатора данное описание проще для синтеза, т.к. ему не разделять из одного `always` блока комбинационную и синхронные части. +Более того, с точки зрения синтезатора данное описание проще для синтеза, т.к. ему не надо разделять из одного `always` блока комбинационную и синхронные части. Вообще говоря, регистр в общем смысле этого слова представляет собой многоразрядную конструкцию (в рассмотренном ранее примере, 1-битный регистр мог представлять из себя простой D-триггер). Создание многоразрядного регистра мало отличается от создания многоразрядного провода, а описание логики записи в многоразрядный регистр ничем не отличается от логики записи в одноразрядный регистр: From e69490613ad165fba80a90bc540bf339461bb2c7 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Tue, 28 Oct 2025 17:54:25 +0300 Subject: [PATCH 24/25] =?UTF-8?q?=D0=9B=D0=A03.=20=D0=9F=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=82=D1=83=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Labs/03. Register file and memory/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Labs/03. Register file and memory/README.md b/Labs/03. Register file and memory/README.md index 99130d8..17c51dc 100644 --- a/Labs/03. Register file and memory/README.md +++ b/Labs/03. Register file and memory/README.md @@ -41,9 +41,9 @@ Для ОЗУ требуется больше сигналов. Кроме входного `addr` и выходного `read_data` добавляются: входные данные для записи `write_data`, сигнал синхронизации `clk`, который определяет момент записи данных и сигнал разрешения на запись `write_enable`, который контролирует нужно ли записывать данные или только считывать. Для того, чтобы записать информацию в такую память необходимо: -- выставить адрес `addr` в который планируется запись данных, +- выставить адрес `addr`, в который планируется запись данных, - выставить сами данные для записи на вход `write_data`, -- установить сигнал `write_enable` в состояние разрешения записи (как правило это 1) и +- установить сигнал `write_enable` в состояние разрешения записи (как правило, это 1) и - дождаться нужного (положительного, либо отрицательного) фронта `clk` — в этот момент данные будут записаны по указанному адресу. Также возможна реализация, в которой вход `write_data` и выход `read_data` объединены в единый вход/выход `data`. В этом случае операции чтения и записи разделены во времени и используют для этого один единый порт ввода-вывода (`inout`, двунаправленный порт) `data`. @@ -54,7 +54,7 @@ _Рисунок 1. Примеры блоков ПЗУ и ОЗУ._ Кроме того, различают память с **синхронным** и **асинхронным** чтением. В первом случае, перед выходным сигналом шины данных ставится дополнительный регистр, в который по тактовому синхроимпульсу записываются запрашиваемые данные. Такой способ может значительно сократить **критический путь** цифровой схемы, но требует дополнительный такт на доступ в память. В свою очередь, асинхронное чтение позволяет получить данные, не дожидаясь очередного синхроимпульса, но такой способ увеличивает критический путь. -Еще одной характеристикой памяти является количество доступных портов чтения или записи (не путайте с портами модуля, которые являются любыми его входными/выходными сигналами). Количество портов определяет к скольким ячейкам памяти можно обратиться одновременно. Проще говоря, сколько входов адреса существует. Все примеры памяти рассмотренные выше являются **однопортовыми**, то есть у них один порт. Например, если у памяти 2 входа адреса `addr1` и `addr2` — это **двухпортовая память**. При этом не важно, можно ли по этим адресам только читать/писать или выполнять обе операции. +Еще одной характеристикой памяти является количество доступных портов чтения или записи (не путайте с портами модуля, которые являются любыми его входными/выходными сигналами). Количество портов определяет, к скольким ячейкам памяти можно обратиться одновременно. Проще говоря, сколько входов адреса существует. Все примеры памяти рассмотренные выше являются **однопортовыми**, то есть у них один порт. Например, если у памяти 2 входа адреса `addr1` и `addr2` — это **двухпортовая память**. При этом не важно, можно ли по этим адресам только читать/писать или выполнять обе операции. Регистровый файл, который будет реализован в рамках данной работы, является **трехпортовым**, и имеет 2 порта на чтение и 1 порт на запись. @@ -297,7 +297,7 @@ endmodule _Листинг 4. SystemVerilog-описание памяти инструкций._ -### 3. Регистровый файл +### 2. Регистровый файл Необходимо описать на языке SystemVerilog модуль регистрового файла для процессора с архитектурой RISC-V, представляющего собой трехпортовое ОЗУ с двумя портами на чтение и одним портом на запись и состоящей из 32-х 32-битных регистров, объединенных в массив с именем `rf_mem`. From 306162bdb4db27bc1272eb6efafcf92aa338a16e Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Tue, 28 Oct 2025 17:54:37 +0300 Subject: [PATCH 25/25] =?UTF-8?q?=D0=9B=D0=A03.=20=D0=A3=D1=82=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=84=D0=BE=D1=80=D0=BC=D1=83?= =?UTF-8?q?=D0=BB=D0=B8=D1=80=D0=BE=D0=B2=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ERRATA.md | 11 +++++++++++ Labs/03. Register file and memory/README.md | 6 +++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/ERRATA.md b/ERRATA.md index bb36671..d6718ce 100644 --- a/ERRATA.md +++ b/ERRATA.md @@ -2,6 +2,17 @@ ![http://95.215.8.74:5000/days_since_last_commit.png](http://95.215.8.74:5000/days_since_last_commit.png) +**28.10.2025**: В ЛР№3 (стр. 90) указано неверное количество блоков, необходимое для реализации 1 KiB памяти. + +
+ Исправленная версия абзаца + +Таким образом, преимущество распределенной памяти относительно регистровой заключается в лучшей утилизации ресурсов: одним трёхвходовым LUT можно описать до 8 бит распределенной памяти, в то время как одним D-триггером можно описать только один бит регистровой памяти. Предположим, что в ПЛИС размещены логические блоки, структура которых изображена на _рис. 2_ и нам необходимо реализовать 1 KiB памяти. Мы можем реализовать распределенную память, используя 512 логических блоков (в каждом блоке два трёхвходовых LUT), либо регистровую память, используя 8192 логических блока. + +
+ +

+ **27.10.2025**: Исправлено отображение инверсии выхода Q̅ в _рисунках I.2-13_ и _I.3-6_.
diff --git a/Labs/03. Register file and memory/README.md b/Labs/03. Register file and memory/README.md index 17c51dc..4d9d706 100644 --- a/Labs/03. Register file and memory/README.md +++ b/Labs/03. Register file and memory/README.md @@ -64,13 +64,13 @@ _Рисунок 1. Примеры блоков ПЗУ и ОЗУ._ _Рисунок 2. Структурная схема логического блока в ПЛИС[[1]](https://en.wikipedia.org/wiki/Field-programmable_gate_array)._ -В логическом блоке есть **таблицы подстановки** (Look Up Table, LUT), которые представляют собой не что иное как память, которая конфигурируется под нужды хранения, а не реализацию логики. Таким образом, трехвходовой LUT может выступать в роли 8-битной памяти. +В логическом блоке есть **таблицы подстановки** (Look Up Table, LUT), которые представляют собой не что иное как память, которую можно сконфигурировать под нужды хранения, а не реализацию логики. Таким образом, трехвходовой LUT может выступать в роли 8-битной памяти. Однако LUT будет сложно приспособить под многопортовую память: посмотрим на схему еще раз: три входа LUT формируют адрес одной из восьми ячеек. Это означает, что среди этих восьми ячеек нельзя обратиться к двум из них одновременно. Для реализации многопортовой памяти небольшого размера лучше воспользоваться расположенным в логическом блоке D-триггером (**DFF** на _рис. 2_). Несмотря на то, что D-триггер позволяет воспроизвести только 1 разряд элемента памяти, он не ограничивает реализацию по портам. -Таким образом, преимущество распределенной памяти относительно регистровой заключается в лучшей утилизации ресурсов: одним трёхвходовым LUT можно описать до 8 бит распределенной памяти, в то время как одним D-триггером можно описать только один бит регистровой памяти. Предположим, что в ПЛИС размещены логические блоки, структура которых изображена на _рис. 2_ и нам необходимо реализовать 1 KiB памяти. Мы можем реализовать распределенную память, используя 64 логических блока (в каждом блоке два трёхвходовых LUT), либо регистровую память, используя 1024 логических блока. +Таким образом, преимущество распределенной памяти относительно регистровой заключается в лучшей утилизации ресурсов: одним трёхвходовым LUT можно описать до 8 бит распределенной памяти, в то время как одним D-триггером можно описать только один бит регистровой памяти. Предположим, что в ПЛИС размещены логические блоки, структура которых изображена на _рис. 2_ и нам необходимо реализовать 1 KiB памяти. Мы можем реализовать распределенную память, используя 512 логических блоков (в каждом блоке два трёхвходовых LUT), либо регистровую память, используя 8192 логических блока. Недостатком является ограниченность в реализации многопортовой памяти. @@ -114,7 +114,7 @@ _Листинг 1. Пример создания массива ячеек._ В первой строке _листинга 1_ создаётся память с шестнадцатью (от 0-го до 15-го адреса) 20-битными ячейками памяти. В таком случае говорят, что ширина памяти 20 бит, а глубина 16. Для адресации такой памяти потребуется адрес с разрядностью ceil(log2(16)) = 4 бита (`ceil` — операция округления вверх). -Для обращения к конкретной ячейке памяти используются квадратные скобки с указанием нужного адреса: `memory[addr]`. Грубо говоря, то, что указывается в квадратных скобках будет подключено ко входу адреса памяти `memory`. +Для обращения к конкретной ячейке памяти используются квадратные скобки с указанием нужного адреса: `memory[addr]` (см. _листинг 2_). Грубо говоря, то, что указывается в квадратных скобках, будет подключено ко входу адреса памяти `memory`. Как уже говорилось, чтение из памяти может быть сделано двумя способами: синхронно и асинхронно.