mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
* СП. Обновление предисловия * СП. Обновление введения * СП. Обновление лаб * СП. Обновление доп материалов * СП. Введение * СП. Введение * СП. ЛР№4, 15 * СП. Базовые конструкции Verilog * Update Implementation steps.md * СП. ЛР 4,5,7,8,14 * СП. ЛР№8 * Синхронизация правок * СП. Финал * Исправление ссылки на рисунок * Обновление схемы * Синхронизация правок * Добавление белого фона .drawio-изображениям * ЛР2. Исправление нумерации рисунка
115 lines
4.0 KiB
Markdown
115 lines
4.0 KiB
Markdown
# Конкатенация (объединение сигналов)
|
||
|
||
Конкатенация позволяет присвоить какому-то многоразрядному сигналу "склейку" из нескольких сигналов меньшей разрядности, либо наоборот: присвоить сигнал большей разрядности группе сигналов меньшей разрядности.
|
||
|
||
Оператор конкатенации выглядит следующим образом: `{sig1, sig2, ..., sign}`.
|
||
|
||
Предположим, у нас есть следующий набор сигналов:
|
||
|
||

|
||
|
||
```Verilog
|
||
|
||
logic a;
|
||
logic b;
|
||
logic [7:0] c;
|
||
logic [1:0] d;
|
||
|
||
logic [5:0] e;
|
||
```
|
||
|
||
И мы хотим, чтобы на провод `e` подавались следующие сигналы:
|
||
|
||
- на старший бит сигнала `e` подавался сигнал `a`
|
||
- на его следующий бит подавался сигнал `b`
|
||
- на его следующие 2 бита подавались биты `[4:3]` сигнала `c`
|
||
- на младшие 2 бита подавался сигнал `d`
|
||
|
||

|
||
|
||
Это можно сделать путем 4 непрерывных присваиваний:
|
||
|
||
```Verilog
|
||
logic a;
|
||
logic b;
|
||
logic [7:0] c;
|
||
logic [1:0] d;
|
||
|
||
logic [5:0] e;
|
||
|
||
assign e[5] = a;
|
||
assign e[4] = b;
|
||
assign e[3:2] = c[4:3];
|
||
assign e[1:0] = d;
|
||
```
|
||
|
||
либо через одно присваивание, использующее конкатенацию:
|
||
|
||
```Verilog
|
||
logic a;
|
||
logic b;
|
||
logic [7:0] c;
|
||
logic [1:0] d;
|
||
|
||
logic [5:0] e;
|
||
|
||
assign e = {a, b, c[4:3], d};
|
||
```
|
||
|
||
Кроме того, возможна и обратная ситуация. Предположим, мы хотим подать отдельные биты сигнала `e` на различные провода:
|
||
|
||

|
||
|
||
```Verilog
|
||
logic a;
|
||
logic b;
|
||
logic [7:0] c;
|
||
logic [1:0] d;
|
||
|
||
logic [5:0] e;
|
||
|
||
assign a = e[5];
|
||
assign b = e[4];
|
||
assign c[4:3] = e[3:2];
|
||
assign d = e[1:0];
|
||
```
|
||
|
||
Подобную операцию можно так же выполнить в одно выражение через конкатенацию:
|
||
|
||
```Verilog
|
||
logic a;
|
||
logic b;
|
||
logic [7:0] c;
|
||
logic [1:0] d;
|
||
|
||
logic [5:0] e;
|
||
|
||
assign {a, b, c[4:3], d} = e;
|
||
```
|
||
|
||
Кроме того, конкатенация может использоваться при **множественном дублировании** сигналов. Дублирование выполняется выражением:
|
||
|
||
```Verilog
|
||
{a, {число_повторений{повторяемый_сигнал}} ,b}
|
||
```
|
||
|
||
Допустим, мы хотим присвоить какому-то сигналу три копии `[4:3]` битов сигнала `c`, после которых идут сигналы `a` и `b`.
|
||
Это можно сделать выражением:
|
||
|
||
```Verilog
|
||
logic a;
|
||
logic b;
|
||
logic [7:0] c;
|
||
|
||
logic [7:0] e;
|
||
|
||
assign e = { {3{c[4:3]}}, a, b};
|
||
```
|
||
|
||
## Итоги главы
|
||
|
||
Оператор конкатенации может быть использован для группировки и репликации сигналов по обе стороны присваивания, а именно:
|
||
|
||
- он может быть использован для присваивания сигналу большей разрядности группы сигналов меньшей разрядности
|
||
- он может быть использован для присваивания группе сигналов меньшей разрядности соответствующих бит сигнала большей разрядности.
|