2010-01-20 10 views
24

Mam twardy czas zrozumienia następującą składnię w Verilog:Co oznaczają nawiasy klamrowe w Verilog?

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

Znam oświadczenie assign będą drutu coś do autobusu result wykorzystaniem przewodów i kombinowanych logiki, ale to, co się dzieje z klamrami i 16 {a [15]}?

Odpowiedz

41

Kręte szelki oznaczają konkatenację, od najbardziej znaczącego bitu (MSB) po lewej stronie do najmniej znaczącego bitu (LSB) po prawej stronie. Tworzysz 32-bitową magistralę (wynik), której 16 najbardziej znaczących bitów składa się z 16 kopii bit 15 (MSB) magistrali, a której 16 najmniej znaczących bitów składa się tylko z magistrali (ta konkretna konstrukcja jest znana jako sign extension, która jest potrzebna np. do przesunięcia w prawo liczby ujemnej w formularzu two's complement i zamiast niej wprowadzać wartości ujemne zamiast MSB).

Istnieje samouczek: here, ale nie wyjaśnia to za dużo więcej niż powyższy akapit.

Dla tego, co jest warte, zagnieżdżone nawiasy klamrowe wokół a[15:0] są zbędne.

+1

dziękuję za pośrednictwem wyjaśnienia –

25

Jak powiedział Matt, nawiasy klamrowe służą do łączenia. Dodatkowe nawiasy klamrowe w okolicy 16{a[15]} są operatorami replikacji . Są one opisane w dokumencie IEEE Standard for Verilog (Std 1364-2005), rozdział "5.1.14 Konkatenacje".

{16{a[15]}} 

jest taka sama jak

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

W bitów piaskowane formie

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

jest taka sama, jak:

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

co jest RTL dla tego kodu verilog? – Pototo

+0

@Pototo Wierzę, że to tylko okablowanie. – Georan