From b05b6495798707d02412a1e49be1540125726409 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Sat, 3 Feb 2024 13:27:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=20[]=20=D0=BA=D0=B0=D0=BA=20=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D0=BE=D0=B1=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BC=D1=83=D0=BB=D1=8C=D1=82=D0=B8=D0=BF=D0=BB=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Basic Verilog structures/Multiplexors.md | 27 +++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) 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). При работе с этим блоком необходимо помнить следующие особенности: