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

在Verilog HDL語言中存在3種邏輯運算符,它們分別是:
(1)&&:邏輯與;
(2)?| |??:邏輯或;
(3)!:邏輯非。
5.4.1邏輯與
“&&”是雙目運算符,其要求有兩個操作數(shù),如a && b。
(1)1位邏輯與

A和B都為1時,C為1,否則C為0。
對應(yīng)硬件電路圖如下所示:

(2)多位邏輯與

對應(yīng)硬件電路圖如下所示:

5.4.2邏輯或
“||”是雙目運算符,其要求有兩個操作數(shù),如?a||b。
(1)1位邏輯或

A和B其中1個為1,C為1,否則C為0。
對應(yīng)硬件電路圖如下圖所示:

(2)多位邏輯或

A和B其中1個非0,C為1,否則C為0。
對應(yīng)硬件電路圖如下圖所示:

5.4.3邏輯非
“!”是單目運算符,只要求有一個操作數(shù),如!(a>b)。

對操作數(shù)a需要先判斷非a是否為真,為真就執(zhí)行{}內(nèi)的操作,為假的話就結(jié)束操作。
下表為邏輯運算的真值表,其表示當(dāng)a和b的值為不同的組合時各種邏輯運算所得到的值。
表1.3- 10邏輯運算的真值表

邏輯運算符最后的結(jié)果只有邏輯真或邏輯假兩種,即1或0。
一般情況下用邏輯運算符作判斷條件時邏輯與操作只能是兩個1位寬的數(shù),
只有兩個表達式同時為真才為真,有一個為假則為假。
如果操作數(shù)是多位的,則可以將操作數(shù)看做整體,
若操作數(shù)中每一位都是0值則為邏輯0值;若操作數(shù)中有1則為邏輯1值。

由于4’b0111和4’b1000都不是0,不為0則被認(rèn)為是邏輯真,所以上面的代碼等效于如下代碼。

也就是結(jié)果為a為邏輯真,b為邏輯真,c為邏輯假。
5.4.4經(jīng)驗總結(jié)
邏輯運算符的優(yōu)先級
邏輯運算符中“&&”和“||”的優(yōu)先級低于算數(shù)運算符;“!”的優(yōu)先級高于雙目邏輯運算符。
舉例如下:

邏輯運算符兩邊對應(yīng)的是1比特信號
筆者使用心得:邏輯運算符兩邊對應(yīng)的是1比特信號

請讀者注意上文代碼,其中a和b都是多比特信號,表示兩個多比特信號進行邏輯與。
這句代碼的正確理解是:當(dāng)a不等于0?并且?b不等于0時,d的值為1。
然而即使是有過多年工作經(jīng)驗的工程師也很難從直觀上直接理解上文代碼所隱含的意思。
不等于0就是表示邏輯真,等于0就表示邏輯假的這一概念很容易被忽略。
因此上文代碼,雖然從功能上沒有錯誤,但設(shè)計師在設(shè)計中不應(yīng)該以炫耀技術(shù)為目的進行代碼編寫,
而且這種寫法很容易出現(xiàn)誤設(shè)計的情況,例如可能原本要表達?assign d =a & b,
但最后由于設(shè)計不夠直觀而寫成了上面的代碼,導(dǎo)致設(shè)計出現(xiàn)問題。因此在設(shè)計中寫出直觀能理解,
讓自己與他者看到代碼時可以立刻明白代碼的意思非常重要,所以筆者建議上面代碼寫成如下形式。

多用括號區(qū)分優(yōu)先級
筆者使用心得2:不要試圖記住優(yōu)先級,而是要多用括號
實際上,工程師們在工作中并不會記住所有優(yōu)先級排序,
記住所有的優(yōu)先級的這一工作也并不會大幅度的提升工程師的工作效率。在設(shè)計中可能會遇到如下所示代碼:
(1)a < b && c > d?;
(2)a = = b | | c = = d?;
(3)!a | | a > b?。
假如沒有記住運算符的優(yōu)先級,遇到類似這三個例子的情況時勢必會花一定的時間來理清思路,
思考究竟先判斷哪部分。假如工程師能夠記住優(yōu)先級,也需要就這些代碼進行溝通和檢查的工作,
而且人是容易犯錯的,而這些錯誤經(jīng)常會被忽略,很難被檢查出來。
因此,為了提高程序的可讀性,明確表達各運算符間的優(yōu)先關(guān)系,筆者建議讀者在設(shè)計時多使用括號。
上面的三個例子就可分別寫成:
1)(a < b)&&(c > d);
2)(a = = b)| |(c = = d);
3)(!a)| |(a > b)。
少用邏輯非
筆者使用心得3:多用“邏輯與”和“邏輯或”,少用邏輯非
“邏輯與”翻譯成中文就是“并且”,“邏輯或”翻譯成中文就是“或者”。
假設(shè)有一個信號flag,0表示空閑,1表示忙?!?!(flag==0)&& a==4’b1000)”,
讀起來就是“在空閑的時候取其反狀態(tài),并且當(dāng)a等于4’b1000時條件成立”。
這樣讀起來非常拗口,并且在閱讀這一代碼時還需要腦袋還要多轉(zhuǎn)一下彎,多進行一層思考。
為了讓代碼更加直觀,筆者建議上面的例子寫成“flag==1 && a==4’b1000”,
讀起來就是“在忙并且?a等于4’b1000的時候”條件成立。
相關(guān)視頻:https://www.bilibili.com/video/BV1yf4y1R7gH?p=15