mirror of
https://github.com/MPSU/APS.git
synced 2026-06-10 11:13:33 +00:00
114 lines
2.5 KiB
Markdown
114 lines
2.5 KiB
Markdown
# Concatenation (Signal Merging)
|
|
|
|
Concatenation allows assigning a multi-bit signal the "join" of several lower-width signals, or conversely, assigning a higher-width signal to a group of lower-width signals.
|
|
|
|
The concatenation operator has the following form: `{sig1, sig2, ..., sign}`.
|
|
|
|
Suppose we have the following set of signals:
|
|
|
|

|
|
|
|
```Verilog
|
|
|
|
logic a;
|
|
logic b;
|
|
logic [7:0] c;
|
|
logic [1:0] d;
|
|
|
|
logic [5:0] e;
|
|
```
|
|
|
|
And we want the wire `e` to receive the following signals:
|
|
|
|
- the MSB of signal `e` receives signal `a`
|
|
- the next bit receives signal `b`
|
|
- the next 2 bits receive bits `[4:3]` of signal `c`
|
|
- the 2 LSBs receive signal `d`
|
|
|
|

|
|
|
|
This can be done using 4 continuous assignments:
|
|
|
|
```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;
|
|
```
|
|
|
|
or with a single assignment using concatenation:
|
|
|
|
```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};
|
|
```
|
|
|
|
The reverse is also possible. Suppose we want to drive individual wires from separate bits of signal `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];
|
|
```
|
|
|
|
This operation can also be expressed as a single concatenation:
|
|
|
|
```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;
|
|
```
|
|
|
|
Additionally, concatenation can be used for **signal replication**. Replication is expressed as:
|
|
|
|
```Verilog
|
|
{a, {replication_count{signal_to_replicate}} ,b}
|
|
```
|
|
|
|
For example, to assign three copies of bits `[4:3]` of signal `c`, followed by signals `a` and `b`:
|
|
|
|
```Verilog
|
|
logic a;
|
|
logic b;
|
|
logic [7:0] c;
|
|
|
|
logic [7:0] e;
|
|
|
|
assign e = { {3{c[4:3]}}, a, b};
|
|
```
|
|
|
|
## Chapter Summary
|
|
|
|
The concatenation operator can be used to group and replicate signals on either side of an assignment:
|
|
|
|
- it can be used to assign a group of lower-width signals to a higher-width signal
|
|
- it can be used to assign the corresponding bits of a higher-width signal to a group of lower-width signals.
|