Menu

Verilog Sayı Literal'leri: Binary, Hex, Decimal ve Boyutlu Sabitler

Verilog sabitleri nasıl yazar: boyutlu ve boyutsuz, 'b 'h 'd 'o tabanları, signed sayılar, okunabilirlik için underscore'lar ve yeni başlayanları yakalayan tuzaklar.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Boyutlu Bir Literal'in Anatomisi

Bir Verilog literal'i üç parçaya kadar sahiptir:

8'b1010_1100
│  │ │
│  │ └─ seçilen tabandaki rakamlar
│  └─── taban specifier: b (binary), h (hex), d (decimal), o (octal)
└────── bit cinsinden genişlik (decimal)

Soldan sağa okuma: "8 bitlik bir değer, binary olarak yazılı, 10101100 rakamlarıyla". Bu decimal'de 172, hex'te 0xAC, hangi şekilde yazsan da aynı bitler. Genişlik derleyiciye tam olarak kaç bit ayıracağını söyler; taban rakamları nasıl yorumlayacağını söyler.

Underscore'lar görsel ayırıcılardır. 32'b1010_1100_0011_0101, 32'b1010110000110101 ile aynıdır. Kullan.

Dört Taban

Hex (h), 4 bitten geniş her şey için standarttır. Binary (b), bit kalıplarını doğrudan okumak istediğinde standarttır. Decimal (d), insan-anlamlı sayımlar içindir. Octal (o) vardır ama neredeyse hiç görmeyeceksin.

Hex rakamları büyük/küçük harf duyarsızdır: 8'hAB ve 8'hab aynıdır.

Değer Sığmadığında Ne Olur

Rakamların tanımlı genişliği doldurmazsa, Verilog solda sıfır ile doldurur:

8'b101       // 8'b00000101'e eşdeğer  (= 5)
8'hF         // 8'h0F'e eşdeğer        (= 15)

Rakamların tanımlı genişliği aşarsa, Verilog yüksek bitleri uyarıyla truncate eder:

4'hFF        // 4'hF'e truncate olur, simülatör uyarır
4'b10000     // 4'b0000'e truncate olur

Uyarı arkadaşındır. Onu bastırma.

Boyutlu vs Boyutsuz

Genişliği olmayan bir literal:

'd10    // boyutsuz, varsayılan boyutu alır (≥32 bit)
10      // ayrıca boyutsuz - taban yok demek decimal demek

Boyutsuz literal'ler çoğu araçta varsayılan olarak 32 bittir. Bu bütün bir hata sınıfının kaynağıdır:

reg [7:0] count;
if (count == -1) ...      // -1 boyutsuz 32 bittir; karşılaştırma garipleşir

