From d215a215b8b1bc648f10752b1689cde84e3e3988 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Sat, 3 Feb 2024 12:15:17 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=8B=D0=BD=D0=BE=D1=81=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE=20?= =?UTF-8?q?=D0=B7=D0=B0=D1=89=D0=B5=D0=BB=D0=BA=D0=B0=D1=85=20=D0=B2=20?= =?UTF-8?q?=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/SUMMARY.md | 1 + .../fig_06.png => latches/fig_01.png} | Bin .../fig_07.png => latches/fig_02.png} | Bin Basic Verilog structures/Latches.md | 80 ++++++++++++++++++ Basic Verilog structures/Multiplexors.md | 79 +---------------- 5 files changed, 82 insertions(+), 78 deletions(-) rename .pic/Basic Verilog structures/{multiplexors/fig_06.png => latches/fig_01.png} (100%) rename .pic/Basic Verilog structures/{multiplexors/fig_07.png => latches/fig_02.png} (100%) create mode 100644 Basic Verilog structures/Latches.md diff --git a/.github/SUMMARY.md b/.github/SUMMARY.md index cd24fb0..0dd04dd 100644 --- a/.github/SUMMARY.md +++ b/.github/SUMMARY.md @@ -41,6 +41,7 @@ - [Мультиплексоры](Basic%20Verilog%20structures/Multiplexors.md) - [Регистры](Basic%20Verilog%20structures/Registers.md) - [Конкатенация](Basic%20Verilog%20structures/Concatenation.md) +- [Защелки](Basic%20Verilog%20structures/Latches.md) - [О различиях между блокирующими и неблокирующими присваиваниями](Basic%20Verilog%20structures/Assignments.md) - [Контроллеры](Basic%20Verilog%20structures/Controllers.md) - [Тестовое окружение](Basic%20Verilog%20structures/Testbench.md) diff --git a/.pic/Basic Verilog structures/multiplexors/fig_06.png b/.pic/Basic Verilog structures/latches/fig_01.png similarity index 100% rename from .pic/Basic Verilog structures/multiplexors/fig_06.png rename to .pic/Basic Verilog structures/latches/fig_01.png diff --git a/.pic/Basic Verilog structures/multiplexors/fig_07.png b/.pic/Basic Verilog structures/latches/fig_02.png similarity index 100% rename from .pic/Basic Verilog structures/multiplexors/fig_07.png rename to .pic/Basic Verilog structures/latches/fig_02.png diff --git a/Basic Verilog structures/Latches.md b/Basic Verilog structures/Latches.md new file mode 100644 index 0000000..8c7ec1c --- /dev/null +++ b/Basic Verilog structures/Latches.md @@ -0,0 +1,80 @@ +# Защелка + +Очень важно при описании мультиплексора с помощью блока `case` описывать оставшиеся комбинации управляющего сигнала с помощью `default` (а при использовании блока `if` — описывать блок `else`) — в противном случае в вашей схеме может появиться [защелка](https://www.build-electronic-circuits.com/d-latch/) (даже несмотря на то, что для описания защелок в SytemVerilog есть отдельный блок `always`: `always_latch`). + +Защелка представляет из себя элемент памяти, причем данные в нее записываются не по тактовому синхроимпульсу, а на протяжении относительно длинного промежутка времени, когда управляющий сигнал "открывает" защелку (в этом случае говорят, что защелка становится "прозрачной"). Из-за этого она не является ни комбинационной, ни синхронной схемой. + +Защелка — это всего лишь элемент цифровой схемы и будет неправильно говорить о нем в терминах "плохой" или "хороший". Защелка имеет свои плюсы для [ASIC](https://ru.wikipedia.org/wiki/Интегральная_схема_специального_назначения)-проектирования. Однако защелка совершенно не подходит при проектировании устройств под ПЛИС. + +Обычно появление защелки в цифровой схеме говорит об ошибке разработки: в случае, если планировалась комбинационная логика, добавление защелки приведет к непредвиденному удержанию предыдущих значений (поскольку защелка сохраняет предыдущее значение до прихода очередной комбинации управляющего сигнала, описанной в блоке `case`). Это особенно плохо, если сигнал, перед которым появилась защелка, чем-то управляет. Представьте, что он управляет сейфом, который должен открываться если ввели правильный пароль: + +```SystemVerilog +always_comb begin + if(password_is_correct) begin + open_the_safe <= 1'b1; + end +end +``` + +Вроде бы вы все описали правильно: "если ввели правильный пароль — сейф откроется". Однако проблема в том, что это состояние сохранится, и сейф уже не закроется. Именно поэтому у каждого блока `if` должен быть свой блок `else`: + +```SystemVerilog +always_comb begin + if(password_is_correct) begin + open_the_safe <= 1'b1; + end + else begin + open_the_safe <= 1'b0; + end +end +``` + +В случае синхронной логики, будет непредсказуемое поведение данных, т.к. информация в защелку будет записываться не синхронно, как это ожидается, а на протяжении длительного промежутка времени, пока защелка "открыта". + +Ещё один пример: + +```SystemVerilog +module unexpected_d_latch_ex( + input logic [1:0] S, + input logic D0, + input logic D1, + output logic R +); + +always_comb begin + case(S) + 2'b00: R <= D0; + 2'b01: R <= D1; + // Поскольку сигнал S двухразрядный, осталось еще две комбинации: + // S == 2'b10 + // S == 2'b11 + endcase +end + + +endmodule +``` + +![../.pic/Basic%20Verilog%20structures/latches/fig_01.png](../.pic/Basic%20Verilog%20structures/latches/fig_01.png) + +_Рисунок 1. Пример генерации защелки у неполного мультиплексора._ + +На _рис. 1_ различные её части обозначены следующим образом: + +1. Мультиплексор, который мы хотели описать +2. Защелка +3. Мультиплексор, который был добавлен чтобы генерировать сигнал, "открывающий" защелку +4. Константная единица (питание) +5. Константный ноль (земля). + +В случае, если `S == 0` или `S == 1`, на выход мультиплексора 3 будет подана единица, которая переведет защелку в "прозрачный" режим (данные с выхода мультиплексора 1 будут проходить сквозь защелку). + +В случае, если `S > 1`, на выход мультиплексора 3 будет подан ноль, который переведет защелку в "непрозрачный" режим (данные с выхода мультиплексора 1 не будут идти сквозь защелку, вместо этого на выходе защелки останутся последние данные, которые шли через нее, пока она была "открыта"). + +![../.pic/Basic%20Verilog%20structures/latches/fig_02.png](../.pic/Basic%20Verilog%20structures/latches/fig_02.png) + +_Рисунок 2. Пример удержания предыдущих значений защелкой._ + +Кроме того, защелка усложняет временной анализ и ухудшает временные характеристики, из-за чего схема может работать на меньших частотах, чем могла бы. + +Таким образом, во избежание появления защелки, необходимо описывать все возможные комбинации в блоке `case` (при необходимости покрывая множество оставшихся комбинаций с помощью `default`) и для каждого блока `if` описывать блоки `else`. В случае, если подобная комбинация не планируется к использованию, можно присвоить сигналу значение ноль. Конечно, в этом случае будет создана избыточная логика для присваивания ненужного значения, которое никогда не должно произойти (и существуют способы описания аппаратуры, позволяющие этого избежать), но в данном случае это самый простой способ. diff --git a/Basic Verilog structures/Multiplexors.md b/Basic Verilog structures/Multiplexors.md index 3719c16..5efb5fa 100644 --- a/Basic Verilog structures/Multiplexors.md +++ b/Basic Verilog structures/Multiplexors.md @@ -172,83 +172,6 @@ module case_mux_ex( endmodule ``` -### Защелка - -Очень важно при описании мультиплексора с помощью блока `case` описывать оставшиеся комбинации управляющего сигнала с помощью `default` (а при использовании блока `if` — описывать блок `else`) — в противном случае в вашей схеме может появиться [защелка](https://www.build-electronic-circuits.com/d-latch/) (даже несмотря на то, что для описания защелок в SytemVerilog есть отдельный блок `always`: `always_latch`). - -Защелка представляет из себя элемент памяти, причем данные в нее записываются не по тактовому синхроимпульсу, а на протяжении относительно длинного промежутка времени, когда управляющий сигнал "открывает" защелку (в этом случае говорят, что защелка становится "прозрачной"). Из-за этого она не является ни комбинационной, ни синхронной схемой. - -Защелка — это всего лишь элемент цифровой схемы и будет неправильно говорить о нем в терминах "плохой" или "хороший". Защелка имеет свои плюсы для [ASIC](https://ru.wikipedia.org/wiki/Интегральная_схема_специального_назначения)-проектирования. Однако защелка совершенно не подходит при проектировании устройств под ПЛИС. - -Обычно появление защелки в цифровой схеме говорит об ошибке разработки: в случае, если планировалась комбинационная логика, добавление защелки приведет к непредвиденному удержанию предыдущих значений (поскольку защелка сохраняет предыдущее значение до прихода очередной комбинации управляющего сигнала, описанной в блоке `case`). Это особенно плохо, если сигнал, перед которым появилась защелка, чем-то управляет. Представьте, что он управляет сейфом, который должен открываться если ввели правильный пароль: - -```SystemVerilog -always_comb begin - if(password_is_correct) begin - open_the_safe <= 1'b1; - end -end -``` - -Вроде бы вы все описали правильно: "если ввели правильный пароль — сейф откроется". Однако проблема в том, что это состояние сохранится, и сейф уже не закроется. Именно поэтому у каждого блока `if` должен быть свой блок `else`: - -```SystemVerilog -always_comb begin - if(password_is_correct) begin - open_the_safe <= 1'b1; - end - else begin - open_the_safe <= 1'b0; - end -end -``` - -В случае синхронной логики, будет непредсказуемое поведение данных, т.к. информация в защелку будет записываться не синхронно, как это ожидается, а на протяжении длительного промежутка времени, пока защелка "открыта". - -Ещё один пример: - -```SystemVerilog -module unexpected_d_latch_ex( - input logic [1:0] S, - input logic D0, - input logic D1, - output logic R -); - -always_comb begin - case(S) - 2'b00: R <= D0; - 2'b01: R <= D1; - // Поскольку сигнал S двухразрядный, осталось еще две комбинации: - // S == 2'b10 - // S == 2'b11 - endcase -end - - -endmodule -``` - -![../.pic/Basic%20Verilog%20structures/multiplexors/fig_06.png](../.pic/Basic%20Verilog%20structures/multiplexors/fig_06.png) - -На данной схеме различные её части обозначены следующим образом: - -1. Мультиплексор, который мы хотели описать -2. Защелка -3. Мультиплексор, который был добавлен чтобы генерировать сигнал, "открывающий" защелку -4. Константная единица (питание) -5. Константный ноль (земля). - -В случае, если `S == 0` или `S == 1`, на выход мультиплексора 3 будет подана единица, которая переведет защелку в "прозрачный" режим (данные с выхода мультиплексора 1 будут проходить сквозь защелку). - -В случае, если `S > 1`, на выход мультиплексора 3 будет подан ноль, который переведет защелку в "непрозрачный" режим (данные с выхода мультиплексора 1 не будут идти сквозь защелку, вместо этого на выходе защелки останутся последние данные, которые шли через нее, пока она была "открыта"). - -![../.pic/Basic%20Verilog%20structures/multiplexors/fig_07.png](../.pic/Basic%20Verilog%20structures/multiplexors/fig_07.png) - -Кроме того, защелка усложняет временной анализ и ухудшает временные характеристики, из-за чего схема может работать на меньших частотах, чем могла бы. - -Таким образом, во избежание появления защелки, необходимо описывать все возможные комбинации в блоке `case` (при необходимости покрывая множество оставшихся комбинаций с помощью `default`) и для каждого блока `if` описывать блоки `else`. В случае, если подобная комбинация не планируется к использованию, можно присвоить сигналу значение ноль. Конечно, в этом случае будет создана избыточная логика для присваивания ненужного значения, которое никогда не должно произойти (и существуют способы описания аппаратуры, позволяющие этого избежать), но в данном случае это самый простой способ. - ## Итоги 1. Мультиплексор — это **комбинационный** блок, подающий на выход один из нескольких входных сигналов. @@ -256,7 +179,7 @@ endmodule 1. использование [тернарного условного оператора](#тернарный-условный-оператор) через непрерывное присваивание; 2. использование конструкции [`if-else`](#блок-if-else) внутри блока `always`; 3. использование конструкции [`case`](#case-блок) внутри блока always. -3. Во избежание появления [защелок](#защелка) при описании мультиплексора, необходимо убедиться что у блоков `if` есть соответствующие им блоки `else`, а у мультиплексоров описаны все комбинации управляющего сигнала (при необходимости, множество оставшихся комбинаций можно покрыть с помощью комбинации `default`). Появление непреднамеренной защелки в дизайне ведет к ухудшению временных характеристик, избыточному использованию ресурсов, а также непредсказуемому поведению схемы из-за возможного удержания сигнала. +3. Во избежание появления [защелок](Latches.md) при описании мультиплексора, необходимо убедиться что у блоков `if` есть соответствующие им блоки `else`, а у мультиплексоров описаны все комбинации управляющего сигнала (при необходимости, множество оставшихся комбинаций можно покрыть с помощью комбинации `default`). Появление непреднамеренной защелки в дизайне ведет к ухудшению временных характеристик, избыточному использованию ресурсов, а также непредсказуемому поведению схемы из-за возможного удержания сигнала. 4. Важно отметить, что блоки `if-else` и `case` могут использоваться не только для описания мультиплексоров. 5. Конструкции `if-else` и `case` в рамках данных лабораторных работ можно описывать только внутри блока [`always`](#блок-always). При работе с этим блоком необходимо помнить следующие особенности: 1. Существует несколько типов блока `always`: `always_comb`, `always_ff`, `always_latch`, определяющих то, к чему будет подключена описанная в этом блоке логика: проводу, регистру или защелке соответственно.