Files
APS/Basic Verilog structures/Concatenation.md
Andrei Solodovnikov 9739429d6e Синхронизация с правками публикуемого издания (#101)
* СП. Обновление предисловия

* СП. Обновление введения

* СП. Обновление лаб

* СП. Обновление доп материалов

* СП. Введение

* СП. Введение

* СП. ЛР№4, 15

* СП. Базовые конструкции Verilog

* Update Implementation steps.md

* СП. ЛР 4,5,7,8,14

* СП. ЛР№8

* Синхронизация правок

* СП. Финал

* Исправление ссылки на рисунок

* Обновление схемы

* Синхронизация правок

* Добавление белого фона .drawio-изображениям

* ЛР2. Исправление нумерации рисунка
2025-02-12 17:53:52 +03:00

115 lines
4.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Конкатенация (объединение сигналов)
Конкатенация позволяет присвоить какому-то многоразрядному сигналу "склейку" из нескольких сигналов меньшей разрядности, либо наоборот: присвоить сигнал большей разрядности группе сигналов меньшей разрядности.
Оператор конкатенации выглядит следующим образом: `{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};
```
## Итоги главы
Оператор конкатенации может быть использован для группировки и репликации сигналов по обе стороны присваивания, а именно:
- он может быть использован для присваивания сигналу большей разрядности группы сигналов меньшей разрядности
- он может быть использован для присваивания группе сигналов меньшей разрядности соответствующих бит сигнала большей разрядности.