---
# System prepended metadata

title: 數位系統實驗報告Lab12

---

# 數位系統實驗報告Lab12

:::info
學號: B093040044
系級: 資工113
姓名: 蔡明軒
:::

```
實驗日期: 2021/12/6
```

## 實驗一

### 內容

- 利用Structural level modeling，設計並驗證D Latch
![](https://i.imgur.com/D786bwf.png)


### 過程

1. 參考PPT上的電路圖，撰寫 D Latch 檔案
```verilog=
`timescale 1ns/1ps

module D_Latch (
    output Q,Qb,
    input En,D
);
    wire Db,I1,I2;
    not(Db,D);
    nand(I1,D,En);
    nand(I2,Db,En);
    nand(Q,Qb,I1);
    nand(Qb,Q,I2);
endmodule
```

2. 撰寫testbench檔案
```verilog=
`timescale 1ns / 1ps

module tb ();
    reg En,D;
    wire Q,Qb;
    D_Latch DL(.Q(Q),.Qb(Qb),.En(En),.D(D));
    initial begin
        En=1'b0;D=1'b0;
        #10 En=1'b1;D=1'b0;
        #10 En=1'b0;D=1'b0;
        #10 En=1'b1;D=1'b1;
        #10 En=1'b0;D=1'b0;
        #10 $finish;
    end
endmodule
```
3. Run Synthesis and Simulation
4. 確認結果是否符合預期

### 結果


| En  |  D  | Next state of Q |
|:---:|:---:|:---------------:|
|  0  |  X  |   No change     |
|  1  |  1  |        1        |
|  1  |  0  |        1        |

- 輸出結果符合上面的Function table的行為
![](https://i.imgur.com/8jXBryy.png)

## 實驗二

### 內容

- 利用Structural level modeling，設計並驗證正緣觸發的 master-slave D flip-flop

### 過程

1. Master-slave D flip-flop 其實是由兩個 D latch組成，我直接使用我在實驗一裡所寫的D latch
```verilog=
module D_Latch (
    output Q,Qb,
    input En,D
);
    wire Db,I1,I2;
    not(Db,D);
    nand(I1,D,En);
    nand(I2,Db,En);
    nand(Q,Qb,I1);
    nand(Qb,Q,I2);
endmodule
```
2. 將兩個D latch組合在一起，因為是正緣觸發，所以clk訊號放在slave，nclk(~clk)訊號放在master
```verilog=
module Master_slave_D_FlipFlop (
    output Q,Qb,
    input D,clk
);
    wire nclk,Y,nY;
    not(nclk,clk);
    D_Latch Master(Y,nY,nclk,D), Slave(Q,Qb,clk,Y);
endmodule
```
3. 撰寫testbench檔案，這裡的testbench是直接參考前面PTT所給的範例而完成的
```verilog=
`timescale 1ns / 1ps

module tb ();
    reg D, clk;
    wire Q, Qb;
    Master_slave_D_FlipFlop M1(.Q(Q), .Qb(Qb), .D(D), .clk(clk));
    initial #100 $finish;
    initial begin clk = 0; forever #5 clk = ~clk; end
    initial fork
    D = 1;
    #20 D = 0;
    #40 D = 1;
    #50 D = 0;
    #60 D = 1;
    #70 D = 0;
    #90 D = 1;
    join
endmodule
```
4. Run Synthesis and Simulation
5. 確認結果是否符合預期

### 結果

- 每次clk為正緣的時候，Q和D相同，且Q只在正緣的時候變化，符合預期的結果
![](https://i.imgur.com/Jo1G9Nb.png)

## 實驗三

### 內容

- 利用Structural level modeling，設計並驗證有 asynchronous reset 的 D flip-flop
![](https://i.imgur.com/Mak0w4q.png)

### 過程

1. 參考PPT上的電路給的電路圖，撰寫有 asynchronous reset 的 D flip-flop
```verilog=
`timescale 1ns / 1ps

module D_FlipFlop_AR (
    output Q,Qb,
    input D,Clock,Reset
);
    wire S,nS,R,nR;

    nand(nS,S,nR);
    nand(S,Clock,Reset,nS);

    nand(nR,D,Reset,R);
    nand(R,Clock,nR,S);
    
    nand(Q,Qb,S);
    nand(Qb,Q,R,Reset);
endmodule
```
2. 撰寫testbench檔案，這裡的testbench是直接參考前面PTT所給的範例而完成的
```verilog=
`timescale 1ns / 1ps

module tb ();
    reg D, Clock,Reset;
    wire Q, Qb;
    D_FlipFlop_AR D1(.Q(Q), .Qb(Qb), .D(D), .Clock(Clock),.Reset(Reset));
    initial #100 $finish;
    initial begin Clock = 0; forever #5 Clock = ~Clock; end
    initial fork
    D = 1;
    Reset = 1;
    #20 D = 0;
    #40 D = 1;
    #50 D = 0;
    #60 D = 1;
    #70 D = 0;
    #90 D = 1;
    #42 Reset = 0;
    #72 Reset = 1;
    join
endmodule
```
3. Run Synthesis and Simulation
4. 確認結果是否符合預期

### 結果

- 每次clk為正緣且reset=1的時候，Q和D相同，且Q只在正緣且reset=1的時候變化，符合預期的結果
![](https://i.imgur.com/BqqJUFK.png)

## 實驗心得

>這次實驗的內容為各種序向邏輯電路，包括D Latch,Flip-Flop，第一個實驗為實作D Latch，在撰寫Testbench的時候，我有發現一個問題，因為我一開始只是按照之前二進制的順序作為輸入，但是在模擬結果出現的時候，發現這樣的輸入沒辦法測試所有狀況(在En = 0的時候，輸出會跟上一輪的結果有關)，因此，我後來改成把En = 0 的測試資料插入在En = 1的狀況之後，這樣就可以確認En = 0是否有No change的特性了。

>實驗二及實驗三因為有clock及reset訊號的加入，設計一個好的testbench難度又提高了，幸好在PPT的前面有提供一個範例的testbench，我只要觀察結果是否有符合Flip-Flop的特性即可。

>另外，在做實驗三的時候，因為電路圖長得很像3個合在一起的D Latch，我一開始想嘗試利用實驗一所寫的D Latch來寫成有 asynchronous reset 的 D flip-flop，但是後來發現電路圖中每個很像D Latch的部分都多了一個input去接收Reset訊號，所以後來就決定用一個一個邏輯閘撰寫了。