mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
Вынос информации о защелках в отдельный документ
This commit is contained in:
1
.github/SUMMARY.md
vendored
1
.github/SUMMARY.md
vendored
@@ -41,6 +41,7 @@
|
|||||||
- [Мультиплексоры](Basic%20Verilog%20structures/Multiplexors.md)
|
- [Мультиплексоры](Basic%20Verilog%20structures/Multiplexors.md)
|
||||||
- [Регистры](Basic%20Verilog%20structures/Registers.md)
|
- [Регистры](Basic%20Verilog%20structures/Registers.md)
|
||||||
- [Конкатенация](Basic%20Verilog%20structures/Concatenation.md)
|
- [Конкатенация](Basic%20Verilog%20structures/Concatenation.md)
|
||||||
|
- [Защелки](Basic%20Verilog%20structures/Latches.md)
|
||||||
- [О различиях между блокирующими и неблокирующими присваиваниями](Basic%20Verilog%20structures/Assignments.md)
|
- [О различиях между блокирующими и неблокирующими присваиваниями](Basic%20Verilog%20structures/Assignments.md)
|
||||||
- [Контроллеры](Basic%20Verilog%20structures/Controllers.md)
|
- [Контроллеры](Basic%20Verilog%20structures/Controllers.md)
|
||||||
- [Тестовое окружение](Basic%20Verilog%20structures/Testbench.md)
|
- [Тестовое окружение](Basic%20Verilog%20structures/Testbench.md)
|
||||||
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.3 KiB |
80
Basic Verilog structures/Latches.md
Normal file
80
Basic Verilog structures/Latches.md
Normal file
@@ -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
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
_Рисунок 1. Пример генерации защелки у неполного мультиплексора._
|
||||||
|
|
||||||
|
На _рис. 1_ различные её части обозначены следующим образом:
|
||||||
|
|
||||||
|
1. Мультиплексор, который мы хотели описать
|
||||||
|
2. Защелка
|
||||||
|
3. Мультиплексор, который был добавлен чтобы генерировать сигнал, "открывающий" защелку
|
||||||
|
4. Константная единица (питание)
|
||||||
|
5. Константный ноль (земля).
|
||||||
|
|
||||||
|
В случае, если `S == 0` или `S == 1`, на выход мультиплексора 3 будет подана единица, которая переведет защелку в "прозрачный" режим (данные с выхода мультиплексора 1 будут проходить сквозь защелку).
|
||||||
|
|
||||||
|
В случае, если `S > 1`, на выход мультиплексора 3 будет подан ноль, который переведет защелку в "непрозрачный" режим (данные с выхода мультиплексора 1 не будут идти сквозь защелку, вместо этого на выходе защелки останутся последние данные, которые шли через нее, пока она была "открыта").
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
_Рисунок 2. Пример удержания предыдущих значений защелкой._
|
||||||
|
|
||||||
|
Кроме того, защелка усложняет временной анализ и ухудшает временные характеристики, из-за чего схема может работать на меньших частотах, чем могла бы.
|
||||||
|
|
||||||
|
Таким образом, во избежание появления защелки, необходимо описывать все возможные комбинации в блоке `case` (при необходимости покрывая множество оставшихся комбинаций с помощью `default`) и для каждого блока `if` описывать блоки `else`. В случае, если подобная комбинация не планируется к использованию, можно присвоить сигналу значение ноль. Конечно, в этом случае будет создана избыточная логика для присваивания ненужного значения, которое никогда не должно произойти (и существуют способы описания аппаратуры, позволяющие этого избежать), но в данном случае это самый простой способ.
|
@@ -172,83 +172,6 @@ module case_mux_ex(
|
|||||||
endmodule
|
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
|
|
||||||
```
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
На данной схеме различные её части обозначены следующим образом:
|
|
||||||
|
|
||||||
1. Мультиплексор, который мы хотели описать
|
|
||||||
2. Защелка
|
|
||||||
3. Мультиплексор, который был добавлен чтобы генерировать сигнал, "открывающий" защелку
|
|
||||||
4. Константная единица (питание)
|
|
||||||
5. Константный ноль (земля).
|
|
||||||
|
|
||||||
В случае, если `S == 0` или `S == 1`, на выход мультиплексора 3 будет подана единица, которая переведет защелку в "прозрачный" режим (данные с выхода мультиплексора 1 будут проходить сквозь защелку).
|
|
||||||
|
|
||||||
В случае, если `S > 1`, на выход мультиплексора 3 будет подан ноль, который переведет защелку в "непрозрачный" режим (данные с выхода мультиплексора 1 не будут идти сквозь защелку, вместо этого на выходе защелки останутся последние данные, которые шли через нее, пока она была "открыта").
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Кроме того, защелка усложняет временной анализ и ухудшает временные характеристики, из-за чего схема может работать на меньших частотах, чем могла бы.
|
|
||||||
|
|
||||||
Таким образом, во избежание появления защелки, необходимо описывать все возможные комбинации в блоке `case` (при необходимости покрывая множество оставшихся комбинаций с помощью `default`) и для каждого блока `if` описывать блоки `else`. В случае, если подобная комбинация не планируется к использованию, можно присвоить сигналу значение ноль. Конечно, в этом случае будет создана избыточная логика для присваивания ненужного значения, которое никогда не должно произойти (и существуют способы описания аппаратуры, позволяющие этого избежать), но в данном случае это самый простой способ.
|
|
||||||
|
|
||||||
## Итоги
|
## Итоги
|
||||||
|
|
||||||
1. Мультиплексор — это **комбинационный** блок, подающий на выход один из нескольких входных сигналов.
|
1. Мультиплексор — это **комбинационный** блок, подающий на выход один из нескольких входных сигналов.
|
||||||
@@ -256,7 +179,7 @@ endmodule
|
|||||||
1. использование [тернарного условного оператора](#тернарный-условный-оператор) через непрерывное присваивание;
|
1. использование [тернарного условного оператора](#тернарный-условный-оператор) через непрерывное присваивание;
|
||||||
2. использование конструкции [`if-else`](#блок-if-else) внутри блока `always`;
|
2. использование конструкции [`if-else`](#блок-if-else) внутри блока `always`;
|
||||||
3. использование конструкции [`case`](#case-блок) внутри блока always.
|
3. использование конструкции [`case`](#case-блок) внутри блока always.
|
||||||
3. Во избежание появления [защелок](#защелка) при описании мультиплексора, необходимо убедиться что у блоков `if` есть соответствующие им блоки `else`, а у мультиплексоров описаны все комбинации управляющего сигнала (при необходимости, множество оставшихся комбинаций можно покрыть с помощью комбинации `default`). Появление непреднамеренной защелки в дизайне ведет к ухудшению временных характеристик, избыточному использованию ресурсов, а также непредсказуемому поведению схемы из-за возможного удержания сигнала.
|
3. Во избежание появления [защелок](Latches.md) при описании мультиплексора, необходимо убедиться что у блоков `if` есть соответствующие им блоки `else`, а у мультиплексоров описаны все комбинации управляющего сигнала (при необходимости, множество оставшихся комбинаций можно покрыть с помощью комбинации `default`). Появление непреднамеренной защелки в дизайне ведет к ухудшению временных характеристик, избыточному использованию ресурсов, а также непредсказуемому поведению схемы из-за возможного удержания сигнала.
|
||||||
4. Важно отметить, что блоки `if-else` и `case` могут использоваться не только для описания мультиплексоров.
|
4. Важно отметить, что блоки `if-else` и `case` могут использоваться не только для описания мультиплексоров.
|
||||||
5. Конструкции `if-else` и `case` в рамках данных лабораторных работ можно описывать только внутри блока [`always`](#блок-always). При работе с этим блоком необходимо помнить следующие особенности:
|
5. Конструкции `if-else` и `case` в рамках данных лабораторных работ можно описывать только внутри блока [`always`](#блок-always). При работе с этим блоком необходимо помнить следующие особенности:
|
||||||
1. Существует несколько типов блока `always`: `always_comb`, `always_ff`, `always_latch`, определяющих то, к чему будет подключена описанная в этом блоке логика: проводу, регистру или защелке соответственно.
|
1. Существует несколько типов блока `always`: `always_comb`, `always_ff`, `always_latch`, определяющих то, к чему будет подключена описанная в этом блоке логика: проводу, регистру или защелке соответственно.
|
||||||
|
Reference in New Issue
Block a user