mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 09:10:10 +00:00
WIP: APS cumulative update (#98)
* WIP: APS cumulative update * Update How FPGA works.md * Перенос раздела "Последовательностная логика" в отдельный док * Исправление картинки * Исправление оформления индексов * Переработка раздела Vivado Basics * Добавление картинки в руководство по созданию проекта * Исправление ссылок в анализе rtl * Обновление изображения в sequential logic * Исправление ссылок в bug hunting * Исправление ссылок * Рефактор руководства по прошивке ПЛИС * Mass update * Update fig_10 * Restore fig_02
This commit is contained in:
committed by
GitHub
parent
78bb01ef95
commit
a28002e681
@@ -1,4 +1,4 @@
|
||||
# Описание мультиплексора на языке SystemVerilog
|
||||
# Описание мультиплексоров в SystemVerilog
|
||||
|
||||
**Мультипле́ксор** — устройство, имеющее **несколько сигнальных входов**, **один или более управляющих входов** и **один выход**. Мультиплексор позволяет передавать сигнал **с одного из входов на выход**; при этом выбор желаемого входа осуществляется подачей соответствующей комбинации управляющих сигналов[[1]](https://ru.wikipedia.org/wiki/Мультиплексор_(электроника)).
|
||||
|
||||
@@ -42,7 +42,7 @@ a = b+c >= 5 ? b+c : b+d;
|
||||
Сперва вычисляется первый операнд (выражение `b+c >= 5`). Если это выражение оказалось истинным (равно единице), то переменной `a` будет присвоено значение второго операнда (выражения `b+c`), в противном случае переменной `a` будет присвоено значение третьего операнда (выражения `b+d`).
|
||||
</details>
|
||||
|
||||
```SystemVerilog
|
||||
```Verilog
|
||||
logic Y;
|
||||
assign Y = S==1 ? D1 : D0;
|
||||
```
|
||||
@@ -61,7 +61,7 @@ assign Y = S==1 ? D1 : D0;
|
||||
|
||||
## Блок always
|
||||
|
||||
Блок `always` — это специальный блок, который позволяет описывать комбинационные и последовательностные схемы, используя более сложные конструкции, такие как `if-else`, `case`. На самом деле, в языке SystemVerilog помимо общего блока `always`, которым можно описать любой вид логики, существует множество специализированных блоков, предназначенных для описания отдельно комбинационной, синхронной и последовательностной асинхронной логики соответственно:
|
||||
Блок `always` — это специальный блок, который позволяет описывать комбинационные и последовательностные схемы (см. документ "[Последовательностная логика](../Introduction/Sequential%20logic.md)"), используя более сложные конструкции, такие как `if-else`, `case`. На самом деле, в языке SystemVerilog помимо общего блока `always`, которым можно описать любой вид логики, существует множество специализированных блоков, предназначенных для описания отдельно комбинационной, синхронной и последовательностной асинхронной логики соответственно:
|
||||
|
||||
- always_comb
|
||||
- always_ff
|
||||
@@ -73,7 +73,7 @@ assign Y = S==1 ? D1 : D0;
|
||||
|
||||
- внутри блока `always_ff` и `always_latch` необходимо использовать оператор неблокирующего присваивания (`<=`);
|
||||
- внутри блока `always_comb` необходимо использовать оператор блокирующего присваивания (`=`).
|
||||
-
|
||||
|
||||
---
|
||||
|
||||
> Остановитесь на выделенном выше фрагменте документа, пока полностью не разберете его. Без освоения всех описанных выше особенностей языка SystemVerilog вы столкнетесь в будущем с множеством ошибок.
|
||||
@@ -88,7 +88,7 @@ assign Y = S==1 ? D1 : D0;
|
||||
|
||||
После, в блоке `else` описывается присваивание сигнала, который должен идти на выход при управляющем сигнале равном нулю (значение после оператора `:` в тернарном операторе).
|
||||
|
||||
```SystemVerilog
|
||||
```Verilog
|
||||
logic Y;
|
||||
always_comb begin // 1) Используется always_comb, т.к. мы хотим подключить
|
||||
// выход мультиплексора к проводу
|
||||
@@ -104,7 +104,7 @@ end
|
||||
|
||||
Неправильно:
|
||||
|
||||
```SystemVerilog
|
||||
```Verilog
|
||||
logic Y;
|
||||
always_comb begin
|
||||
if(S==1) begin
|
||||
@@ -135,7 +135,7 @@ end
|
||||
|
||||
Реализация двухвходового мультиплексора с помощью `case` может выглядеть так:
|
||||
|
||||
```SystemVerilog
|
||||
```Verilog
|
||||
logic Y;
|
||||
always_comb begin
|
||||
case(S) // Описываем блок case, где значение сигнала S
|
||||
@@ -150,9 +150,9 @@ end // (так же как каждый begin должен ок
|
||||
|
||||

|
||||
|
||||
Здесь уже используется мультиплексор 4в1. Управляющий сигнал `S` в данном случае двухбитный. В блоке `case` мы перечисляем всевозможные варианты значений `S` и описываем выход мультиплексора.
|
||||
Здесь уже используется мультиплексор 8в1. Управляющий сигнал `S` в данном случае трёхбитный. В блоке `case` мы перечисляем всевозможные варианты значений `S` и описываем выход мультиплексора.
|
||||
|
||||
```SystemVerilog
|
||||
```Verilog
|
||||
module case_mux_ex(
|
||||
input logic A,
|
||||
input logic B,
|
||||
@@ -192,7 +192,7 @@ endmodule
|
||||
|
||||
В контексте примера по мультиплексированию 1024 бит использование оператора может быть выполнено следующим образом:
|
||||
|
||||
```SystemVerilog
|
||||
```Verilog
|
||||
logic [1023:0] bus1024;
|
||||
logic [ 9:0] select;
|
||||
|
||||
@@ -203,7 +203,7 @@ assign one_bit_result = bus1024[select];
|
||||
|
||||
Реализация мультиплексоров через оператор '[]' будет активно применяться вами при реализации различных памятей.
|
||||
|
||||
## Итоги
|
||||
## Итоги главы
|
||||
|
||||
1. Мультиплексор — это **комбинационный** блок, подающий на выход один из нескольких входных сигналов.
|
||||
2. Мультиплексор можно описать множеством способов, среди них:
|
||||
|
Reference in New Issue
Block a user