# 台科數位邏輯設計筆記 進制轉換:https://www.footmark.info/introduction-to-computer/digital-system-conversion/ ![](https://i.imgur.com/drkmq5J.png) ![](https://i.imgur.com/6urfkux.png) ![](https://i.imgur.com/7s8DK4w.png) diminished radix complement => r-1補數 (進制-1)補數 radix complement => r的補數 1011000(2進制) 1的補數 -> 11111111 - 1011000 = 0100111 全部反相 r的補數 = r-1補數 + 1 補數再取一次補數就會回到原本的值 二進制轉2補數=>從右而左遇到第一個1,保留他,後面全部反相 例: 0101100 -> 1010100 ------------------------^------第一個1,保留,後面全部反相 1的補數加法如果有進位要加回來,2的補數加法如果有進位直接丟掉即可 不夠減(結果為負數) 做完補數加法後還要再取一次補數,並加上負號 ![](https://i.imgur.com/Mliz3ZT.png) 只有2補數沒有正0負0問題,且不用處理進位,2補數負的範圍較大 3bit有號2補數範圍:+7 ~ -8 => +2^n -1 ~ -2^n BCD的加法是每個digit(4bit)分開做的,如果加完大於10,就要加6 (10的2補數) 修正,進位要丟到下一個digit。 +3碼就是BCD每個digit +3 (0011) gray碼每2個連續數字間的bit變化都為1,適合用於計數 數位電路最耗電的時候是在狀態轉變時(0變1 1變0) gray code: ``` 0000 0001 0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000 ``` 觀察奇數項的下個數變化時,發現無論是第幾個奇數項Gray Code,下個數永遠只改變最右邊的位元。如果是1就改為0,如果是0就改為1。例如第一項0000變為0001,第三項0011變為0010,第五項0110變為 0111,依此類推。 觀察偶數項的下個數變化時,發現所改變的位元,是由右邊算來首個1的左邊位元。例如第二項0001下個數變為0011,第四項0010下個變為 0110,第六項0111變為0101,依此類推。 ascii code 大小寫互換 小寫-32變大寫 大寫+32變小寫,更好的解:將右邊數來第6個bit反相,就可換到另一邊 parity bits,用於檢測資料是否傳輸錯誤,會在最高位元補上1bit,使其成為偶數個1(even parity)或奇數個1(odd parity) even parity : 補最高位元,補成偶數個1 odd parity : 補最高位元,補成奇數個1 對偶律(duality ) : 等號2邊0變1,1變0,or變and,and變or https://medium.com/@invtsh/%E6%95%B8%E4%BD%8D%E9%82%8F%E8%BC%AF-%E5%B8%83%E6%9E%97%E4%BB%A3%E6%95%B8%E7%9A%84%E5%B0%8D%E5%81%B6%E5%8E%9F%E7%90%86-3eb92899bcd2 lteral:邏輯閘的輸入,不區分有無not gate term:多個literal輸入的邏輯閘 越少literal越少term越省錢 canonical forms(another form of truth table representation):每項具有所有literal(不區分有無not gate) minterm:把所有literal(input with complement(not閘)) and起來,相當於收集結果為1的狀況,適合表達少1較多的狀況,用m表示ex:`m0,m2,m3`,式子用Σ ex:`Σ(0,2,3)`,在卡諾圖裡,相當於是一格 例:`xy,x'y,xy',x'y'` maxterm:把所有literal(input with complement(not閘)) or起來,相當於收集結果為0的狀況,適合表達少1較少的狀況,用M表示ex:`M0,M2,M3`,式子用π ex:`π(0,2,3)` 例:`x+y,x'+y,x+y',x'+y'` ![](https://i.imgur.com/NOJD1Xs.png) ![](https://i.imgur.com/96sr3EG.png) sum of minterms:there are 2^n minterms and 2^(2^n) combinations of function with n boolean variables standard forms:每項不再具有所有literal而是可能被化減而消失 sum of products(SOP)又稱(AND-OR) : `F1 = y'+xy+x'yz'` products of sum(POS)又稱(OR-AND) : `F2 = x(y'+z)(x'+y+z')` ![](https://i.imgur.com/DHv5ryZ.png) multiple inputs: multiple nor = a complement of OR gate ,先用許多or擴充input,然後再not反相 multiple nand = a complement of NAND gate ,先用許多nand擴充input,然後再not反相 只用nand實現SOP ![](https://i.imgur.com/Z3FByAf.png) 推泡泡法(迪摩根) ![](https://i.imgur.com/2oWeOuh.png) ![](https://i.imgur.com/vwKt7Q5.png) postive logic:H = 1(高電位),L = 0(低電位) negtive logic:H = 0(低電位),L = 1(高電位) postive logic與negtive logic互換:or變and and變or 卡諾圖的00 01 11 10是使用葛雷碼(gray code) =>確保相鄰2格只有1bit不同,才能化簡 implicant = product term = 卡諾圖裡的每個圈,不一定要最簡 prime implicant(PI):卡諾圖可圈到最大包的implicant(最簡),一個boolean function可能有多個,因為圈法不同,但都是最簡的 essential prime implicant:有包住只被一個圈包住的格子(term)的圈圈,就稱為essential prime implicant,它是必須的,因為沒它,那個格子就沒人可包了 POS卡諾圖:用SOP的方式,但是要圈0(maxterm),圈完得出結果後整個加not(迪摩根) ![](https://i.imgur.com/GHTzKWJ.png) dont care:我們不在乎這個狀態是0或1,因此必要時可以調整01得到更佳解,式子用d ex`d(1,3,6)` 例:BCD code的10(1010) ~ 15(1111) ,他們是0是1,並不影響我們要的結果 nand 或 nor 可以組成所有邏輯閘,也可以實作出任何boolean function wired logic:輸出的2條線接一起,即可形成or或and(根據前面的邏輯閘決定),但這種電路不適用於CMOS(會燒掉),除了SOP(AO)、POS(OA)之外的另外2種就是以下的AOI與OAI ![](https://i.imgur.com/IIk1naw.png) ![](https://i.imgur.com/yG69OX1.png) ![](https://i.imgur.com/g05X4sc.png) AOI:(SOP)' SOP外層包一個not OAI:(POS)' POS外層包一個not | SOP | POS | AOI | OAI | | ----------- | ----------------------------- | ----------- | ----------------------------- | | 圈1化簡即可 | 圈0化簡後整個用迪摩根反相(complement) | 圈0化簡即可,式子最外層記得加反相(不要用迪摩根)| 圈1化簡後整個用迪摩根反相(complement),式子最外層記得加反相 | XOR:奇數個輸入為1,輸出就為1 XNOR:偶數個輸入為1,輸出就為1 用nand實現XOR:![](https://i.imgur.com/4QpSP99.png) XOR與XNOR的卡諾圖:![](https://i.imgur.com/2c7sVtk.png) 用XOR實現偶同位檢查(因為xor奇數為1,奇數+1變偶數),奇同位用XNOR(因為xnor偶數為1,偶數+1變奇數) ![](https://i.imgur.com/5v8dd4d.png) multi-level在電路設計上優於two-level,成本低面積小,但設計multi-level較困難且不直覺 半加器: ![](https://i.imgur.com/xexHWcg.png)![](https://i.imgur.com/AaFZcri.png) 全加器: ![](https://i.imgur.com/j4ycbD7.png) ![](https://i.imgur.com/iMqvDMJ.png) ![](https://i.imgur.com/WK3quYm.png) Binary (Ripple-Carry) Adder:漣波加法器,缺點是要等待前一級進位算完後才能算出這一級進位 ![](https://i.imgur.com/yVxcoIS.png) Carry Look-ahead Adder:前瞻進位加法器,進位不再是由前一級進位算出,而是用輸入的AB去做xor、and來產生P、G,進而透過強行展開,來直接算出進位。 ![](https://i.imgur.com/4LFhPd6.png) 使用Carry Look-ahead Adder時,因為整個邏輯都被展開了,所以其實不用再實作全加器了,直接用2個xor接到A、B、Ci就可得到sum ![](https://i.imgur.com/8Er1QYt.png) 減法其實與加法的概念相同,只是在正負號有所變動,因此在電路中做減法時,通常會避免額外再設計出減法器,而是傾向於用現有的加法器來完成減法,這樣的電路就必須使用前面提到的補數概念來完成。 下面的是2的補數加/減法器,M=0時加法,M=1時減法,使用xor來模擬可開啟或關閉的not閘,因為2的補數是1的補數(全部反相的B)+1,所以剛好就直接把M接到C0,就達到+1的效果 ![](https://i.imgur.com/5LMo6Ql.png) 要檢測有無overflow的方法就是對最後2個進位去做XOR,若為1則溢位,可以這樣做的原因其實是透過觀察後發現,會溢位的狀況只有正+正與負+負,然後正數溢位導致倒數第二個進位會是1,又因正數的有號數都是0,所以最後一個進位就是0,負+負也是相同概念,反正就有點像巧合的感覺吧? 上面的例子是有號數,如果是無號數,判斷有無溢位的方式就要改變,原本XOR接到的倒數第二進位要改為接到M(加/減開關)。 ![](https://i.imgur.com/sguVDcy.png) BCD加法器,如果超過9,就要+6修正,如何判斷大於9,透過觀察發現大於9的數只有以下3種可能 1. carry進位為1 2. 輸出為11×× 3. 輸出為1×1× ![](https://i.imgur.com/cx73lmE.png) 所以電路就去偵測這3種狀況,然後OR起來,結果送到專門處理+6的adder ![](https://i.imgur.com/QPfazS6.png) 乘法可以用and閘來完成,而多bit的乘法就可使用and後的結果去相加來得到結果,類似我們日常使用的直式加法 1bit乘法器: ![](https://i.imgur.com/VeyUvsW.png) 看起來很複雜的乘法器: ![](https://i.imgur.com/ku9zxfe.png) 比較器:會有三種情形: 1. \> 2. = 3. < 首先將A、B進行XNOR,可判斷該AB在該bit是否相同,然後也是用類似暴力展開的方法來得出式子 ![](https://i.imgur.com/xL4723Q.png) ![](https://i.imgur.com/OUhqQ0Z.png) decoder:簡單明瞭,其實就是minterm產生器,這是active high ![](https://i.imgur.com/s9m2W3Q.png) ![](https://i.imgur.com/thGq5bd.png) active low 就是active high再加上一個not閘即可 用decoder再加上OR閘,就可以組成SOP,但這不是一個好方法 enable:類似電路的總開關,運用到controlling value的概念,簡單來說就是有某個值可以使邏輯閘輸出固定,像or、nor就是1,and、nand就是0,xor、xnor則沒有controlling value disable後,所有輸出狀態都為active的反相(not active) 有了enable後,就可以再擴充更多輸入輸出,例: ![](https://i.imgur.com/qO1CG6E.png) 還可以再更多,只需在前面加上另一個decoder: ![](https://i.imgur.com/FlKkbFd.png) encoder:以下的不是真值表,因為並沒有把所有輸入狀態都考慮進去 ![](https://i.imgur.com/byyhlel.png) 有瑕疵的encoder: ![](https://i.imgur.com/poScnoc.png) 這樣的電路僅限於輸入只有一個為1的情形,但只要超過一個為1,輸出就不是我們預期看到的,因此encoder視必做出修正,來使其合理 Priority Encoder:每個輸入都有優先順序,輸出就不會陷入混淆狀態 ![](https://i.imgur.com/EaXCrts.png) 上圖中,優先權由大而小為:D3 D2 D1 D0,要注意的是輸入的dont care與輸出的dont care是不同的東西 * 輸入的dont care:會展開成所有可能的狀況 ex: x100 -> 0100,1100 * 輸出的dont care:這個狀態下,輸出可以是0或1 ![](https://i.imgur.com/sLDSJfC.png) Multiplexers:多對1,可視為資料選擇器,輸出是其中一條輸入,透過選擇線來選 ![](https://i.imgur.com/xN6yOE0.png) ![](https://i.imgur.com/VwgyX5p.png) Multiplexer的select線接到的其實是一個decoder,所以多工器是由decoder與許多輸出組成的,詳細如下: 2^n-to-1 multiplexer: * n-to-2n decoder * Add the 2n input lines to each AND gate * OR (all AND gates) * n selection lines * An enable input (optional) 多工器可以組成n個input的boolean function,只需把輸入接到選擇線即可,而且甚至不需要n to 1也能組成,要注意的是,選擇線放高的位元,不接選擇線的低位元input要透過計算(卡諾圖),得出每個多工器輸入與input的關係,例:得出每個多工器輸入與z的關係 ![](https://i.imgur.com/M6u5C0L.png) 4-to-1 MUX實現4 input例子: ![](https://i.imgur.com/pNBMHGX.png) Three-state (Tri-state) Gates:三態閘,三種狀態:0、1、高阻抗(斷路),用這種閘可以大幅度減少電晶體使用量,Z為高阻抗 ![](https://i.imgur.com/AP4RAU8.png) 實現多工器: ![](https://i.imgur.com/Q6MBg25.png) Demultiplexe:解多工器,其實就是具有enable腳位的decoder,然後把enable當成輸入,decoder的AB當成選擇線,可視為資料分配器 ![](https://i.imgur.com/OfjiyTr.png) ![](https://i.imgur.com/8BR1AdZ.png) 期中考古題: ![](https://i.imgur.com/XVpr5Un.png) ![](https://i.imgur.com/21hkHLR.jpg) 補充: 卡諾圖化簡線上工具:http://www.32x8.com/index.html