# 數位系統 第五次實驗報告 ###### tags: `digital system` 姓名:高聖傑 系級:資工113 學號:B093040016 實驗日期:2021/11/8 ## 實驗一 ### 內容 - 目標 & 要求 - $F(A,B,C,D)=(AB' +A'B)(C+ D')$ * F1 : 使用 AND, OR 組合出 F * F2 : 只使用 NAND 組合出 F * F3 : 只使用 NOR 組合出 F * 使用 Structural level modeling 模擬並驗證 F1, F2, F3 等效 ### 過程 1-1 circuit > 小發現,框起來的部分可以簡化成 $(A\oplus B)$ ![](https://i.imgur.com/pLA6QsI.png) 1-2 circuit ![](https://i.imgur.com/vsNtEcd.png =450x) 1-3 circuit ![](https://i.imgur.com/l2Syt2l.png =450x) ```verilog= `timescale 1ns / 1ps module m1_1(a, b, c, d, res); input a, b, c, d; output res; wire na, nb, nd, a1, a2, o1, o2; not(na, a); not(nb, b); not(nd, d); and(a1, a, nb); and(a2, na, b); or(o1, a1, a2); or(o2, c, nd); and(res, o1, o2); endmodule module m1_2(a, b, c, d, res); input a, b, c, d; output res; wire nc, o1, x1, x2, x3, x4, n1; nand(nc, c, c); nand(o1, nc, d); nand(x1, a, b); nand(x2, a, x1); nand(x3, b, x1); nand(x4, x2, x3); nand(n1, o1, x4); nand(res, n1, n1); endmodule module m1_3(a, b, c, d, res); input a, b, c, d; output res; wire nd, o1, x1, x2, x3, x4; nor(nd, d, d); nor(x1, a, b); nor(x2, a, x1); nor(x3, b, x1); nor(x4, x2, x3); nor(o1, c, nd); nor(res, o1, x4); endmodule ``` ### 模擬結果 ![](https://i.imgur.com/v0K3jYK.png =600x) 三個 function 所產生的波形圖一樣,因此可證明 $F_1, F_2, F_3$ 等效 # 實驗二 ## 內容 - 目標 & 要求 - 使用 K map,簡化 $F(x,y,z) = \Sigma(1,2,3,4,5,7)$ - 找到最簡 sum of products as F4,並畫出其 logic diagram * F4 : 使用 AND, OR 組合出 F 的 2-level SOP circuit * F5 : 只使用 NAND 組合出 F 的 2-level NAND gate circuit * F6 : 只使用 OR, NAND 組合出 F 的 2-level OAI circuit * 使用 Structural level modeling 模擬並驗證 $F_4, F_5, F_6$ 等效 ### 過程 ![](https://i.imgur.com/DLAZgQA.png =450x) * $F_4$ : 2-level SOP circuit * $F_4 = x'y + xy' + z$ * ![](https://i.imgur.com/2bYFD9z.png) * $F_5$ : 2-level NAND gate circuit * $F_5 = ((x'y)' (xy')' z')'$ * ![](https://i.imgur.com/9QqYAjw.png) * $F_6$ : 2-level OAI circuit * $F_6 = (\color{red}{(x'y)'} \color{blue}{(xy')'} z')' =(\color{red}{(x'+y)} \color{blue}{(x+y')} z')'$ * ![](https://i.imgur.com/VMnABTm.png) 以下的 module m2_1, m2_2, m2_3 分別為 $F_4, F_5, F_6$ 三者皆使用 Structural level modeling ```verilog= `timescale 1ns / 1ps module m2_1(x, y, z, res); //x'y + xy' + z input x, y, z; output res; wire nx, ny, nz; wire a1, a2; not(nx, x); not(ny, y); not(nz, z); and(a1, nx, y); and(a2, x,ny); or(res, z, a1, a2); endmodule module m2_2(x, y, z, res); // ((x′y)′ (xy′)′ z′)′ input x, y, z; output res; wire nx, ny, nz; wire a1, a2; not(nx, x); not(ny, y); not(nz, z); nand(a1, nx, y); nand(a2, x,ny); nand(res, nz, a1, a2); endmodule module m2_3(x, y, z, res); // ((x'+y) (x+y') z')' input x, y, z; output res; wire nx, ny, nz; wire o1, o2; not(nx, x); not(ny, y); not(nz, z); or(o1, nx, y); or(o2, x,ny); nand(res, nz, o1, o2); endmodule ``` ### 模擬結果 註:實驗二為圖片紅框處 ![](https://i.imgur.com/WBjir4Z.png =600x) 三個 function 所產生的波形圖一樣,因此可證明 $F_4, F_5, F_6$ 等效 ## 實驗三 ### 內容 - 目標 & 要求 - 使用 K map,簡化 $F(x,y,z) = \Sigma(1,2,3,4,5,7)$ - 找到最簡 product of sums as F7,並畫出其 logic diagram * F7 : 使用 AND, OR 組合出 F 的 2-level POS circuit * F8 : 只使用 NOR 組合出 F 的 2-level NOR gate circuit * F9 : 只使用 AND, NOR 組合出 F 的 2-level AOI circuit * 使用 Structural level modeling 模擬並驗證 $F_7, F_8, F_9$ 等效 ### 過程 ![](https://i.imgur.com/Ao7CQdq.png =450x) * $F_7$ : 2-level POS circuit * $F_7 = (x+y+z)(x'+y'+z)$ * ![](https://i.imgur.com/i9fqpBJ.png) * $F_8$ : 2-level NOR gate circuit * $F_8 = ((x+y+z)'+(x'+y'+z)')'$ * ![](https://i.imgur.com/wdhHYgG.png) * $F_9$ : 2-level AOI circuit * $F_9 = (\color{red}{(x+y+z)'}+\color{blue}{(x'+y'+z)'})' = (\color{red}{x'y'z'}+\color{blue}{xyz'})'$ * ![](https://i.imgur.com/ZfFcNyL.png) 以下的 module m3_1, m3_2, m3_3 分別為 $F_7, F_8, F_9$ 三者皆使用 Structural level modeling ```verilog= `timescale 1ns / 1ps module m3_1(x, y, z, res); //(x+y+z)(x'+y'+z) input x, y, z; output res; wire nx, ny, nz; wire o1, o2; not(nx, x); not(ny, y); not(nz, z); or(o1, x, y, z); or(o2, nx, ny, z); and(res, o1, o2); endmodule module m3_2(x, y, z, res); //(x+y+z)(x'+y'+z) input x, y, z; output res; wire nx, ny, nz; wire o1, o2; not(nx, x); not(ny, y); not(nz, z); nor(o1, x, y, z); nor(o2, nx, ny, z); nor(res, o1, o2); endmodule module m3_3(x, y, z, res); //(x'y'z'+xyz')' input x, y, z; output res; wire nx, ny, nz; wire a1, a2; not(nx, x); not(ny, y); not(nz, z); and(a1, nx, ny, nz); and(a2, x, y, nz); nor(res, a1, a2); endmodule ``` ### 模擬結果 註:實驗三為圖片黃框處 ![](https://i.imgur.com/WBjir4Z.png =600x) 三個 function 所產生的波形圖一樣,因此可證明 $F_7, F_8, F_9$ 等效 ## testbench code ### 實驗一 testbench ```verilog= `timescale 1ns / 1ps module tbGen(); reg A, B, C, D; wire f1, f2, f3; m1_1 _tb1(.a(A), .b(B), .c(C), .d(D), .res(f1)); m1_2 _tb2(.a(A), .b(B), .c(C), .d(D), .res(f2)); m1_3 _tb3(.a(A), .b(B), .c(C), .d(D), .res(f3)); initial begin A = 1'b0; B = 1'b0; C = 1'b0; D = 1'b0; #10 A = 1'b0; B = 1'b0; C = 1'b0; D = 1'b1; #10 A = 1'b0; B = 1'b0; C = 1'b1; D = 1'b0; #10 A = 1'b0; B = 1'b0; C = 1'b1; D = 1'b1; #10 A = 1'b0; B = 1'b1; C = 1'b0; D = 1'b0; #10 A = 1'b0; B = 1'b1; C = 1'b0; D = 1'b1; #10 A = 1'b0; B = 1'b1; C = 1'b1; D = 1'b0; #10 A = 1'b0; B = 1'b1; C = 1'b1; D = 1'b1; #10 A = 1'b1; B = 1'b0; C = 1'b0; D = 1'b0; #10 A = 1'b1; B = 1'b0; C = 1'b0; D = 1'b1; #10 A = 1'b1; B = 1'b0; C = 1'b1; D = 1'b0; #10 A = 1'b1; B = 1'b0; C = 1'b1; D = 1'b1; #10 A = 1'b1; B = 1'b1; C = 1'b0; D = 1'b0; #10 A = 1'b1; B = 1'b1; C = 1'b0; D = 1'b1; #10 A = 1'b1; B = 1'b1; C = 1'b1; D = 1'b0; #10 A = 1'b1; B = 1'b1; C = 1'b1; D = 1'b1; #10 $finish; end endmodule ``` ### 實驗二、三 testbench ```verilog= `timescale 1ns / 1ps module tbGen(); reg A, B, C; wire f4, f5, f6; wire f7, f8, f9; m2_1 _tb1(.x(A), .y(B), .z(C), .res(f4)); m2_2 _tb2(.x(A), .y(B), .z(C), .res(f5)); m2_3 _tb3(.x(A), .y(B), .z(C), .res(f6)); m3_1 _tb1(.x(A), .y(B), .z(C), .res(f7)); m3_2 _tb2(.x(A), .y(B), .z(C), .res(f8)); m3_3 _tb3(.x(A), .y(B), .z(C), .res(f9)); initial begin A = 1'b0; B = 1'b0; C = 1'b0; #10 A = 1'b0; B = 1'b0; C = 1'b1; #10 A = 1'b0; B = 1'b1; C = 1'b0; #10 A = 1'b0; B = 1'b1; C = 1'b1; #10 A = 1'b1; B = 1'b0; C = 1'b0; #10 A = 1'b1; B = 1'b0; C = 1'b1; #10 A = 1'b1; B = 1'b1; C = 1'b0; #10 A = 1'b1; B = 1'b1; C = 1'b1; #10 $finish; end endmodule ``` ## 實驗心得 > 這次的實驗主要是讓我們練習 verilog 程式碼以及使用 NAND, NOR 這兩個 universal gate 替換原有電路的實驗。 > 在看實驗一的電路圖時,我發現 $(AB' +A'B)$ 可以簡化成 $(A\oplus B)$ , > 結果除了能省掉做 not A, not B 還有少量 NOT 閘的部分外, > 沒有其他較突出的優勢,還搞的很複雜,算是自我練習(? > > 我從實驗二、三的發現,同樣是 2-level 的電路居然能有這麼多種作法。 > 前兩個相對比較簡單,SOP 的部分是把 2-level 的前後全部換成 NAND, > POS 的部分是把 2-level 的前後全部換成 NOR。 > 最後的 AOI 和 OAI 在邏輯上需要多拐幾個彎,對我來說有點難, > 為了搞懂這部分的知識,我在寫這份報告時,整理出以下的表格, > 希望這樣可以幫助我理解這些 2-level 的計算過程。 | 2-level | 計算過程 | |:-------:|:-----------------------------------------------------:| | SOP | 框 1,化簡 | | OAI | 框 1,化簡,再整個取 complement,最後最外面括號加 not | | POS | 框 0,化簡,再整個取 complement | | AOI | 框 0,化簡,最後最外面括號加 not (不用迪摩根) | ## Extra ![](https://i.imgur.com/0Tj9lEQ.png =400x) 這次用 vivado 有個新發現,我們可以在 Simulation Sources 裡加入多個 testbench,只要對他右鍵 -> run simulation 就可以選擇 run 哪個 testbench,這樣就可以在同一個專案底,自由切換到需要測試的部分,非常方便。