# 數位系統 第五次實驗報告
###### 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)$

1-2 circuit

1-3 circuit

```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
```
### 模擬結果

三個 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$ 等效
### 過程

* $F_4$ : 2-level SOP circuit
* $F_4 = x'y + xy' + z$
* 
* $F_5$ : 2-level NAND gate circuit
* $F_5 = ((x'y)' (xy')' z')'$
* 
* $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')'$
* 
以下的 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
```
### 模擬結果
註:實驗二為圖片紅框處

三個 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$ 等效
### 過程

* $F_7$ : 2-level POS circuit
* $F_7 = (x+y+z)(x'+y'+z)$
* 
* $F_8$ : 2-level NOR gate circuit
* $F_8 = ((x+y+z)'+(x'+y'+z)')'$
* 
* $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'})'$
* 
以下的 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
```
### 模擬結果
註:實驗三為圖片黃框處

三個 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

這次用 vivado 有個新發現,我們可以在 Simulation Sources 裡加入多個 testbench,只要對他右鍵 -> run simulation 就可以選擇 run 哪個 testbench,這樣就可以在同一個專案底,自由切換到需要測試的部分,非常方便。