mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
Перенос раздела по блоку always
This commit is contained in:
@@ -53,15 +53,13 @@ assign Y = S==1 ? D1 : D0;
|
|||||||
|
|
||||||
Также мультиплексор можно описать через конструкцию `if-else` в блоке `always`.
|
Также мультиплексор можно описать через конструкцию `if-else` в блоке `always`.
|
||||||
|
|
||||||
## Блок if-else
|
|
||||||
|
|
||||||
> Далее будет ключевой параграф сложного для понимания текста, очень важно запомнить, что там написано и разобрать приведенные листинги.
|
> Далее будет ключевой параграф сложного для понимания текста, очень важно запомнить, что там написано и разобрать приведенные листинги.
|
||||||
|
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Блок always
|
## Блок always
|
||||||
|
|
||||||
Блок `always` — это специальный блок, который позволяет описывать комбинационные и последовательностные схемы, используя более сложные конструкции, такие как `if-else`, `case`. На самом деле, в языке SystemVerilog помимо общего блока `always`, которым можно описать любой вид логики, существует множество специализированных блоков, предназначенных для описания отдельно комбинационной, синхронной и последовательностной асинхронной логики соответственно:
|
Блок `always` — это специальный блок, который позволяет описывать комбинационные и последовательностные схемы, используя более сложные конструкции, такие как `if-else`, `case`. На самом деле, в языке SystemVerilog помимо общего блока `always`, которым можно описать любой вид логики, существует множество специализированных блоков, предназначенных для описания отдельно комбинационной, синхронной и последовательностной асинхронной логики соответственно:
|
||||||
|
|
||||||
@@ -76,14 +74,28 @@ assign Y = S==1 ? D1 : D0;
|
|||||||
- внутри блока `always_ff` необходимо использовать оператор неблокирующего присваивания (`<=`);
|
- внутри блока `always_ff` необходимо использовать оператор неблокирующего присваивания (`<=`);
|
||||||
- внутри блока `always_comb` необходимо использовать оператор блокирующего присваивания (`=`).
|
- внутри блока `always_comb` необходимо использовать оператор блокирующего присваивания (`=`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> Остановитесь на выделенном выше фрагменте документа, пока полностью не разберете его. Без освоения всех описанных выше особенностей языка SystemVerilog вы столкнетесь в будущем с множеством ошибок.
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
## Блок if-else
|
||||||
|
|
||||||
|
Реализация мультиплексора через блок `if-else` похожа на реализацию мультиплексора через тернарный оператор. Если в тернарном операторе управляющий сигнал указывался в качестве первого операнда, отделяемого оператором `?`, то в данном блоке управляющий сигнал указывается в скобках после ключевого слова `if`.
|
||||||
|
|
||||||
|
Далее описывается присваивание сигнала, который должен идти на выход при управляющем сигнале равном единице (значение до оператора `:` в тернарном операторе).
|
||||||
|
|
||||||
|
После, в блоке `else` описывается присваивание сигнала, который должен идти на выход при управляющем сигнале равном нулю (значение после оператора `:` в тернарном операторе).
|
||||||
|
|
||||||
```SystemVerilog
|
```SystemVerilog
|
||||||
logic Y;
|
logic Y;
|
||||||
always_comb begin // 1) Используется always_comb, т.к. мы хотим подключить
|
always_comb begin // 1) Используется always_comb, т.к. мы хотим подключить
|
||||||
// выход мультиплексора к проводу
|
// выход мультиплексора к проводу
|
||||||
if(S) begin // 2) if-else может находиться только внутри блока always.
|
if(S) begin // 2) if-else может находиться только внутри блока always.
|
||||||
Y <= D1; // 3) Используется оператор неблокирующего присваивания.
|
Y = D1; // 3) Используется оператор неблокирующего присваивания.
|
||||||
end else begin
|
end else begin
|
||||||
Y <= D0;
|
Y = D0;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
@@ -109,13 +121,9 @@ end
|
|||||||
|
|
||||||
Если нарушить это правило, то в будущем (возможно не сразу, но в любом случае — обязательно), возникнет ошибка, которая так или иначе будет связана с **multiple drivers**.
|
Если нарушить это правило, то в будущем (возможно не сразу, но в любом случае — обязательно), возникнет ошибка, которая так или иначе будет связана с **multiple drivers**.
|
||||||
|
|
||||||
---
|
Будьте **очень внимательны** при использовании данного блока. Он обманчиво похож на условный блок в языках программирования, из-за чего возникает желание пользоваться им так же, как можно пользоваться условными блоками в языках программирования. Это не так. Обратите внимание на то, что данный блок выше упоминается исключительно как блок `if-else`. При реализации мультиплексора, у любого блока `if` должен быть соответствующий блок `else`, как у тернарного оператора должно быть два выходных операнда. Если не указать блок `else` при описании мультиплексора, у него будет только один вход, и в итоге на выходе мультиплексора будет сгенерирована **защелка**. Подробнее о защелках описано [здесь](Latches.md).
|
||||||
|
|
||||||
> Остановитесь на выделенном выше фрагменте документа, пока полностью не разберете его. Без освоения всех описанных выше особенностей языка SystemVerilog вы столкнетесь в будущем с множеством ошибок.
|
Существуют ситуации, когда блок `if` может быть использован без блока `else` (например, при описании дешифраторов или сигналов разрешения записи). Однако при описании мультиплексоров таких ситуаций не бывает.
|
||||||
|
|
||||||
<br><br>
|
|
||||||
|
|
||||||
Будьте **очень внимательны** при использовании данного блока. Он обманчиво похож на условный блок в языках программирования, из-за чего возникает желание пользоваться им так же, как можно пользоваться условными блоками в языках программирования. Это не так. Обратите внимание на то, что данный блок выше упоминается исключительно как блок `if-else`. При реализации мультиплексора, у любого блока `if` должен быть соответствующий блок `else` (иначе у мультиплексора будет только один вход, и в итоге на его выходе будет сгенерирована **защелка**, о которой будет рассказано позднее). Существуют ситуации, когда блок `if` может быть использован без блока `else` (например, при описании дешифраторов или сигналов разрешения записи). Однако при описании мультиплексоров таких ситуаций не бывает.
|
|
||||||
|
|
||||||
## case-блок
|
## case-блок
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user