Menu

Verilog Bitwise ve Reduction Operatörleri

Verilog'daki bit düzeyi operatörleri - bitwise AND/OR/XOR, terslenmiş formlar ve bütün bir vektörü tek bir bite indiren reduction operatörleri.

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

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örAdN pozisyonundaki çıkış biti
a & bANDa[N] AND b[N]
a | bORa[N] OR b[N]
a ^ bXORa[N] XOR b[N]
a ~& bNANDNOT (a[N] AND b[N])
a ~| bNORNOT (a[N] OR b[N])
a ~^ bXNORNOT (a[N] XOR b[N])
~aNOTNOT 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 ise 1, aksi halde 0 döndürür. "Tamamen birler mi?" kontrolleri için kullanışlı.
  • |data, data'nın herhangi bir biti 1 ise 1, aksi halde 0 dö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 ise 1, çift ise 0.
  • ~&data, ~|data, ~^data yukarı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ı N bit pozisyon sola kaydırır, sağı sıfırlarla doldurur.
  • a >> N, a'yı N bit pozisyon sağa kaydırır, solu sıfırlarla doldurur.
  • a <<< N aritmetik sol shift (unsigned için << ile aynı).
  • a >>> N aritmetik sağ shift - a signed 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).

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA