2010-01-20 13 views
24

Sto avendo difficoltà a capire la seguente sintassi in Verilog:Cosa significano le parentesi graffe in Verilog?

input [15:0] a; // 16-bit input 
output [31:0] result; // 32-bit output 
assign result = {{16{a[15]}}, {a[15:0]}}; 

so la dichiarazione assign sarà cablare qualcosa al bus result utilizzando fili e logica combinatoria, ma cosa succede con le parentesi graffe e 16 {a [15]}?

risposta

41

Le parentesi graffe indicano la concatenazione, dal bit più significativo (MSB) a sinistra fino al bit meno significativo (LSB) a destra. Si sta creando un bus (risultato) a 32 bit i cui 16 bit più significativi consistono in 16 copie del bit 15 (MSB) del bus ae i cui 16 bit meno significativi sono costituiti solo da un bus (questa particolare costruzione è nota come sign extension, che è necessario ad es. per spostare a destra un numero negativo nel formato two's complement e tenerlo negativo anziché introdurre zeri negli MSBit).

Esiste un tutorial here, ma non spiega molto di più del paragrafo precedente.

Per quello che vale, le parentesi graffe nidificate intorno a a[15:0] sono superflue.

+1

grazie per il vostro tramite spiegazione –

25

Come ha detto Matt, le parentesi graffe sono per la concatenazione. Le parentesi graffe extra intorno a 16{a[15]} sono l'operatore di replica . Sono descritti nello standard IEEE per il documento Verilog (Std 1364-2005), sezione "5.1.14 Concatenamenti".

{16{a[15]}} 

è lo stesso di

{ 
    a[15], a[15], a[15], a[15], a[15], a[15], a[15], a[15], 
    a[15], a[15], a[15], a[15], a[15], a[15], a[15], a[15] 
} 

sotto forma di bit-sabbiato,

assign result = {{16{a[15]}}, {a[15:0]}}; 

è lo stesso:

assign result[ 0] = a[ 0]; 
assign result[ 1] = a[ 1]; 
assign result[ 2] = a[ 2]; 
assign result[ 3] = a[ 3]; 
assign result[ 4] = a[ 4]; 
assign result[ 5] = a[ 5]; 
assign result[ 6] = a[ 6]; 
assign result[ 7] = a[ 7]; 
assign result[ 8] = a[ 8]; 
assign result[ 9] = a[ 9]; 
assign result[10] = a[10]; 
assign result[11] = a[11]; 
assign result[12] = a[12]; 
assign result[13] = a[13]; 
assign result[14] = a[14]; 
assign result[15] = a[15]; 
assign result[16] = a[15]; 
assign result[17] = a[15]; 
assign result[18] = a[15]; 
assign result[19] = a[15]; 
assign result[20] = a[15]; 
assign result[21] = a[15]; 
assign result[22] = a[15]; 
assign result[23] = a[15]; 
assign result[24] = a[15]; 
assign result[25] = a[15]; 
assign result[26] = a[15]; 
assign result[27] = a[15]; 
assign result[28] = a[15]; 
assign result[29] = a[15]; 
assign result[30] = a[15]; 
assign result[31] = a[15]; 
+0

cosa è la RTL per questo codice di verilog? – Pototo

+0

@Pototo Credo che sia solo cablaggio. – Georan

Problemi correlati