Aynı Sembol İçin İki Rol
&, |, ^ ve bunların ters kardeşleri iki farklı şekilde karşına çıkar:
- İkili form (iki operand):
a & b- eşit genişlikteki vektörler arasında bitwise işlem. - Tekli form (tek operand):
&a-a'nın tüm bitlerini tek bite indirgeyen reduction.
Derleyici operand sayısını sayarak ikisini ayırır. Adlandırma geleneği ikili form için "bitwise operatörleri", tekli form için "reduction operatörleri" şeklindedir.
Bitwise: Bir Seferde Bir Bit
Tam set:
| Operatör | Ad | N pozisyonundaki çıkış biti |
|---|---|---|
a & b | AND | a[N] AND b[N] |
a | b | OR | a[N] OR b[N] |
a ^ b | XOR | a[N] XOR b[N] |
a ~& b | NAND | NOT (a[N] AND b[N]) |
a ~| b | NOR | NOT (a[N] OR b[N]) |
a ~^ b | XNOR | NOT (a[N] XOR b[N]) |
~a | NOT | NOT a[N] |
~&, ~|, ~^ operatörlerinin önce tilde, sonra operatör olarak yazıldığına dikkat et. Tek bir token'dır; aralarında boşluk yoktur.
İki operand farklı genişlikte olduğunda, daha dar olan eşleştirmek için solda sıfır ile genişletilir. Sign-extension istiyorsan, $signed() ile operandları açıkça signed yap.
Reduction: Birden Çok Bit'ten Bir Bit'e
Aynı operatörlerin tekli formları bir vektörü tek bir bite indirir:
Her birinin anlamı:
&data,data'nın tüm bitleri 1 ise1, aksi halde0döndürür. "Tamamen birler mi?" kontrolleri için kullanışlı.|data,data'nın herhangi bir biti 1 ise1, aksi halde0döndürür. "Sıfır değil mi?" kontrolleri için kullanışlı.^data, parity döndürür - tüm bitlerin XOR'u. 1'lerin sayısı tek ise1, çift ise0.~&data,~|data,~^datayukarıdakilerin tersleridir.
Gerçek kodda bunları her yerde göreceksin:
wire empty = ~|fifo_count; // count sıfırsa empty
wire all_ones = &mask; // tüm bitler set
wire parity_bit = ^data; // bir byte'ın parity'si
wire any_request = |request_vector; // herhangi bir istek var mı?
Reduction formları özlüdür ve bariz gate ağaçlarına sentezlenir: & çok girişli bir AND gate'e, | çok girişli bir OR'a, ^ ise bir XOR ağacına (ki bu donanımda parity üretecidir) indirgenir.
Yaygın Kalıplar
Bitleri Set ve Clear Etme
wire [7:0] data;
wire [7:0] mask = 8'b0000_1000;
wire [7:0] set = data | mask; // bit 3'ü 1 yapar
wire [7:0] cleared = data & ~mask; // bit 3'ü 0 yapar
wire [7:0] toggled = data ^ mask; // bit 3'ü flip eder
wire [7:0] tested = data & mask; // bit 3 0 ise sıfır, aksi halde sıfır değil
C'de kullanacağın bit manipülasyon deyimlerinin aynısı. Tek-gate'lik işlemlere sentezlenirler.
Bir Değerin Tamamen Birlere Eşit Olup Olmadığını Kontrol Etme
wire is_max = &counter; // counter'ın her biti 1 ise 1
Tek bir gate'lik bir reduction AND, vs counter == 8'hFF yazmak (bu da çalışır; sentezleyiciler genellikle aynı donanımı üretir).
Parity Biti Üretme
Aktif Sinyalleri Tespit Etme
wire any_pending = |request_vector;
request_vector genişse (örneğin 64 istek), reduction OR onu bir priority encoder'a veya arbiter'a besleyebileceğin tek bir sinyale indirir.
Shift Operatörleri
Bit düzeyi operatörlerindeyken, shift'ler de:
a << N,a'yıNbit pozisyon sola kaydırır, sağı sıfırlarla doldurur.a >> N,a'yıNbit pozisyon sağa kaydırır, solu sıfırlarla doldurur.a <<< Naritmetik sol shift (unsigned için<<ile aynı).a >>> Naritmetik sağ shift -asigned olduğunda sign biti ile doldurur.
Sabit bir kuvvet ile shift donanımda bedavadır (sadece yeniden kablolama). Çalışma zamanı değişkeni ile shift barrel shifter üretir, bu daha büyüktür ama yine de ucuzdur.
Sırada Ne Var
Tek bir değer döndüren her operatörü gördün. Bir sonraki doc - Concatenation and Replication - parçalardan daha geniş vektörler kuran {} ve {N{...}} sözdizimini kapsar; farklı genişlikteki modüller arasında arayüz oluştururken sürekli kullanacaksın.
Sıkça Sorulan Sorular
Verilog'da bitwise operatörleri nelerdir?
Bitwise operatörleri iki eşit genişlikteki vektörü pozisyon pozisyon birleştirir. a & b, a'nın 0. bitini b'nin 0. bitiyle, 1. bitini 1. bitiyle ve böyle devam eder AND'ler; sonuç girişlerle aynı genişliktedir. Tam set: & (AND), | (OR), ^ (XOR), ~ (NOT) ve ters formlar ~&, ~|, ~^ (NAND, NOR, XNOR).
Verilog'da reduction operatörü nedir?
Reduction operatörü, bitwise operatörün tekli bir formudur ve bütün bir vektörü tek bir bite indirir. &data, yalnızca data'nın her biti 1 ise 1 döndürür. |data, herhangi bir bit 1 ise 1 döndürür. ^data, tüm bitlerin XOR'unu - yani parity'yi - döndürür. Reduction formlarının solunda operand yoktur, sadece sağda.
Verilog'da & ile && arasındaki fark nedir?
& bitwise AND'dir - bitleri pozisyon pozisyon eşleştirir ve sonuç operandlarla aynı genişliktedir. && mantıksal AND'dir - her operandı boolean (sıfır vs sıfır olmayan) olarak işler ve 1 bitlik sonuç döndürür. 4'b1100 & 4'b0011 ifadesi 4'b0000'dır; 4'b1100 && 4'b0011 ifadesi 1'dir.
Verilog'da parity nasıl hesaplanır?
Reduction XOR operatörünü kullan: parity = ^data. data'nın her bitini birlikte XOR'lar. 8 bitlik bir vektör için bu data[7] ^ data[6] ^ ... ^ data[0] demektir. Tek sayıda bit set ise sonuç 1, çift ise 0 olur. ~^ ile terslemek even-parity (çift parity) verir.
Verilog'da ~ ne yapar?
~ bitwise NOT'tur - operandının her bitini tersler. ~4'b1100 ifadesi 4'b0011'dir. ! (mantıksal NOT) ile karıştırma - o operandı tek bitlik bir boolean'a indirip onu tersler. !4'b1100 ifadesi 1'b0'dır (operand sıfır değildir, doğruluk değerini NOT'lamak 0 verir).