Question

J'ai du mal à comprendre la syntaxe suivante dans Verilog:

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

Je sais la déclaration de assign va câbler quelque chose au bus result utilisant des fils et de la logique combinatoire, mais ce qui est avec les accolades et 16 {a [15]}?

Était-ce utile?

La solution

Les accolades signifient concaténation, de bit le plus significatif (MSB) à gauche jusqu'à bit le moins significatif (LSB) à droite. Vous créez un bus 32 bits (résultat) dont les 16 bits les plus significatifs se composent de 16 copies de bits 15 (MSB) du bus, et dont se composent de seulement l'un bus 16 bits les moins significatifs (cette construction particulière est connue comme extension de signe , qui est nécessaire par exemple à décalage vers la droite d'un nombre négatif complément à deux forme et le maintenir négatif plutôt que d'introduire des zéros dans les MSBits).

Il y a un tutoriel ici , mais il n'explique pas trop beaucoup plus que le paragraphe ci-dessus.

Pour ce que ça vaut la peine, les accolades imbriquées autour a[15:0] sont superflues.

Autres conseils

Matt dit, les accolades sont pour la concaténation. Les accolades supplémentaires autour 16{a[15]} sont les réplication opérateur. Ils sont décrits dans la norme IEEE pour le document Verilog (Std 1364-2005), section "5.1.14" De l'enchaînement.

{16{a[15]}}

est le même 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]
}

form-soufflé bit,

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

est le même 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];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top