mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
Добавление оператора [] как способ описания мультиплексора
This commit is contained in:
@@ -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). При работе с этим блоком необходимо помнить следующие особенности:
|
||||||
|
Reference in New Issue
Block a user