Düzeltme -1 yerine 8'hFF yazmaktır veya 8'd255 veya {8{1'b1}}. Genişliğe özgü ifadelerde kullanıldığında literal'leri her zaman boyutlandır.

Boyutsuz literal'lerin iyi olduğu tek yer, integer'ın sürpriz olmadan yeterince geniş olduğu testbench for döngülerindeki integer sayaçlarıdır.

Signed Literal'ler

Varsayılan olarak, boyutlu literal'ler unsigned'dır:

8'd255   // unsigned 255
8'b1111_1111   // unsigned 255 - aynı bit kalıbı, sadece farklı yazılmış

Literal'i signed olarak yorumlamak istiyorsan, apostroftan sonra s ekle:

8'sd10           // signed 10
8'sb1111_1111    // signed -1 (iki'nin tümleyeni)

s flag'i şunlar için önemlidir:

  • <<< ve >>> operatörleri (aritmetik shift'ler) - signed operandları sign-extend eder.
  • Signed karışık ifadelerde karşılaştırma operatörleri.
  • $signed/$unsigned cast'leri.

Bus sinyallerinde çoğu sıradan aritmetik için, s'yi bırakacaksın.

X ve Z'li Sayı Literal'leri

Bir literal rakamı x (bilinmeyen) veya z (yüksek empedans) olabilir:

8'bx, "8 bitin hepsi bilinmeyen" için bir kısaltmadır - değer tanımlanan genişliği doldurmak için yayılır. x rakamları state machine'lerin default case'lerinde ve initialization'da yaygındır. Semantiği X and Z Values bölümünde kapsıyoruz.

Pratikte Boyutlu Literal'ler Nerede Görünür

Gerçek modüller yazmaya başladığında, boyutlu literal'ler her yerde görünür:

// Bus genişlikleri
input  wire [31:0] addr;
wire [31:0] zero = 32'h0;
wire [31:0] all_ones = 32'hFFFF_FFFF;

// State encoding'leri
localparam IDLE = 3'd0;
localparam BUSY = 3'd1;
localparam DONE = 3'd2;

// Mask'ler
wire is_msb_set = data & 32'h8000_0000;

// Karşılaştırmalar
if (counter == 8'd255) ...

// Reset değerleri
always @(posedge clk) begin
    if (reset) data_out <= 8'd0;
    else       data_out <= data_in;
end

Kalıp tutarlı: genişliği yaz, taban'ı yaz, rakamları yaz. Uzanacağın her literal aynı şekle sahiptir.

Bir Test Sürüşü

Artık bir Verilog modülünün isteyebileceği herhangi bir sabiti yazmak için ihtiyacın olan her şeye sahipsin. Veri tipleri hikayesinin son parçası, bir sinyal temiz 0 veya 1 olmadığında ne olduğudur - x ve z değerleri.

Sıkça Sorulan Sorular

Verilog'da 8'b1010 ne anlama gelir?

Bu boyutlu bir binary literal'dir: binary gösterimi 00001010 olan 8 bitlik bir değer. Apostroftan önceki sayı bit cinsinden genişliktir; apostroftan sonraki harf taban'dır (b binary, h hex, d decimal, o octal); sonraki rakamlar değerdir. Rakamlar genişliği doldurmazsa, literal solda sıfır ile doldurulur.

Verilog'da boyutlu ve boyutsuz sayılar arasındaki fark nedir?

8'd10 gibi boyutlu bir literal tam olarak 8 bit genişliğindedir. 'd10 veya sadece 10 gibi boyutsuz bir literal varsayılan olarak 32 bittir, ki bu genellikle çok fazladır. Genişliğe özgü ifadelere boyutsuz literal'ler karıştırmak ince hatalara neden olur - tek kullanımlık test kodu dışında her yerde boyutlu literal'leri tercih et.

Verilog'da bir hex sayı nasıl yazılır?

'h taban specifier'ını kullan: 8'hFF, 255 değerinin 8 bitlik bir değeridir. Hex rakamları büyük/küçük harf duyarsızdır; 8'hff ve 8'hFF aynıdır. Okunabilirlik için rakamları underscore'larla gruplayabilirsin: 32'hDEAD_BEEF. Underscore'lar parser tarafından yok sayılır.

Verilog sayılarda underscore'lar nasıl çalışır?

Underscore'lar parser'ın yok saydığı görsel ayırıcılardır. 32'b1010_1100_0011_0101, 32'b1010110000110101 ile tam olarak aynı değerdir ama okumak çok daha kolaydır. Taban önekinden sonraki ilk karakter bir underscore olamaz, ama rakam string'inde başka herhangi bir yere koyabilirsin.

Verilog'da signed bir sayı nasıl yazılır?

Apostroftan sonra s ekle: 8'sd10, signed 8 bitlik decimal 10'dur ve 8'sb1111_1111 signed -1'dir. Varsayılan olarak, boyutlu literal'ler unsigned'dır; s modifier bunu çevirir. Çoğu aritmetik unsigned operandlar kullanır - yalnızca negatif değerlerin <, >>> ve benzeri operatörlerden yayılmasını gerçekten ihtiyaç duyduğunda signed'a uzan.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA