2010-01-20 19 views
24

Estoy teniendo dificultades para comprender la siguiente sintaxis en Verilog:¿Qué significan las llaves en Verilog?

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

sé la declaración assign va a cablear algo al bus result utilizando alambres y lógica combinatoria, pero ¿qué pasa con las llaves y 16 {a [15]}?

Respuesta

41

Las llaves significan concatenación, desde el bit más significativo (MSB) de la izquierda hasta el bit menos significativo (LSB) de la derecha. Está creando un bus (resultado) de 32 bits cuyos 16 bits más significativos constan de 16 copias del bit 15 (el MSB) del bus a, y cuyos 16 bits menos significativos consisten en solo el bus a (esta construcción particular es conocida como sign extension, que es necesario, por ejemplo, para desplazar hacia la derecha un número negativo en el formulario two's complement y mantenerlo negativo en lugar de introducir ceros en los MSBits).

Hay un tutorial here, pero no explica mucho más que el párrafo anterior.

Por lo que vale, las llaves anidadas alrededor de a[15:0] son superfluas.

+1

gracias por su través explicación –

25

Como dijo Matt, las llaves son para concatenación. Las llaves adicionales alrededor de 16{a[15]} son el operador de replicación . Se describen en el documento IEEE Standard para Verilog (Std 1364-2005), sección "5.1.14 Concatenaciones".

{16{a[15]}} 

es lo mismo que

{ 
    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] 
} 

En forma poco con chorro de arena,

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

es lo mismo que:

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

lo es el RTL para este código verilog? – Pototo

+0

@Pototo Creo que es solo cableado. – Georan

Cuestiones relacionadas