2010-01-20 20 views
24

Ich bin eine harte Zeit zu verstehen, die folgende Syntax in Verilog:Was bedeuten geschweifte Klammern in Verilog?

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

Ich kenne die assign Anweisung Drähte und kombinatorische Logik etwas bis zum result Bus Draht, aber was ist mit den geschweiften Klammern und 16 {a [15]}?

Antwort

41

Die geschweiften Klammern bedeuten Verkettung, vom höchstwertigen Bit (MSB) auf der linken Seite bis zum niedrigstwertigen Bit (LSB) auf der rechten Seite. Sie erstellen einen 32-Bit-Bus (Ergebnis), dessen 16 höchstwertige Bits aus 16 Kopien von Bit 15 (dem MSB) des a-Busses bestehen und dessen 16 niedrigstwertige Bits nur aus dem a-Bus bestehen (diese spezielle Konstruktion ist bekannt) als sign extension, die zB benötigt wird, um eine negative Zahl in two's complement Form nach rechts zu verschieben und es negativ zu halten, anstatt Nullen in die MSBits einzuführen).

Es gibt ein Tutorial here, aber es erklärt nicht viel mehr als den obigen Absatz.

Für was es wert ist, sind die verschachtelten geschweiften Klammern um a[15:0] überflüssig.

+1

vielen Dank für Ihre durch Erklärung –

25

Wie Matt sagte, sind die geschweiften Klammern für die Verkettung. Die zusätzlichen geschweiften Klammern um 16{a[15]} sind die Replikation Operator. Sie sind im IEEE-Standard für Verilog-Dokument (Std. 1364-2005), Abschnitt "5.1.14 Verkettungen" beschrieben.

{16{a[15]}} 

ist die gleiche wie

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

In Bit gestrahlt Form

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

das gleiche wie:

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

was ist die RTL für diesen Verilog-Code? – Pototo

+0

@Pototo Ich glaube, es ist nur Verkabelung. – Georan

Verwandte Themen