Update Multiplexors.md

This commit is contained in:
Andrei Solodovnikov
2024-02-27 12:57:25 +03:00
committed by GitHub
parent a6c9e1cbb0
commit d2780f3f00

View File

@@ -93,7 +93,7 @@ logic Y;
always_comb begin // 1) Используется always_comb, т.к. мы хотим подключить
// выход мультиплексора к проводу
if(S) begin // 2) if-else может находиться только внутри блока always.
Y = D1; // 3) Используется оператор неблокирующего присваивания.
Y = D1; // 3) Используется оператор неблокирующего присваивания.
end else begin
Y = D0;
end
@@ -108,13 +108,13 @@ end
logic Y;
always_comb begin
if(S==1) begin
Y <= D1;
Y = D1;
end
end
always_comb begin
if(S==0) begin // Нельзя выполнять операцию присваивания
Y <= D0; // для одного сигнала (Y) в нескольких
Y = D0; // для одного сигнала (Y) в нескольких
end // блоках always!
end
```
@@ -140,8 +140,8 @@ logic Y;
always_comb begin
case(S) // Описываем блок case, где значение сигнала S
// будет сравниваться с различными возможными его значениями
1'b0: Y <= D0; // Если S==0, то Y = D0
1'b1: Y <= D1;
1'b0: Y = D0; // Если S==0, то Y = D0
1'b1: Y = D1;
endcase // Каждый case должен заканчиваться endcase
end // (так же как каждый begin должен оканчиваться end)
```
@@ -165,10 +165,10 @@ module case_mux_ex(
);
always_comb begin
case(S)
3'b00: Y <= A;
3'b01: Y <= C | B; // в блоке case можно мультиплексировать
// не только провода, но и логические выражения
3'b10: Y <= (C|B) & D;
3'b00: Y = A;
3'b01: Y = C | B; // в блоке case можно мультиплексировать
// не только провода, но и логические выражения
3'b10: Y = (C|B) & D;
/*
Обратите внимание, что разрядность сигнала S — 3 бита.
Это означает, что есть 8 комбинаций его разрядов.
@@ -177,7 +177,7 @@ module case_mux_ex(
быть какое-то одно значение "по умолчанию", используется специальная
комбинация "default":
*/
default: Y <= D;
default: Y = D;
endcase
end
endmodule
@@ -214,9 +214,10 @@ assign one_bit_result = bus1024[select];
3. Во избежание появления [защелок](Latches.md) при описании мультиплексора, необходимо убедиться что у блоков `if` есть соответствующие им блоки `else`, а у мультиплексоров описаны все комбинации управляющего сигнала (при необходимости, множество оставшихся комбинаций можно покрыть с помощью комбинации `default`). Появление непреднамеренной защелки в дизайне ведет к ухудшению временных характеристик, избыточному использованию ресурсов, а также непредсказуемому поведению схемы из-за возможного удержания сигнала.
4. Важно отметить, что блоки `if-else` и `case` могут использоваться не только для описания мультиплексоров.
5. Конструкции `if-else` и `case` в рамках данных лабораторных работ можно описывать только внутри блока [`always`](#блок-always). При работе с этим блоком необходимо помнить следующие особенности:
1. Существует несколько типов блока `always`: `always_comb`, `always_ff`, `always_latch`, определяющих то, к чему будет подключена описанная в этом блоке логика: проводу, регистру или защелке соответственно.
2. Внутри блока always следует использовать оператор неблокирующего присваивания `<=`.
3. Присваивание для любого сигнала возможно только внутри **одного** блока always. Два разных сигнала могут присваиваться как в одном блоке always, так каждый в отдельном, но операция присваивания одному и тому же сигналу в двух разных блоках always — нет.
1. Существует несколько типов блока `always`: `always_comb`, `always_ff`, `always_latch`, определяющих то, к чему будет подключена описанная в этом блоке логика: проводу, регистру или защелке соответственно. В данных лабораторных работах вам нужно будет пользоваться блоками `always_ff` и `always_comb`, причем:
1. внутри блока `always_ff` необходимо использовать оператор неблокирующего присваивания (`<=`);
2. внутри блока `always_comb` необходимо использовать оператор блокирующего присваивания (`=`).
2. Присваивание для любого сигнала возможно только внутри **одного** блока always. Два разных сигнала могут присваиваться как в одном блоке always, так каждый в отдельном, но операция присваивания одному и тому же сигналу в двух разных блоках always — нет.
---