diff --git a/Basic Verilog structures/Multiplexors.md b/Basic Verilog structures/Multiplexors.md index 731877e..29ce9f5 100644 --- a/Basic Verilog structures/Multiplexors.md +++ b/Basic Verilog structures/Multiplexors.md @@ -183,13 +183,34 @@ module case_mux_ex( 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. Мультиплексор — это **комбинационный** блок, подающий на выход один из нескольких входных сигналов. 2. Мультиплексор можно описать множеством способов, среди них: - 1. использование [тернарного условного оператора](#тернарный-условный-оператор) через непрерывное присваивание; - 2. использование конструкции [`if-else`](#блок-if-else) внутри блока `always`; - 3. использование конструкции [`case`](#case-блок) внутри блока always. + 1. использование [тернарного условного оператора](#тернарный-условный-оператор); + 2. использование конструкции [`if-else`](#блок-if-else) внутри блока [`always`](#блок-always); + 3. использование конструкции [`case`](#case-блок) внутри блока [`always`](#блок-always); + 4. использование [оператора '[]'](#оператор-адресации). 3. Во избежание появления [защелок](Latches.md) при описании мультиплексора, необходимо убедиться что у блоков `if` есть соответствующие им блоки `else`, а у мультиплексоров описаны все комбинации управляющего сигнала (при необходимости, множество оставшихся комбинаций можно покрыть с помощью комбинации `default`). Появление непреднамеренной защелки в дизайне ведет к ухудшению временных характеристик, избыточному использованию ресурсов, а также непредсказуемому поведению схемы из-за возможного удержания сигнала. 4. Важно отметить, что блоки `if-else` и `case` могут использоваться не только для описания мультиплексоров. 5. Конструкции `if-else` и `case` в рамках данных лабораторных работ можно описывать только внутри блока [`always`](#блок-always). При работе с этим блоком необходимо помнить следующие особенности: