# 數位系統實驗報告(五)
:::info
學號: B093040044
系級: 資工113
姓名: 蔡明軒
:::
```
實驗日期: 2021/11/8
```
## 實驗一
### 內容
$F=(AB'+A'B)(C+D')$
- 以AND-OR gates實現$F$(表示為$F1$)
- 以multi-level NAND gate circuit實現$F$(表示為$F2$)
- 以multi-level NOR gate circuit實現$F$(表示為$F2$)
- 驗證$F1=F2=F3$(使用Verilog Structural level modeling)
### 過程
- AND-OR gates
\begin{split}
F&=(AB'+A'B)(C+D')\\
&=F1
\end{split}
- multi-level NAND gate circuit
\begin{split}
F&=(AB'+A'B)(C+D')\\
&=(((AB')'(A'B)')'(C'D)')'\\
&=F2
\end{split}
- multi-level NOR gate circuit
\begin{split}
F&=(AB'+A'B)(C+D')\\
&=(((A'+B)'+(A+B)')'+(C+D')')'\\
&=F3
\end{split}
1. 撰寫Design source檔案,變數名稱和實驗提供的ppt相同
```verilog=
`timescale 1ns / 1ps
module F1(A,B,C,D,F1);
output F1;
input A,B,C,D;
wire w1,w2,w3,w4,nA,nB,nD;
not(nA,A);
not(nB,B);
not(nD,D);
and(w1,A,nB);
and(w2,nA,B);
or(w3,C,nD);
or(w4,w1,w2);
and(F1,w3,w4);
endmodule
module F2(A,B,C,D,F2);
output F2;
input A,B,C,D;
wire w1,w2,w3,w4,w5,nA,nB,nC;
not(nA,A);
not(nB,B);
not(nC,C);
nand(w1,A,nB);
nand(w2,nA,nB);
nand(w3,w1,w2);
nand(w4,nC,D);
nand(w5,w3,w4)
not(F2,w5);
endmodule
module F3(A,B,C,D,F3);
output F3;
input A,B,C,D;
wire w1,w2,w3,w4,nA,nB,nD;
not(nA,A);
not(nB,B);
not(nD,D);
nor(w1,nA,B);
nor(w2,A,nB);
nor(w3,C,nD);
nor(w4,w1,w2);
nor(F3,w3,w4);
endmodule
```
2. 撰寫testbench檔案,變數名稱和實驗提供的ppt相同
```verilog=
`timescale 1ns / 1ps
module tb1;
reg A;
reg B;
reg C;
reg D;
wire F1,F2,F3;
F1 UUT(.A(A),.B(B),.C(C),.D(D),.F1(F1));
F2 UUO(.A(A),.B(B),.C(C),.D(D),.F2(F2));
F3 UUW(.A(A),.B(B),.C(C),.D(D),.F3(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
```
3. Run Synthesis and Simulation
4. 確認輸出的波形是否符合預期
### 結果
- $F1,F2,F3$輸出的波形相同,成功驗證$F1=F2=F3$

## 實驗二
### 內容
- 使用 Karnaugh maps 簡化以下布林函數
$F(x,y,z)=\Sigma (1,2,3,4,5,7)$
- 找到最簡的 sum of products ($F4$),並畫出它的邏輯圖(two-level implementation)
- 以 two-level NAND gate circuit 實現$F4$ (表示為$F5$)
- 以 two-level OR-NAND (OAI) circuit 實現$F4$(表示為$F6$)
- 驗證 $F4=F5=F6$ (使用Verilog Structural level modeling)
### 過程
- Karnaugh map
- $F=z+(x'y)+(xy')$

- the simplest sum of products
\begin{split}
F&=z+x'y+xy'\\
&=F4
\end{split}

- two-level NAND gate circuit
\begin{split}
F&=z+x'y+xy'\\
&=(z'(x'y)'(xy')')'\\
&=F5
\end{split}

- two-level OR-NAND (OAI) circuit
\begin{split}
F&=z+x'y+xy'\\
&=(z'(x'y)'(xy')')'\\
&=(z'(x+y')(x'+y))'\\
&=F6
\end{split}

1. 撰寫Design source檔案,變數名稱和實驗提供的ppt相同
```verilog=
`timescale 1ns / 1ps
module F4(x,y,z,F4);
input x,y,z;
output F4;
wire w1,w2,n1,n2;
not(n1,x);
not(n2,y);
and(w1,n1,y);
and(w2,x,n2);
or(F4,z,w1,w2);
endmodule
module F5(x,y,z,F5);
input x,y,z;
output F5;
wire nx,ny,nz,w1,w2;
not(nx,x);
not(ny,y);
not(nz,z);
nand(w1,nx,y);
nand(w2,x,ny);
nand(F5,w1,w2,nz);
endmodule
module F6(x,y,z,F6);
input x,y,z;
output F6;
wire nx,ny,nz,w1,w2;
not(nx,x);
not(ny,y);
not(nz,z);
or(w1,x,ny);
or(w2,nx,y);
nand(F6,w1,w2,nz);
endmodule
```
2. 撰寫testbench檔案,變數名稱和實驗提供的ppt相同
```verilog=
`timescale 1ns / 1ps
module tb2;
reg x;
reg y;
reg z;
wire F4,F5,F6;
F4 UUT(.x(x),.y(y),.z(z),.F4(F4));
F5 UUO(.x(x),.y(y),.z(z),.F5(F5));
F6 UUI(.x(x),.y(y),.z(z),.F6(F6));
initial begin
x=1'b0; y=1'b0;z=1'b0;
#10 x=1'b0; y=1'b0; z=1'b1;
#10 x=1'b0; y=1'b1; z=1'b0;
#10 x=1'b0; y=1'b1; z=1'b1;
#10 x=1'b1; y=1'b0; z=1'b0;
#10 x=1'b1; y=1'b0; z=1'b1;
#10 x=1'b1; y=1'b1; z=1'b0;
#10 x=1'b1; y=1'b1; z=1'b1;
#10 $finish;
end
endmodule
```
3. Run Synthesis and Simulation
4. 確認輸出的波形是否符合預期
### 結果
- $F4,F5,F6$輸出的波形相同,成功驗證$F4=F5=F6$

## 實驗三
### 內容
- 使用 Karnaugh maps 簡化以下布林函數
$F(x,y,z)=\Sigma (1,2,3,4,5,7)$
- 找到最簡的 product of sums ($F7$),並畫出它的邏輯圖(two-level implementation)
- 以 two-level NOR gate circuit 實現$F4$ (表示為$F8$)
- 以 two-level AND-NOR (AOI) circuit 實現$F4$(表示為$F9$)
- 驗證 $F7=F8=F9$ (使用Verilog Structural level modeling)
### 過程
- Karnaugh map
- $F=(F')'=((x'y'z')+(xyz'))'$

- the simplest product of sums
\begin{split}
F=(F')'&=((x'y'z')+(xyz'))'\\
&=(x+y+z)(x'+y'+z)\\
&=F7
\end{split}

- two-level NOR gate circuit
\begin{split}
F=(F')'&=((x'y'z')+(xyz'))'\\
&=((x+y+z)'+(x'+y'+z)')'\\
&=F8
\end{split}

- two-level AND-NOR (AOI) circuit
\begin{split}
F=(F')'&=((x'y'z')+(xyz'))'\\
&=F9
\end{split}

1. 撰寫Design source檔案,變數名稱和實驗提供的ppt相同
```verilog=
`timescale 1ns / 1ps
module F7(x,y,z,F7);
input x,y,z;
output F7;
wire w1,w2,nx,ny;
not(nx,x);
not(ny,y);
or(w1,x,y,z);
or(w2,nx,ny,z);
and(F7,w1,w2);
endmodule
module F8(x,y,z,F8);
input x,y,z;
output F8;
wire nx,ny,nz,w1,w2;
not(nx,x);
not(ny,y);
nor(w1,x,y,z);
nor(w2,nx,ny,z);
nor(F8,w1,w2);
endmodule
module F9(x,y,z,F9);
input x,y,z;
output F9;
wire nx,ny,nz,w1,w2;
not(nx,x);
not(ny,y);
not(nz,z);
and(w1,nx,ny,nz);
and(w2,x,y,nz);
nor(F9,w1,w2);
endmodule
```
2. 撰寫testbench檔案,變數名稱和實驗提供的ppt相同
```verilog=
`timescale 1ns / 1ps
module tb2;
reg x;
reg y;
reg z;
wire F7,F8,F9;
F7 UUT(.x(x),.y(y),.z(z),.F7(F7));
F8 UUO(.x(x),.y(y),.z(z),.F8(F8));
F9 UUI(.x(x),.y(y),.z(z),.F9(F9));
initial begin
x=1'b0; y=1'b0;z=1'b0;
#10 x=1'b0; y=1'b0; z=1'b1;
#10 x=1'b0; y=1'b1; z=1'b0;
#10 x=1'b0; y=1'b1; z=1'b1;
#10 x=1'b1; y=1'b0; z=1'b0;
#10 x=1'b1; y=1'b0; z=1'b1;
#10 x=1'b1; y=1'b1; z=1'b0;
#10 x=1'b1; y=1'b1; z=1'b1;
#10 $finish;
end
endmodule
```
3. Run Synthesis and Simulation
4. 確認輸出的波形是否符合預期
### 結果
- $F7,F8,F9$輸出的波形相同,成功驗證$F7=F8=F9$

## 實驗心得
>這次的實驗主要是要結合上禮拜數位系統正課的所教的各種邏輯閘電路表示方法的變換,透過這些變換,我們可以縮小電路所需要的面積,或是減少電路所需電晶體的數量以降低成本。
>實驗一是要我們將簡報所提供的布林函數轉換成NOR-NOR和NAND-NAND兩種形式,並比較三者的輸出,一開始我沒有注意到題目要求要使用"Multi" level的邏輯閘來實作,所以我還去畫Karnaugh圖畫簡電路,變成全部都是"two" level的gate,後來我自己重新檢查的時候才驚覺我做錯了,直接用沒經過化簡的布林函數才求出"Multi" level的電路圖。
>實驗二和三使用的都是同一個布林函數,只是實驗二是要轉成NAND-NAND及AOI,實驗三則是要轉成NOR-NOR及OAI,我在實驗二先找到Sum of products(AND-OR)再做轉換,而實驗三則是使用Product of sums(OR-AND),這麼做的話,可以避免在電路圖中出現很多多餘的Not-gate。在化簡的過程中直觀且輕鬆很多,畫出來的電路圖也比較簡潔。
>這次和上次的實驗都需要畫出電路圖,和上次用繪圖軟體畫出來的方式不同,我找到了一個可以線上製作電路圖的的工具**Circuit Diagram - A Circuit Diagram Maker**(使用方法類似Vivado的Block design),這不只可以減少繪圖的時間,也可以讓電路圖漂亮許多,我覺得挺實用的。