# Конкатенация (объединение сигналов)

Конкатенация позволяет присвоить какому-то многоразрядному сигналу "склейку" из нескольких сигналов меньшей разрядности, либо наоборот: присвоить сигнал большей разрядности группе сигналов меньшей разрядности.

Оператор конкатенации выглядит следующим образом: `{sig1, sig2, ..., sign}`.

Предположим, у нас есть следующий набор сигналов:

![../.pic/Basic%20Verilog%20structures/concatenation/fig_01.drawio.svg](../.pic/Basic%20Verilog%20structures/concatenation/fig_01.drawio.svg)

```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`

![../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.svg](../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.svg)

Это можно сделать путем 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` на различные провода:

![../.pic/Basic%20Verilog%20structures/concatenation/fig_03.drawio.svg](../.pic/Basic%20Verilog%20structures/concatenation/fig_03.drawio.svg)

```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};
```

## Итоги главы

Оператор конкатенации может быть использован для группировки и репликации сигналов по обе стороны присваивания, а именно:

- он может быть использован для присваивания сигналу большей разрядности группы сигналов меньшей разрядности
- он может быть использован для присваивания группе сигналов меньшей разрядности соответствующих бит сигнала большей разрядности.
