--- tags: 必修們 --- # 數位系統 :::spoiler 傳送門 [TOC] ::: :::info Exercise: Problem 2.2 Problem 2.3 Problem 2.4 Problem 2.17 Problem 2.19 Problem 2.22 Honework: Problem 1.5,1.16,1.33 Problem 2.2,2.22 Problem 3.5(a)(b),3.9(a)(b),3.13(a),3.19(a) ::: ## Intro - 數位系統流程圖 ![](https://i.imgur.com/397yt06.png) - 數位與類比訊號 ![](https://i.imgur.com/1FtgdbQ.png) ## Complement - 十進制小數轉換 ![](https://i.imgur.com/FbCsFKQ.png) - 補數 - **r補數為 r-1補數+1** ex:95621的9補數為4378,10補數為4379 - M-N補數算法 - **STEP1.取N的r補數** - **STEP2.將M加上N的r補數,如果多出一個進位,表示M>=N,去掉最大的位數即為結果** - **STEP3.沒有多出進位,表示M<N,將結果扣掉$r^n$即為結果** - 這麼做可以用加法取代減法 - 二進制正負數表示方式 ![](https://i.imgur.com/ZzuRbxv.png) - **對一個負數取2補數,就會出現他的大小** ex:1001 -> 0111 -> -7 , 1000 -> 1000 -> -8 - 二進制M-N算法 - **記得正數要在前面補零** ![](https://i.imgur.com/lAYnPwl.png) - 補數的缺點:overflow - overflow rule:兩個正數相加變成負數,兩個負數相加變成正數,正負數相加不會產生overflow ## 編碼們 ### BCD code **10~15是用不到的** - 185的BCD碼 ->0001 1000 0101 ![](https://i.imgur.com/NcM2vjv.png =300x) - BCD加法 - 相加後多大於1001,就再加上6(0110),便可順利進位 ![](https://i.imgur.com/fDMcqh5.png) ### Gray code - 每次加1只會有一個位數不一樣->適合當計數器 ![](https://i.imgur.com/3WiP7Nl.png) - 編碼規則 **基本概念:鏡射,上半部補零,下半部補一** ![](https://i.imgur.com/F62NfzL.png) ### ASCII code - **實際上只會用到右邊七位,最左的那位是用來偵錯用的** 偵錯方式:利用偶同位,只要變成奇同位就是有產生位元錯誤。 ![](https://i.imgur.com/gq8qtFF.png) ## Binary logic - 三種基本邏輯運算 ![](https://i.imgur.com/Iviefjw.png) ![](https://i.imgur.com/Mtuwnxg.png) ## Error Detection and Correction - **Distance: 有幾個位元不一樣** 相鄰的只會有一個位元不同 ![](https://i.imgur.com/tR5TGoz.png) - 偵測錯誤的代價: 需要多用**一個位元**變成偶同位或是奇同位 - 修正錯誤的條件: **只有一個位元發生錯誤且距離要大於等於三才可以修正** ![](https://i.imgur.com/lBImzau.png) - Hamming codes **m位個同位位元,可以編出$2^m-1$長度的Hamming code,其中有$2^m-1-m$個位元可以存資料** - 假設有3個同位位元,便可以產生長度為7個code,可以存放4個位元的資料,往右邊數$第2^0,2^1,2^2個$位元會是同位位元 - 選擇$2^0,2^1,2^2$當同位位元,是因為這三個數字可以組合成$(2^3-1)$以內的所有數字 - 使用方法: 將每個同位位元和對應的資料位元檢查是否偶同位,將發生奇同位的位置加起來就是發生錯誤的位數 若每個同位位元1,2,4都和對應的資料位元發生奇同位,那就是第1+2+4個位元發生錯誤。 ![](https://i.imgur.com/RzhGZzZ.png) ## Chap. 2 Boolean Algebra and Logic Gates ### Basic Theorems & Properties - 分配率 列出所有可能性(真值表),即可證明OR Gate & AND Gate皆==存在分配率== ![](https://i.imgur.com/i2dyOVz.png) - 定理們(考試會給) ![](https://i.imgur.com/wFyTPbO.png) **用Postulate證明$x+x = x$** \begin{split} x+x &= (x+x)\cdot 1\\ &= (x+x)(x+x')\\ &= x+x\cdot x'\\ &= x+0\\ &= x \end{split} **證明吸收律** \begin{split} x + xy &= x1 + xy\\ &=x(1+y)\\ &=x1\\ &=x\\ &\end{split} - 迪摩根 - not(a and b) = not a or not b - not( a or b) = not a and not b ### Boolean Function 不同的Boolean Function可能會有相同的結果(可化簡) - 運算優先權 1. 括號 2. NOT 3. AND 4. OR ### Algebraic Manipulation - 定義最小化Boolean expression - 變數數量越少越好 - OR|AND Gate 越少越好 **e.g.** 利用定理靠經驗化簡,以下確實有化簡,==但不保證最簡==(詳情請見第三章內容補充包) - $x(x'+y)=xx'+xy=0+xy=xy$ - $x+x'y=(x+x')(x+y)=1(x+y)=x+y$ 利用吸收率,生出==臨時變數==化簡 ![](https://i.imgur.com/PzpQNdM.png) Distance只有一個的時候,可以==藉由結合率減少變數== - $x'y'z+x'yz=x'z(y'+y)=x'z$ 利用吸收率,生出一個與原本的項距離差一的新元素,再行化簡 ![](https://i.imgur.com/HOQbMwB.png) ### Complement of a Function - 三變數的DeMorgan \begin{split} (A+B+C)' &= (A+X)'\\ &= A'X'\\ &= A'(B+C)'\\ &= A'B'C' \end{split} - N變數:規則一樣 刮號裡分開,AND, OR互換 ![](https://i.imgur.com/vmpaAvt.png) - 參考算法 ![](https://i.imgur.com/qIHyISw.png) ### Canonical and Standard Forms - minterm & maxterm(Canonical form) - minterm : 所有 term 皆為 AND gate (standard product) - maxterm : 所有 term 皆為 OR gate (standard sum) - 上述兩者皆有$2^n$種狀況(每個變數都有 primed 或 unprimed 兩種) - [Extra Reading](https://www.allaboutcircuits.com/textbook/digital/chpt-8/minterm-maxterm-solution/) - minterm 例子![](https://i.imgur.com/hST5zvW.png) - maxterm 例子![](https://i.imgur.com/02sgFxq.png) - 順序(照二進制排),minterm 零對應有 prime 一對應沒有 prime , maxterm 則是與 minterm 相反 ![](https://i.imgur.com/5VLStCu.png) **e.g.** - $f_1 = x'+y'+xyz=m_1+m_4+m_7$ - $f_2 = x'yz+xy'z+xyz'+xyz=m_3+m_5+m_6+m_7$ ![](https://i.imgur.com/2vatkKv.png) - 任何Boolean function都可以表示成maxterm或是minterm且**表示方法唯一** - 將minterm轉換為maxterm ![](https://i.imgur.com/eJ9EqaM.png) - 一個一個代太遜了,直接用公理及定理生出來 - 作法一: 缺甚麼就就補甚麼(利用$(x+x')=1$) ![](https://i.imgur.com/ttw4g2z.png) - 作法二(較簡單的方法): **Solve: $F = x+y'z$** 1. 分成 $x$ 及 $y'z$前後兩項 2. 先看$x$,$x$沒有prime,所以鎖定x值為1,把剩下的y,z所有狀況填上去,產生100,101,110,111。 3. $y'z$也用一樣的方式,鎖定y值為0,z值為1,產生101,001。 4. 將上面產生的做聯集,得到答案。 - Product of maxterms 可以將Sum of minterms反轉得到,也可以利用$(xx')=0$得到 ![](https://i.imgur.com/A01sDqw.png) - 真值表和Canonical表可以互相轉換 **e.g.** ![](https://i.imgur.com/aMg0fdj.png) $F(A,B,C) = \Sigma(1,4,5,6,7)$ $F'(A,B,C) = \Sigma(0,2,3)$ 根據DeMorgan(minterm為maxterm補集): $F(A,B,C) = \Pi(0,2,3)$ ### Standard Form 形式為下列兩種 1. 積項的和 $F_1=y'+xy+x'yz'$ 2. 和項的積 $F_1=x(y'+z)(x'+y+z)$ ### Other Logic Operations - n個變數可以產生$2^n$種結果($2^n$rows in the truth table) - n個變數可以有$2^{2^n}$種邏輯運算(functions) - $F_0$為$F_{15}$反相,$F_1$為$F_{14}$反相,以此類推 - 特別介紹XOR,Equivalence - XOR: 相同為0,不同為1 - Equivalence: 相同為1,不同為0 ![](https://i.imgur.com/1nxWlwI.png) ### Digital Logic gates - **NAND及NOR並不具有結合率** ![](https://i.imgur.com/0FFwvYm.png) - NAND可以利用積項的和化簡省電晶體,NOR則是利用和項的積 - N輸入的XOR GATE,奇數個1會輸出1,偶數個1則會輸出0(可以連結到之前的漢明碼處理) - 各種Gate ![](https://i.imgur.com/AnhfLuR.png) ![](https://i.imgur.com/jAx2TX8.png) ### Gate Implementations(死人電子學) - 先有NOR,NAND才有OR,AND - NOR,NAND共有四個電晶體,OR,AND則是再加上invert的兩個電晶體,共六個電晶體 ## Chap. 3 Gate-Level Minimization ### Map method - 兩變數的Karnaugh圖,distance都是相差1 >相鄰的1開始合併,只下值相等的變數 ![](https://i.imgur.com/oAzdr0I.png) ![](https://i.imgur.com/5KekNDq.png) ### Three-variable Map - 三變數的Karnaugh圖 >為了保持相鄰距離為1,順序採用Gray code ![](https://i.imgur.com/xV6QWkj.png) ![](https://i.imgur.com/CqomZ1q.png) **Example:** ![](https://i.imgur.com/cFkrXAt.png) - 在兩端也算相鄰,因此也可以化簡 ![](https://i.imgur.com/lfg5pKp.png) - 試著找到可以合併最多次的方法,這樣才是最簡 ![](https://i.imgur.com/V3A0wxR.png) - 面積為2,4,8的長方形可以合併在一起,4可以砍掉兩個變數,8則可以砍掉三個變數 ![](https://i.imgur.com/ts6r0Bn.png) - 重疊的話也可以重複使用 ![](https://i.imgur.com/oCEBbmt.png) ### Four-variable Map - 找2,4,8,16個1相鄰(只能為長方形,從16個1開始找),2個1相鄰可消掉1個變數,4個則是消掉2個變數,以此類推 ![](https://i.imgur.com/yW0zncc.png) **Example:** - 尋找順序:16個1相鄰->8個1相鄰->4個1相鄰->2個1相鄰 ![](https://i.imgur.com/tkO4I5d.png) - **四個角落皆為1也算是4個1相鄰** ![](https://i.imgur.com/m6D5Wbz.png) - Prime Implicants >定義: 這個長方形框框沒有被更大的長方形包圍住 - Essential >定義: 長方形(必須要是prime Implicant)包圍住的所有1中,有其中一個1只有被這個長方形框住(若沒有這個長方形框框就沒辦法cover全部的1) - Karnaugh圖簡化並不一定是唯一的,怎麼選擇最後非Essential的框框來cover住剩下的1,會決定最後出現的答案(但都是對的) ![](https://i.imgur.com/WNNIqsg.png) ### Five-variable Map - 用兩個4變數的圖去組成5變數的圖 >兩個圖中同位置的相鄰(例如7和23相鄰,3和19相鄰,兩個編號都會差16),其他就和四變數的圖相同 ![](https://i.imgur.com/DpPiHQp.png) **Example:** ![](https://i.imgur.com/sWhhxAW.png) ### Six-variable Map - 四個4變數的圖組成6變數的圖 >太噁心了,這不會考XD - 每個位置都有6個位置和它相鄰(10和2,8,11,14,26,40相鄰) ![](https://i.imgur.com/TFHQjWn.png) ## Product of Sums Simplification - 利用Karnaugh圖來找和項的積 >方法很簡單,直接拿圖上的0來化簡(DeMorgan's theorem) ![](https://i.imgur.com/6j07Sfb.png) ## Don't-Care Conditions ![](https://i.imgur.com/M2eXNdA.png) - 有時候會有可以填1也可以填0的狀況,這時候就填入可以幫助畫簡的數值 ![](https://i.imgur.com/EryV6Iu.png) ### 速記表 : 2 level 的計算過程們 | 2 level | 計算過程 | |:-------:|:-----------------------------------------------------:| | SOP | 框 1,化簡 | | OAI | 框 1,化簡,再整個取 complement,最後最外面括號加 not | | POS | 框 0,化簡,再整個取 complement | | AOI | 框 0,化簡,最後最外面括號加 not (不要用迪摩根) | ## Chap. 4 Combinational Logic ### 概念 - 電路都是從起點直接流到終點,不會有feedback的狀況,也可以用karnaugh map化簡 - Sequential circuits 有==回饋==的資訊 ![](https://i.imgur.com/63eyr6L.png) ![](https://i.imgur.com/JEZRLT5.png) 單個最簡,合起來不一定是最簡 1. 多利用 de morgan 換成 NOR / NAND 2. 重複利用中途的計算解果 ![](https://i.imgur.com/lsFonHO.png) ### BCD TO EXCESS-3 >因為是BCD,所以會有Don't care condition ![](https://i.imgur.com/q1YzLCt.png) ![](https://i.imgur.com/UyNxB9O.png) >化簡後會碰到一個問題,每個輸出都是最簡,但是組合後不保證為最簡,因此還需要改變一下化簡的結果,找出各個輸出的共通點(需要的電晶體較少但Delay會比較長) ![](https://i.imgur.com/bYyW2D8.png) ### Adder-Substractor - Half adder - ==only== single bit add - S = x ⊕ y - C = x and y ![](https://i.imgur.com/84mHyib.png) ![](https://i.imgur.com/tvsT4cU.png) - Full adder - ==multi== bits add - S = x ⊕ y ⊕ z - C = xy and yz and xz >若產生(棋盤格狀)錯開的Karnaugh map,此種狀況無法化簡,直接用sum of product會用到太多電晶體, >因此考慮xor or xnor,在最左上角的位置是1的話為exclusive-nor,反則exclusive-or ![](https://i.imgur.com/Pja3HK8.png) >x xor y的結果也可以給C做使用 ![](https://i.imgur.com/q2T5Uj5.png) - 可能碰到的問題 >如果使用 ripple carry adder 來設計全加器,delay時間會隨著位元數而增加,因為要等前面算完 ![](https://i.imgur.com/8OIPhU8.png) - 解決方案:look ahead adder,直接用 2n bit 的 input 組合算出 n bit 的結果(快,但很肥) ### Carry-look Ahead Adder - carry propagate: $P_i=A_i \oplus B_i$ - carry generate: $G_i=A_iB_i$ - sum : $P_i \oplus C_i$ - carry : $C_{i+1}=G_i+P_iC_i$(A,B都是1或是AB其中有一個1且carry為1的時候會進位) ![](https://i.imgur.com/av7Ffuk.png) ![](https://i.imgur.com/ZlGtNfL.png) ### Subtractor >A-B其實就是A再加上B的2補數 實作上要新增一個減法 flag as M,在其中一組 input 之前加 xor(B ⊕ M),然後 assign $C_0$ = M(+1的動作),簡單來說,M=1會做減法,反之則做加法 ![](https://i.imgur.com/aCjWSDl.png) - 可能遇到的問題 - overflow >經過觀察,發現4位元減法器$C_3,C_4$不相同時,會overflow ![](https://i.imgur.com/o4aDBPR.png) - detect n bit oveflow : $C_{n-1} \oplus C_{n}$ ### Decinal Adder >把兩個BCD碼加在一起 - 若要把兩個4bit的BCD加在一起,你會需要9個input、5個output,這樣幾乎不可能化簡,因此就直接用上面的binary Adder,再轉回BCD(大於等於10的直接加6) - 大於等於10的狀況:$K + Z_8Z_4 + Z_8Z_2$ ![](https://i.imgur.com/2qQCTkv.png) ![](https://i.imgur.com/ZvZhvay.png) ### Binary Multiplier >先利用AND gate產生部分乘積,再將這些數字加總 - AND閘及半加器即可實作2 bits * 2 bits乘法器 ![](https://i.imgur.com/jMORuqx.png) - m bits* n bits會需要m+n個bit輸出,n-1個加法器,每個加法器為m-bit adder,下圖為4 bits* 3 bits乘法器 ![](https://i.imgur.com/hxjZ897.png) ### Magnitude Comparator >輸入很多,沒辦法Karnaugh map化簡 - 從最左邊的bit開始比,一樣的話就比下一個bit **先對A和B的每個bit做xnor**,接著做下圖的操作 ![](https://i.imgur.com/Nkym3sW.png)