這篇文章分為三個(gè)部分,解讀某個(gè)學(xué)生在EDN姐妹媒體EEWeb論壇上所提出的一個(gè)問題,其核心如下:他的老師布置了一個(gè)布爾方程式;然后要求他創(chuàng)建相應(yīng)的真值表;然后再告訴他要進(jìn)行卡諾圖化簡(jiǎn);最后要他必須只使用與非(NAND)門或只使用或非(NOR)門來實(shí)現(xiàn)這個(gè)電路。
因此,一開始要做的就是考慮為什么首先要提出這種問題。接下來就是更詳細(xì)地研究這個(gè)學(xué)生的特定問題,并將其轉(zhuǎn)換成最初的與或解決方案。然后,就是考慮將與或電路轉(zhuǎn)換為與非-或非對(duì)應(yīng)電路的一般概念。最后,就是用所學(xué)的知識(shí)來解決這個(gè)學(xué)生的最初問題。
為什么要只使用與非門或只使用或非門?
那么,為什么老師都會(huì)要求他的學(xué)生只使用與非門或只使用或非門來實(shí)現(xiàn)邏輯函數(shù)?(請(qǐng)注意,我特地不說“只使用與非門或或非門”,因?yàn)檫@有可能被理解成可以使用與非門和或非門,而不使用與門和或門。)
盡管學(xué)生可能對(duì)此感到驚訝,但不一定就說明老師是個(gè)不成功的人,他生活中唯一的樂趣就是去折磨學(xué)生。話雖這么說,但回想起我自己還是一名學(xué)生的日子,我們最好不要實(shí)際排除這種可能的動(dòng)機(jī)。
我不由自主地想到老師給學(xué)生布置這個(gè)作業(yè)可能有以下原因:
1.給出一個(gè)用與門或或門(乘積的和或和的乘積形式)描述的電路,然后要求學(xué)生將其轉(zhuǎn)換成只使用與非門、只使用或非門或使用與非門和或非門組合的另一種表現(xiàn)形式,是確保讓學(xué)生了解各種邏輯門如何工作的好方法。它還有助于確保讓學(xué)生了解德·摩根變換之類的內(nèi)容。
2.如果你想使用簡(jiǎn)單的邏輯器件——例如包含六個(gè)非門或四個(gè)2輸入與門、或門、與非門或或非門的雙列直插(DIL)封裝集成電路(IC)——來設(shè)計(jì)印制電路板(PCB),而你可能正好沒有與門之類的東西,但是碰巧有一個(gè)與非門和一個(gè)非門備用(或者可能是一個(gè)或門和三個(gè)非門),那么在這種情況下,你對(duì)邏輯門的理解就可能扭轉(zhuǎn)局面。
3.最簡(jiǎn)單的邏輯門是非門。假設(shè)是CMOS電路,那么一個(gè)非門需要兩個(gè)晶體管。與非門和或非門要復(fù)雜一些,這兩種門每種包含四個(gè)晶體管。然后是與門和或門,這兩種門每種包含六個(gè)晶體管。也就是說,如果使用與非門或或非門代替與門或或門,那么所使用的晶體管數(shù)量可以減少三分之一。
4.關(guān)于上一點(diǎn),與門實(shí)際上是由一個(gè)與非門后接一個(gè)非門構(gòu)成的(同樣,或門是由一個(gè)或非門后接一個(gè)非門所組成)。除了使用4+2=6個(gè)晶體管外,這還說明與門(和或門)具有兩級(jí)延遲。因此,如果可以使用與非門取代與門(或用或非門取代或門),所得到的電路會(huì)運(yùn)行得更快。
5.順便稍微說一句,本文所討論的所有內(nèi)容在我的書“Bebop to the Boolean Boogie”中都有詳細(xì)描述。
實(shí)際上,現(xiàn)在已很少有人在門級(jí)進(jìn)行設(shè)計(jì)。取而代之的是以較高層級(jí)的抽象捕獲設(shè)計(jì),然后使用邏輯綜合引擎生成相應(yīng)的門級(jí)等效設(shè)計(jì)。這說明上述第2點(diǎn)到第4點(diǎn)不再像以前那樣重要。
你可以爭(zhēng)辯說,第1點(diǎn)也是如此,但我不太同意。我的想法是,它類似于使用計(jì)算器進(jìn)行計(jì)算的概念。如果你有一個(gè)計(jì)算器,那你實(shí)際上就不需要知道如何對(duì)整數(shù)、實(shí)數(shù)和浮點(diǎn)數(shù)進(jìn)行加減乘除運(yùn)算,但是,如果你掌握了這類知識(shí),那么當(dāng)你計(jì)算器的電池沒電時(shí),它就可以派上用場(chǎng)。同樣,盡管你可能不需要每天處理布爾結(jié)構(gòu),但是在需要時(shí)知道如何處理就會(huì)非常方便。
思考問題
所以,下面是那個(gè)學(xué)生給我的。他首先說,老師向班級(jí)展示了以下方程式:
那個(gè)學(xué)生還告訴我,他已經(jīng)使用這個(gè)方程式生成了下面的真值表,但是從這時(shí)起,他遇到了麻煩而做不下去了。
好吧,我不得不告訴他,我對(duì)他遇到的問題一點(diǎn)都不感到驚訝,因?yàn)樵谒姆匠淌嚼镉辛鶄€(gè)乘積項(xiàng),每個(gè)乘積項(xiàng)在他的真值表的輸出列中都應(yīng)該有一個(gè)對(duì)應(yīng)的1,但是實(shí)際上,他的真值表的輸出列中只有五個(gè)1。
我對(duì)這個(gè)情況進(jìn)行了反復(fù)考慮,我認(rèn)為潛在的問題是他缺乏對(duì)基本原理的理解。還有一點(diǎn)是,如果有一個(gè)學(xué)生感到困惑,那么就很可能不止他一個(gè)人。最后但同樣重要的是,我記得我剛開始時(shí)有點(diǎn)困惑不解,所以我會(huì)花一點(diǎn)時(shí)間逐步解決這個(gè)問題(如果你感到無聊,請(qǐng)隨時(shí)跳過;或者,你也可以隨時(shí)試著發(fā)現(xiàn)我可能引入的任何故意的錯(cuò)誤,以便了解你是否有集中精力)。
我要做的第一件事就是在方程式中對(duì)乘積項(xiàng)進(jìn)行編號(hào),以便可以對(duì)我們所處的位置和所做的事進(jìn)行跟蹤(如果我們是來真的,那么就不必費(fèi)心對(duì)乘積項(xiàng)進(jìn)行編號(hào)):
下一步是創(chuàng)建真值表。可以從以標(biāo)準(zhǔn)二進(jìn)制數(shù)表示的所有輸入組合開始,如下面的(a)所示;然后將與六個(gè)乘積項(xiàng)相對(duì)應(yīng)的六個(gè)1加起來,如(b)到(g)所示;最后把任何剩余的輸出“位置”都填入0,如下面的(h)所示。
這里要注意的重點(diǎn)是,將方程式轉(zhuǎn)換為真值表確實(shí)一點(diǎn)也不困難。話雖如此,但無論誰這樣做,都必須了解這個(gè)過程背后的基本邏輯。再看一下這個(gè)方程式,其本質(zhì)可以這樣來表達(dá):“如果第一個(gè)乘積項(xiàng)(第一個(gè)與函數(shù))為真,則輸出為真(邏輯1),或者如果第二乘積項(xiàng)為真,則輸出為真,或者如果第三乘積項(xiàng)為真……)。這就是為什么可以在與每個(gè)乘積項(xiàng)相對(duì)應(yīng)的輸出列中簡(jiǎn)單地填寫1——如果這些乘積項(xiàng)中的任何一項(xiàng)為真,則輸出為真(1),否則輸出為假(0)。
下一步是創(chuàng)建卡諾圖。首先是創(chuàng)建網(wǎng)格本身。由于總共有三個(gè)輸入,因此可以使用兩種方法(方案)來做這一步,如下所示:
選擇使用哪種方案都沒有關(guān)系。這兩種情況下答案都是相同的(如果不是,那就確實(shí)有問題)。這里使用方案1,這種方法我比較喜歡。如果有任何學(xué)生正在閱讀本文,我建議你在這步完成后從此處開始,自己使用卡諾圖方案2進(jìn)行重做,以便確保你真正了解這個(gè)過程。
查看卡諾圖方案1,觀察“AB”所處的位置。右側(cè)是與AB輸入相關(guān)的0和1的四種組合:“00”、“01”、“11”和“10”。請(qǐng)務(wù)必注意,這四種組合是以格雷碼形式進(jìn)行排列,這樣就可以讓我們從一個(gè)值移到相鄰值時(shí),只會(huì)有一位發(fā)生變化。這是卡諾圖運(yùn)作的關(guān)鍵。
在二進(jìn)制代碼中,當(dāng)從01過渡到10時(shí),會(huì)有兩位發(fā)生變化。相比之下,如果查看格雷碼(01至11)中的相應(yīng)轉(zhuǎn)換,則只有一位發(fā)生變化。
此外,請(qǐng)注意二進(jìn)制代碼的最后一行。如果要從這一行轉(zhuǎn)而過渡到第一行(11到00),那么就會(huì)再次有兩位發(fā)生變化。但是,如果查看格雷碼中的相應(yīng)行(10到00),則會(huì)再次看到只有一位發(fā)生變化。
好了,現(xiàn)在來填充卡諾圖。這一步是向方程式中的乘積項(xiàng)所對(duì)應(yīng)的每個(gè)方框中填入1。這里再次按照下面的步驟逐步填寫(圓圈中的小數(shù)字1到6與初始方程式中的乘積項(xiàng)相對(duì)應(yīng)):
這里需要注意的另一點(diǎn)是,不需要真值表即可填充卡諾圖。這里要做的只是沿著方程式一項(xiàng)一項(xiàng)來,對(duì)每個(gè)乘積項(xiàng)在對(duì)應(yīng)的卡諾圖“方框”中填入1。
下一步是使用卡諾圖來化簡(jiǎn)邏輯表達(dá)式。從上面的最終卡諾圖(f)可以立即看出,可以將其簡(jiǎn)化為三個(gè)項(xiàng)。像往常一樣,我們一次一次地完成每一步。
觀察下圖中用紅色圈出的兩個(gè)1,我們知道,這兩種情況下的輸出均為1。對(duì)于這兩個(gè)框中的每個(gè)框都有A=0,C=1,因此這兩個(gè)值很重要。但是,這兩個(gè)框中有一個(gè)是B=0,另一個(gè)則是B=1。這就是說,只要A=0,C=1,那么我們就不在乎B是0還是1。
接下來看一下下圖中用紅色圈出的第二組兩個(gè)1。對(duì)于這兩個(gè)框中的每個(gè)框都有A=1,C=0,因此這兩個(gè)值很重要。但是,這兩個(gè)框中也是有一個(gè)是B=0,另一個(gè)是B=1。這就是說,只要A=1,C=0,那么我們就不在乎B是0還是1。
最后但同樣重要的是,下面來看一下下圖中用紅色圈出的一組四個(gè)1(卡諾圖的技巧之一是可以將相同的1用作多個(gè)組的一部分)。
在這種情況下,這四個(gè)框中有兩個(gè)框是A=0,另外兩個(gè)框則是A=1,這就是說我們不在乎A是0還是1。類似地,這四個(gè)框中有兩個(gè)框是C=0,另外兩個(gè)框是C=1,因此我們就不在乎C是0還是1。實(shí)際上,對(duì)于所有這四個(gè)框而言,唯一恒定的輸入是B,它始終為1。
這樣,就可以使用卡諾圖最簡(jiǎn)表達(dá)式來編寫優(yōu)化的乘積和方程,如下所示:
由此就可以使用非門、與門和或門輕松繪制相應(yīng)的門級(jí)原理圖,如下所示:
至此,我知道你會(huì)跟我說我們沒有使用!B信號(hào)(這里使用“!”字符來表示非B,因?yàn)樵谖谋纠镌谧帜干袭嬕粭l橫線有點(diǎn)難),但我們將在不久的將來使用它。說到這,未來比你想象的要近。這是我們必須考慮的重點(diǎn),因?yàn)槟俏涣钊擞憛挼睦蠋熕贾玫淖鳂I(yè)是只使用與非門或或非門來展示最終電路。
使用與非門或或非門實(shí)現(xiàn)非門
讓我們從容易的開始,先解決本例中的三個(gè)非門。首先我們先回憶一下,五種常見基本門的真值表如下所示:
也就是說,如果將與非門的輸入捆綁(連接)在一起,那么得到的功能就是非門。如果將或非門的輸入捆綁在一起,那么得到的結(jié)果也相同。也就是說,以下功能相同:
對(duì)與門、或門、與非門和或非門進(jìn)行德·摩根變換
奧古斯都·德·摩根(Augustus DeMorgan,1806至1871年)是喬治·布爾(George Boole)的同齡人。他在符號(hào)邏輯領(lǐng)域做出了重大貢獻(xiàn),尤其是我們現(xiàn)在在用的一組規(guī)則——德·摩根變換。
為了對(duì)布爾表達(dá)式進(jìn)行德·摩根變換,需要按以下步驟進(jìn)行:
1.將所有的與運(yùn)算符換成或運(yùn)算符,反之亦然。
2.將所有的輸入變量反轉(zhuǎn),也可將任何0換成1,反之亦然。
3.將整個(gè)函數(shù)反轉(zhuǎn)。
4.減少任何多次反轉(zhuǎn)。
一般而言,我們傾向于對(duì)多項(xiàng)式進(jìn)行德·摩根變換,但是也可以對(duì)單個(gè)門進(jìn)行變換,這樣就得到以下結(jié)論:
我不了解你,所以沒辦法解釋,但是在查看了上面的德·摩根變換后,我感覺很滿意,并且感覺在(邏輯)世界中一切都是對(duì)的。
只使用與非門來表示電路
老實(shí)說,現(xiàn)在我們已奠定了基礎(chǔ),這個(gè)部分非常容易。讓我們回憶下,使用非門、與門和或門實(shí)現(xiàn)的電路是什么樣的:
我對(duì)它們進(jìn)行了顏色編碼,以便讓我們清楚了解自己在做什么。下面就來做出決定,我們只希望使用與非門。因此,使用前面討論的所有內(nèi)容,就可以將非門、或門和與門換成與非門。
和往常一樣,我們一步步來做。首先從左邊用粉紅色表示的三個(gè)非門開始。我們知道,可以將這三個(gè)門中的每一個(gè)換成一個(gè)2輸入與非門(它們的輸入是捆綁在一起),所以這里沒有問題。
接下來來研究電路右側(cè)用綠色表示的3輸入或門。根據(jù)德·摩根變換,我們知道,可以用一個(gè)3輸入與非門(其輸入帶有非門)來代替它,如下所示。
當(dāng)然,可以將這三個(gè)非門中的每一個(gè)再次用一個(gè)2輸入與非門來替換,如下所示:
因此,現(xiàn)在只需要考慮電路中間兩個(gè)用藍(lán)色表示的與門了。當(dāng)然,德·摩根變換在這里幫不上忙,因?yàn)榕c門的等效電路是將或非門的所有輸入都加上非門,但這個(gè)作業(yè)不允許我們使用或非門。
有時(shí),我們傾向于使事情變得比所需要的更復(fù)雜。在這種情況下,要做的就是記住,與門實(shí)際上是由與非門后接一個(gè)非門形成的(同樣,或門是由或非門后接一個(gè)非門所組成)。也就是說,可以像下面這樣來替換與門:
當(dāng)然,由于作業(yè)要求只使用與非門,因此必須將非門替換成其等效的2輸入與非門,如下所示:
現(xiàn)在,萬事大吉了。因此,如果把上述所有變換結(jié)合起來,那么只使用與非門的實(shí)現(xiàn)就如下所示:
雖然上面的電路可以執(zhí)行所需的功能,但是這里有幾個(gè)門浪費(fèi)了,因?yàn)槿缦旅嬗眉t色框框出的部分所示,有兩個(gè)地方出現(xiàn)了非門接非門的情況(當(dāng)然都是用與非門來實(shí)現(xiàn)):
每當(dāng)以非函數(shù)形式出現(xiàn)偶數(shù)次反轉(zhuǎn)時(shí),都可以用一條簡(jiǎn)單的線來代替它們。因此,稍作修改就得到如下所示的最終電路:
如果非門、與非門和或非門分別等于一級(jí)延遲,與門和或門分別等于兩級(jí)延遲,那么在最初的非門、與門和或門電路實(shí)現(xiàn)中,最壞情況的輸入到輸出路徑就等于1+2+2=5級(jí)延遲。相比之下,經(jīng)過優(yōu)化的只使用與非門的實(shí)現(xiàn)則僅會(huì)發(fā)生最多1+1+1=3級(jí)延遲。
再說一次,如果有任何學(xué)生正在閱讀本文,只是為了確保你100%掌握以上所有內(nèi)容,建議你以以上討論為基礎(chǔ)創(chuàng)建只使用或非門的實(shí)現(xiàn)。在此期間,歡迎提出任何意見和問題,也希望能有更多有經(jīng)驗(yàn)的讀者愿意分享任何相關(guān)的提示與技巧。
編輯:hfy
-
NAND
+關(guān)注
關(guān)注
16文章
1692瀏覽量
136466 -
晶體管
+關(guān)注
關(guān)注
77文章
9746瀏覽量
138911 -
非門
+關(guān)注
關(guān)注
1文章
32瀏覽量
33961 -
CMOS電路
+關(guān)注
關(guān)注
0文章
49瀏覽量
11591
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論