按位邏輯運算符
本節(jié)的文檔編號:001100000061
需要看對應(yīng)的視頻,請點擊視頻編號:001100000062
1、本節(jié)主要進行組合邏輯的介紹,包括:程序語句(assign語句、always語句),數(shù)字進制(二進制、不定態(tài)、高阻態(tài)),算數(shù)運算符(加、減、乘、除運算符),邏輯運算符(邏輯與、或、非運算符),按位邏輯運算符(單目按位與、或、非運算符,雙目按位與、或、異或運算符),關(guān)系運算符,移位運算符(左移、右移運算符),條件運算符(三目運算符、if語句、case語句、選擇語句等),拼接運算符;
2、ALTERA和VIVADO文檔
5.5?按位邏輯運算符

注:~ ^, ^ ~(二元異或非即同或):(相當于同或門運算)。
在Verilog HDL語言中有下面幾種按位運算符:
~(一元非):(相當于非門運算)
&(二元與):(相當于與門運算)
|(二元或):(相當于或門運算)
^(二元異或):(相當于異或門運算)
這些操作符在輸入操作數(shù)的對應(yīng)位上按位操作,并產(chǎn)生向量結(jié)果。
下圖各真值表種顯示對于不同按位邏輯運算符按位操作的結(jié)果:

5.5.1單目按位與
單目按位與運算符&,運算符后為需要進行邏輯運算的信號,表示對信號進行每位之間相與的操作。
例如
Reg[3:0] A,C;
assign C=&A;
上面代碼等價于?C = A[3] &A[2] & A[1] & A[0];
如果A=4’b0110,C的結(jié)果為0。
5.5.2單目按位或
單目按位或運算符|,運算符后為需要進行邏輯運算的信號,表示對信號進行每位之間相或的操作。例如
Reg[3:0] A,C;
assign C=|A;
上面代碼等價于?C = A[3] | A[2] |A[1] | A[0];
如果A=4’b0110,C的結(jié)果為1。
5.5.3單目按位非
單目按位非運算符~,運算符后為需要進行邏輯運算的信號,表示對信號進行每位取反的操作。例如
Reg[3:0] A,C;
assign C=~A;
上面代碼等價于?C[3] = ~A[3],C[2] = ~A[2],C[1] = ~A[1],C[0] = ~A[0]。
如果A=4’b0110,C的結(jié)果為4’b1001。
5.5.4雙目按位與
雙目按位與運算符&,信號位于運算符的左右兩邊,表示的是對這兩個信號進行對應(yīng)位相與的操作。例如
Reg[3:0] A,B,C;
assign C = A & B;
上面的代碼等價于:C[0] = A[0] &B[0],C[1] = A[1] & B[1],C[2] = A[2] & B[2],C[3] = A[3] &B[3]。
如果A=4’b0110,B=4’b1010,C的結(jié)果為4’b0010。
如果操作數(shù)長度不相等,?長度較小的操作數(shù)在最左側(cè)添0?補位。例如,
reg[1:0] A;
reg[2:0] B;
reg[3:0] C;
assign C = A & B;
上面的代碼等價于:C[0] = A[0] &B[0],C[1] = A[1] & B[1],C[2] = 0& B[2],C[3] = 0 &0。
5.5.5雙目按位或
雙目按位或運算符|,信號位于運算符的左右兩邊,表示的是對這兩個信號進行對應(yīng)位相或的操作。例如
reg[3:0] A,B,C;
assign C = A | B;
上面的代碼等價于:C[0] = A[0] |B[0],C[1] = A[1] | B[1],C[2] = A[2] | B[2],C[3] = A[3] | B[3]。
如果A=4’b0110,B=4’b1010,C的結(jié)果為4’b1110。
如果操作數(shù)長度不相等,?長度較小的操作數(shù)在最左側(cè)添0?補位。例如,
reg[1:0] A;
reg[2:0] B;
reg[3:0] C;
assign C = A | B;
上面的代碼等價于:C[0] = A[0] |B[0],C[1] = A[1] | B[1],C[2] = 0 | B[2],C[3] = 0 | 0。
5.5.6雙目按位異或
雙目按位異或運算符^,信號位于運算符的左右兩邊,表示的是對這兩個信號進行對應(yīng)位相異或的操作。
異或是指0^0=0,1^1=0,0^1=1,即相同為0,不同為1。例如
reg[3:0] A,B,C;
assign C = A ^ B;
上面的代碼等價于:C[0] = A[0] ^B[0],C[1] = A[1] ^ B[1],C[2] = A[2] ^ B[2],C[3] = A[3] ^ B[3]。
如果A=4’b0110,B=4’b1010,C的結(jié)果為4’b1100。
如果操作數(shù)長度不相等,?長度較小的操作數(shù)在最左側(cè)添0?補位。例如,
reg[1:0] A;
reg[2:0] B;
reg[3:0] C;
assign C = A | B;
上面的代碼等價于:C[0] = A[0] ^B[0],C[1] = A[1] ^ B[1],C[2] = 0 ^ B[2],C[3] = 0 ^ 0。
5.5.7經(jīng)驗總結(jié)
邏輯運算符和位運算符的區(qū)別
邏輯運算符包括&&、||、!,位運算符包括&、|、~。那么邏輯運算符和位運算符有什么區(qū)別呢?
將邏輯與“&&”和按位與“&”進行對比可以看出,邏輯與運算符的運算只有邏輯真或邏輯假兩種結(jié)果,
即1或0;而“&”是位運算符,用于兩個多位寬數(shù)據(jù)操作。對于位運算符操作,兩個數(shù)按位進行相與、相或或者非。

上面運行的結(jié)果為:a=1’b1,b=1’b1,c=1’b0,d=4’b000,e=4’b1111,f=4’b1000。
相關(guān)視頻:https://www.bilibili.com/video/BV1yf4y1R7gH?p=16