mirror of
https://github.com/MPSU/APS.git
synced 2025-09-16 01:30:10 +00:00
Initial commit
This commit is contained in:
108
Basic Verilog structures/Concatenation.md
Normal file
108
Basic Verilog structures/Concatenation.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# Конкатенация (объединение сигналов)
|
||||
|
||||
Конкатенация позволяет присвоить какому-то многоразрядному сигналу "склейку" из нескольких сигналов меньшей разрядности, либо наоборот: присвоить сигнал большей разрядности группе сигналов меньшей разрядности.
|
||||
|
||||
Оператор конкатенации выглядит следующим образом: `{sig1, sig2, ..., sign}`.
|
||||
|
||||
Предположим, у нас есть следующий набор сигналов:
|
||||
|
||||

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

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

|
||||
|
||||
```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};
|
||||
```
|
||||
|
Reference in New Issue
Block a user