mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 09:10:10 +00:00
Merge pull request #57 from MPSU/latch_descr
This commit is contained in:
@@ -63,7 +63,7 @@ assign Y = S==1 ? D1 : D0;
|
||||
|
||||
### Блок always
|
||||
|
||||
Блок `always` — это специальный блок, который позволяет описывать комбинационные и последовательностные схемы, используя более сложные конструкции, такие как `if-else`, `case`. На самом деле, в языке SystemVeriog помимо общего блока `always`, которым можно описать любой вид логики, существует множество специализированных блоков, предназначенных для описания отдельно комбинационной, синхронной и последовательностной асинхронной логики соответственно:
|
||||
Блок `always` — это специальный блок, который позволяет описывать комбинационные и последовательностные схемы, используя более сложные конструкции, такие как `if-else`, `case`. На самом деле, в языке SystemVerilog помимо общего блока `always`, которым можно описать любой вид логики, существует множество специализированных блоков, предназначенных для описания отдельно комбинационной, синхронной и последовательностной асинхронной логики соответственно:
|
||||
|
||||
- always_comb
|
||||
- always_ff
|
||||
@@ -180,9 +180,32 @@ endmodule
|
||||
|
||||
Защелка — это всего лишь элемент цифровой схемы и будет неправильно говорить о нем в терминах "плохой" или "хороший". Защелка имеет свои плюсы для [ASIC](https://ru.wikipedia.org/wiki/Интегральная_схема_специального_назначения)-проектирования. Однако защелка совершенно не подходит при проектировании устройств под ПЛИС.
|
||||
|
||||
Обычно появление защелки в цифровой схеме говорит об ошибке разработки: в случае, если планировалась комбинационная логика, добавление защелки приведет к непредвиденному удержанию предыдущих значений (поскольку защелка сохраняет предыдущее значение до прихода очередной комбинации управляющего сигнала, описанной в блоке `case`). В случае синхронной логики, будет непредсказуемое поведение данных, т.к. информация в защелку будет записываться не синхронно, как это ожидается, а на протяжении длительного промежутка времени, пока защелка "открыта".
|
||||
Обычно появление защелки в цифровой схеме говорит об ошибке разработки: в случае, если планировалась комбинационная логика, добавление защелки приведет к непредвиденному удержанию предыдущих значений (поскольку защелка сохраняет предыдущее значение до прихода очередной комбинации управляющего сигнала, описанной в блоке `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(
|
||||
|
Reference in New Issue
Block a user