Добавление оператора [] как способ описания мультиплексора

This commit is contained in:
Andrei Solodovnikov
2024-02-03 13:27:51 +03:00
parent 5cd0606dd7
commit b05b649579

View File

@@ -183,13 +183,34 @@ module case_mux_ex(
endmodule endmodule
``` ```
## Оператор адресации
Представим, что нам необходимо мультиплексировать реально много сигналов. Например, отдельные биты 1024-разрядной шины. Описывать `case` на 1024 варианта будет сущим безумием. В этом случае, можно будет воспользоваться оператором '[]', который наверняка известен вам как "оператор адресации по массиву" в Си-подобных языках. Работает он интуитивно понятно:
- перед оператором указывается имя массива или вектора (читай как "памяти или шины"), по которым будет идти индексация;
- за именем в квадратных скобках указывается индекс (не важно, в виде константы, или выражения, использующего другие сигналы).
В контексте примера по мультиплексированию 1024 бит использование оператора может быть выполнено следующим образом:
```SystemVerilog
logic [1023:0] bus1024;
logic [ 9:0] select;
logic one_bit_result;
assign one_bit_result = bus1024[select];
```
Реализация мультиплексоров через оператор '[]' будет активно применяться вами при реализации различных памятей.
## Итоги ## Итоги
1. Мультиплексор — это **комбинационный** блок, подающий на выход один из нескольких входных сигналов. 1. Мультиплексор — это **комбинационный** блок, подающий на выход один из нескольких входных сигналов.
2. Мультиплексор можно описать множеством способов, среди них: 2. Мультиплексор можно описать множеством способов, среди них:
1. использование [тернарного условного оператора](#тернарный-условный-оператор) через непрерывное присваивание; 1. использование [тернарного условного оператора](#тернарный-условный-оператор);
2. использование конструкции [`if-else`](#блок-if-else) внутри блока `always`; 2. использование конструкции [`if-else`](#блок-if-else) внутри блока [`always`](#блок-always);
3. использование конструкции [`case`](#case-блок) внутри блока always. 3. использование конструкции [`case`](#case-блок) внутри блока [`always`](#блок-always);
4. использование [оператора '[]'](#оператор-адресации).
3. Во избежание появления [защелок](Latches.md) при описании мультиплексора, необходимо убедиться что у блоков `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). При работе с этим блоком необходимо помнить следующие особенности: