# 數位邏輯 ## Chapter 1 數位系統與二進位碼 ### 數字基底轉換 1. 數字 / 基底 = 商 + 餘數 2. 餘數為轉換之位數,從最高位開始 3. 再將商 / 基底 = 新商 + 新餘數,重複至結束 ### 補數 #### - ( r - 1 )補數 - N的 ( r - 1 )補數 = ( 基底r^位元數n^ - 1 ) - N #### - r補數 - N的r補數 = 基底r^位元數n - N = ( ( 基底r^位元數n^ - 1 ) - N ) + 1 #### - 補數減法 - M - N = M + ( r^n^ - N ) = M - N + r^n^ - if M >= N,產生末端進位r^n^,去掉剩M - N => M + N的r補數,去除進位 - if M < N,不產生末端進位,得r^n^ - (N - M) = N - M => ( M + N的r補數 )的r補數,加負號 - 若改用( r - 1 )補數做:有末端進位時加1 ### 二進位有號數 - 最高位數表正負,0為正,1為負 - 負數 = 正數的補數 + 最高位數為1 #### - 加法 - 符號相同 => 相加 - 符號不同 => 大減小,再補上與最大數相同之符號 ### BCD碼(Binary-Coded_Decimal) - 各位0~9皆一致,若>9,+6修正 - ![](https://i.imgur.com/oswgHJR.jpg) - ![](https://i.imgur.com/t5SqnWC.jpg) ### 葛雷碼 - 反射二進碼 - ![](https://i.imgur.com/9H3pH2z.jpg) - 葛雷碼0~9 ![](https://i.imgur.com/YG1knYN.jpg) ### ASCII - 0 = 0x30,9 = 0x39 - A = 0x41,Z = 0x5A - a = 0x61,z = 0x7A - 同位位元:在最前面加上第8碼,形成奇或偶同位。 ## Chapter 2 布林代數 ### 布林代數公理定理 - +和 * 具有封閉性 - +的單位元素 0 ``` x + 0 = 0 + x = x ``` - *的單位元素 1 ``` x * 1 = 1 * x = x ``` - +和 * 具有交換律 ``` x + y = y + x x * y = y * x ``` - +和 * 具有分配律 ``` x * ( y + z ) = xy + xz x + ( y * z ) = (x + y)(x + z) ``` - 補數 ``` x + x' = 1 x * x' = 0 ``` ### 布林代數基本性質 - 對偶性:布林運算式中AND <=> OR,0<=>1。 ``` x + 0 = x <=> x * 1 = x ``` - 迪摩根定理 ``` (x + y)' = x'y' (xy)' = x' + y' ``` - 運算子優先順序:括號 -> NOT -> AND -> OR。 ### 布林函數 - n個變數 => 表值表有2^n^列,2^2n^個函數。 - 全及項(標準積):由AND項組成,對應真值表的1。 - 全或項(標準和):由OR項組成,對應真值表的0。 ``` 0 0 1 10 0 111 F(x, y, z) = x'y'z + xy'z' + xyz = m1 + m4 + m7 = Σ(1, 4, 7) = Π(0, 2, 3, 5, 6) 1 0 0 0 1 0 0 0 1 F(x, y, z) = (x + y' + z')(x' + y + z')(x' + y' + z) = M1 * M2 * M3 = Π(1, 2, 3) = Σ(0, 4, 5, 6, 7) ``` - 任何函數都能用正規形式表示:全及項之和(SOP)、全或項之積(POS)。 - SOP <=> POS:列出缺少的項即可。 ## Chapter 3 邏輯閘層次最小化 ### 卡諾圖 - 圈1、2、4、8或16個 - 圈越大越好、越少越好 - 可以重複圈 - 不理會條件也能一起圈 - 看1化簡成SOP; 看0化簡成POS ### NAND - 將函數化為積項和,用1化簡 - AND = NAND + NOT - NOT + OR = NAND - ![](https://i.imgur.com/V2zPjko.jpg) ### NOR - 將函數化為和項積,用0化簡 - OR = NOR + NOT - NOT + AND = NOR - ![](https://i.imgur.com/f44xFPT.jpg) ### 線節邏輯 #### - 開集極TTL NAND -> AND-OR-INVERT(AOI) - 看0化簡,找F' - ![](https://i.imgur.com/bQPtngd.jpg) #### - ECL NOR -> OR-AND-INVERT(OAI) - 看1化簡,找F' - ![](https://i.imgur.com/qDGfex8.jpg) ### XOR ⊕ - x ⊕ y = xy' + x'y - XNOR = ( x ⊕ y )' ``` (x⊕y') = (x'⊕y) = (x ⊕ y)' ``` - 交換性 ``` A ⊕ B = B ⊕ A ``` - 結合性 ``` (A ⊕ B) ⊕ C = A ⊕ (B ⊕ C) = A ⊕ B ⊕ C ``` - ![](https://i.imgur.com/ryCSmIV.jpg) ### 同位產生器與檢查 - 偶同位位元 P = x ⊕ y ⊕ z - 同位檢查器 C = x ⊕ y ⊕ z ⊕ P。輸出1,資料有誤;輸出0,資料無誤或偶數個誤。 ## Chapter 4 組合電路 ### 分析步驟 1. 確認其不是序向電路(有儲存元件) 2. 求其布林函數或列出真值表 3. 設計驗證 ### 設計步驟 1. 決定輸入、輸出個數和變數符號 2. 列出真值表,用卡諾圖化簡布林函數 3. 畫出邏輯圖,並驗證 ### 二進位加法器 #### - 半加器 - 兩個變數輸入,處理兩位數 - 兩個輸出C(進位)、S(和) - ![](https://i.imgur.com/giejayB.jpg) - ![](https://i.imgur.com/OmmYXhD.jpg) #### - 全加器 - 三個變數輸入,處理三位數 - 兩個輸出C(進位)、S(和) - ![](https://i.imgur.com/9hyA5wp.jpg) - ![](https://i.imgur.com/E9nPVfn.jpg) ### 二進位減法器 - A - B = A + (B的2補數) = A + B' + 1 #### - 溢位 V - 保存數字位元數有限 - 正數相加得負數;負數相加得正數 - V = 0,無溢位;V = 1,溢位 - ![](https://i.imgur.com/JdvPJ5b.jpg) ### 十進位加法器 - 9輸入,兩四位BCD數,一進位 - 5輸出,一四位BCD數,一進位 - ![](https://i.imgur.com/XSkmdc6.jpg) - 和 <= 9(BCD) + 9(BCD) + 1(進位) = 19 - 有進位,二進位碼轉BCD碼調整:+6,或C = K + Z~8~Z~4~ + Z~8~Z~2~ - ![](https://i.imgur.com/ZJGQOeI.jpg) ### 二進位乘法器 - 用AND和HA(半加器)運算 - ![](https://i.imgur.com/9y4VIk6.jpg) - ![](https://i.imgur.com/mzAwdvk.jpg) - 四位元 X 三位元 ![](https://i.imgur.com/vLz6uO2.jpg) ### 大小比較器 - 輸出:A > B、A < B、A = B - x~i~ = A~i~ XNOR B~i~ - ![](https://i.imgur.com/A0zyNeR.jpg) - 四位元大小比較器 ![](https://i.imgur.com/SSHyt3o.jpg) ### 解碼器 - n個輸入 => 2^n^條輸出線,每個輸出組合只有一個1,其他皆為0 - 致能Enable:似開關,E = 1,輸入不理會,輸出皆為1 - ![](https://i.imgur.com/z45goz7.jpg) ## --------------------期中上--------------期末下-------------------- ### 編碼器 - 解碼器反向操作 - 輸出結果能推斷輸入 - ![](https://hackmd.io/_uploads/BkWQq1WI2.jpg) #### 優先權編碼器 - 多V(valid)輸出,解決非法輸入 - 非法輸入變為Don't care幫助化簡 - Don't care -> D~3~有最高優先 - ![](https://hackmd.io/_uploads/SksIq1ZLh.jpg) ### 多工器 - 二進位選擇輸入指向單一輸出 - ![](https://hackmd.io/_uploads/HJzuqk-In.jpg) #### 解多工器 - 負責分配,似HUB - 二進位選擇輸入指向多個輸出之一 - ![](https://hackmd.io/_uploads/Skfo5JWI3.jpg) #### 解布林代數 1. 列真值表,輸入配在選擇輸入,留下最後一個 2. 觀察留下的輸入和輸出的關係 3. 留下的輸入配上輸入 - ![](https://hackmd.io/_uploads/BJia9yZ82.jpg) ### 三態閘 - 0, 1 和高阻抗(Z):電流無法進出 - 使用緩衝器 buffer - 用在Bus上,無使用元件在高阻抗狀態 - ![](https://hackmd.io/_uploads/r1sxsJZ8n.jpg) ### 三態閘做多工器 - ![](https://hackmd.io/_uploads/B1C7syWI3.jpg) ### 各種三態閘 - ![](https://hackmd.io/_uploads/S1HUiyWL2.jpg) ## Chapter 5 同步序向邏輯 ### 序向邏輯 - 包含儲存元件,和騎回授路徑 - 輸入 + 目前狀態 -> 輸出 + 次一狀態 - ![](https://hackmd.io/_uploads/HJsOikZU2.jpg) - 時脈:決定儲存速度 ### 儲存元件 - 記憶一位元,0 or 1,準位觸發 - 有設置、重置、維持功能 #### SR-LATCH 1. NOR - R = 1重置,S = 1設置,S = R = 0維持 - S = R = 1禁止,呈不穩定狀態 - ![](https://hackmd.io/_uploads/HJ7poy-83.jpg) 2. NAND - R = 0重置,S = 0設置,S = R = 1維持 - S = R = 0禁止,呈不穩定狀態 - ![](https://hackmd.io/_uploads/rk9Jn1bI3.jpg) #### 具Enable的SR-LATCH - E = 0關閉,E = 1啟動 - R = 1重置,S = 1設置,S = R = 0維持 - S = R = 1禁止,呈不穩定狀態 - ![](https://hackmd.io/_uploads/SyBhnkb8h.jpg) #### D型LATCH - 能排除不穩定狀態 - D = 0重置,D = 1設置 - ![](https://hackmd.io/_uploads/BJamnyWL3.jpg) ### 正反器 - 儲存元件搭配時脈,邊緣觸發 #### 邊緣觸發D型正反 - 由兩個LATCH組成,分為主(正緣)、僕(負緣) - Q(t+1)次態 = D - 最經濟、有效率 - 正緣(0->1)、負緣(1->0)觸發皆可 - ![](https://hackmd.io/_uploads/SJvA2J-Lh.jpg) #### JK正反器 - Q(t + 1) = JQ'(t) + K'Q(t) - | J | K | **Q(t+1)** | |:--|:-:|------:| | 0 | 0 | **Q(t)**| | 0 | 1 | **0** | | 1 | 0 | **1** | | 1 | 1 |**Q'(t)**| - ![](https://hackmd.io/_uploads/S1C3FJ-In.jpg) #### T型正反器 (Toggle) - D = T ⊕ Q = TQ' + T'Q - | **T** | Q(t + 1) | |:------|---------:| | **0** | Q(t) | | **1** | Q'(t) | - ![](https://hackmd.io/_uploads/SyKAKkZI2.jpg) ### 直接輸入 - Resret功能的強制性 - ![](https://hackmd.io/_uploads/rJsbMqy8h.jpg) ### 時序分析 1. 列出正反器輸入輸出(D = Q) - ![](https://hackmd.io/_uploads/HJh-L5k82.jpg) 2. 用輸入輸出配合正反器找出布林函數 ``` A(t+1) = Ax + Bx B(t+1) = A'x y = Ax' + Bx' ``` 3. 列狀態表,目前狀態、次態、輸出 - ![](https://hackmd.io/_uploads/r1s6UqkI2.jpg) 4. 畫狀態圖 - ![](https://hackmd.io/_uploads/S16VDc1Lh.jpg) - 圓圈:狀態 - 連接射線:狀態彼此的轉換,以輸入/輸出標示(0/1) ### 有限狀態機 #### 密利模型 Mealy Machine - 輸入、正反器共同組成輸出,Clock改變便正反器內容 - 輸出與狀態、輸入有關 - 較難設計,但狀態較少 - ![](https://hackmd.io/_uploads/SJgD_ckIh.jpg) #### 莫爾模型 Moore Machine - 暫存器決定輸出 - 輸出與狀態有關 - ![](https://hackmd.io/_uploads/H1OPdckI3.jpg) ### 設計程序 1. 畫狀態圖,指定狀態binary 2. 列狀態表 3. 選擇正反器 4. 簡化 ## Chapter 6 暫存器與計數器 ### 暫存器 - 一群正反器 - 串列轉移:從原來暫存器移至下一個 - 並列轉移:相同時間轉移暫存器的全部資料 ### 移位暫存器 - 製造延遲:一個暫存器延遲一個Clk - 環形暫存器:似解碼器的功能 - 圖 - 單向移位暫存器:左移或右移 - 雙向移位暫存器:左移和右移 #### 通用移位暫存器 - 清除功能 - 左移右移控制 - 並列載入 - 維持資料不變 - ![](https://hackmd.io/_uploads/B1zQ8ixUh.jpg) - ![](https://hackmd.io/_uploads/S14TUseU2.jpg) ### 計數器 - 根據時脈,行經規定狀態順序 #### 漣波計數器 - 正反器輸出為下個的時脈 - 時脈為上一個的k/2 - 可做上(負緣)、下(正緣)數計數器 - ![](https://hackmd.io/_uploads/Hy2WqsxLn.jpg) - ![](https://hackmd.io/_uploads/B1mGcjgU2.jpg) ##### BCD計數器 - 用AND閘,在1010(10)reset - ![](https://hackmd.io/_uploads/rJh9hjgL3.jpg) ##### 多位元BCD計數 - 負緣觸發(最高位在1 -> 0時) - ![](https://hackmd.io/_uploads/ByA23ilU2.jpg) #### 同步計數器 - 所有正反器接受相同時脈 - 正反器輸入另行設計 ##### BCD計數器 - ![](https://hackmd.io/_uploads/Syi5GJbI2.jpg) ##### 任何區間計數 - LOAD初始值,終點AND判斷 + reset - ![](https://hackmd.io/_uploads/BkxdX1WU2.jpg) ### 環形計數器 - 做時序控制 - 用循環移位暫存器作 - Alt:用3 bits計數器 + 3 to 8解碼器 - ![](https://hackmd.io/_uploads/HJJfrkWIn.jpg) - n-bit環形計數器 -> 頻率變為1/n Hz ### 詹森計數器 - 移位暫存器,但最後一位的反向回到最前面 - n-bit環形計數器 -> 頻率變為1/2n Hz - k位元詹森計數器 + 2k解碼器 -> 做時序控制 - ![](https://hackmd.io/_uploads/S1PnP1ZIn.jpg) #### 防錯誤 1. 挑一位,框出讓該位變1的狀態 - ![](https://hackmd.io/_uploads/SklR_JWU2.jpg) 2. 化簡,加入修正電路 - D~C~ = B(A + C) - ![](https://hackmd.io/_uploads/rywHtyb83.jpg) ### 除頻器 1. 設計0 ~ n-1 counter 2. 從MSB拉出,即為k/n Hz