Files
APS/Basic Verilog structures/Concatenation.md
2024-01-31 17:53:28 +03:00

108 lines
3.4 KiB
Markdown
Raw 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)
```SystemVerilog
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 непрерывных присваиваний:
```SystemVerilog
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;
```
либо через одно присваивание, использующее конкатенацию:
```SystemVerilog
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_02.drawio.svg](../.pic/Basic%20Verilog%20structures/concatenation/fig_02.drawio.svg)
```SystemVerilog
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];
```
Подобную операцию можно так же выполнить в одно выражение через конкатенацию:
```SystemVerilog
logic a;
logic b;
logic [7:0] c;
logic [1:0] d;
logic [5:0] e;
assign {a, b, c[4:3], d} = e;
```
Кроме того, конкатенация может использоваться при **множественном дублировании** сигналов. Дублирование выполняется выражением:
```SystemVerilog
{a, {число_повторений{повторяемый_сигнал}} ,b}
```
Допустим, мы хотим присвоить какому-то сигналу три копии `[4:3]` битов сигнала `c`, после которых идут сигналы `a` и `b`.
Это можно сделать выражением:
```SystemVerilog
logic a;
logic b;
logic [7:0] c;
logic [7:0] e;
assign e = { {3{c[4:3]}}, a, b};
```