Pregunta

Estoy teniendo dificultades para comprender la siguiente sintaxis en Verilog:

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

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

¿Fue útil?

Solución

Las llaves de concatenación media, desde el bit más significativo (MSB) en el abajo a la izquierda hasta el bit menos significativo (LSB) a la derecha. Está creando un bus de 32 bits (resultado) cuyos 16 bits más significativos consistir en 16 copias de bit 15 (el MSB) de la un autobús, y cuyos 16 bits menos significativos consistir en sólo el un bus (esta construcción particular se conoce como extensión de signo, que es necesaria por ejemplo para desplazamiento a la derecha un número negativo en forma de complemento de dos y mantenerlo negativo en lugar de introducir ceros en los MSBits).

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

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

Otros consejos

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

{16{a[15]}}

es el 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 BIT-chorreado,

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

es el 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];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top