---
# System prepended metadata

title: 軟硬體協同設計HW1

---

# 軟硬體協同設計HW1
### ●　作業標題：4-bit full adder
### ●　班級姓名座號：國立高雄大學電機系大四 B1095117 黃致衡
### ●　授課老師：林宏益教授


---

## 一、作業內容：
使用fulladder製作出4bits的加法器

## 二、實作步驟：

### 1. 先寫出1bit的全加器 (fulladder.v)
```
module fadd (
    a,     // I 1-bit : first input
    b,     // I 1-bit : Second input
    cin,   // I 1-bit : Carry input
    s,     // O 1-bit : sum output
    cout   // O 1-bit : carry output
    );

    input a, b, cin;
    output s, cout;
    wire s, co;
    assign {cout, s} = a + b + cin;
    
endmodule // End of Module addbit
```
### 2. 再使用 hierachy 的方式將 1bit 的 module 引用至 top module 中 (fourbits__fulladder.v)
```
`include "fulladder.v"

module add4__explicit (
    s,       // O 4-bit : Output of the adder
    cout,   // O 1-bit : Carry output of adder
    r1,     // I 4-bit : first input
    r2,    // I 4-bit : second input
    ci     // O 1-bit : carry input
    );

    input [3:0] r1;
    input [3:0] r2;
    input ci;
    output [3:0] s;
    output cout;
    wire [3:0] r1, r2;
    wire ci;
    wire [3:0] s;
    wire cout, c1, c2, c3;

    fadd u0 (
    .a (r1[0]), // I 1-bit : first input
    .b (r2[0]), // I 1-bit : Second input
    .cin (ci), // I 1-bit : Carry input
    .s (s[0]), // O 1-bit : sum output
    .cout (c1) // O 1-bit : carry output
    );

    fadd u1 (
    .a (r1[1]) , // I 1-bit : first input
    .b (r2[1]) , // I 1-bit : Second input
    .cin (c1) , // I 1-bit : Carry input
    .s (s[1]) , // O 1-bit : sum output
    .cout (c2) // O 1-bit : carry output
    );

    fadd u2 (
    .a (r1[2]) , // I 1-bit : first input
    .b (r2[2]) , // I 1-bit : Second input
    .cin (c2) , // I 1-bit : Carry input
    .s (s[2]) , // O 1-bit : sum output
    .cout (c3) // O 1-bit : carry output
    );

    fadd u3 (
    .a (r1[3]) , // I 1-bit : first input
    .b (r2[3]) , // I 1-bit : Second input
    .cin (c3) , // I 1-bit : Carry input
    .s (s[3]) , // O 1-bit : sum output
    .cout (cout) // O 1-bit : carry output
    );

endmodule // End Of Module adder
```
### 3. 撰寫 Testbench 並設定 $random 使其產生15組的測試數據 (fourbits__fulladder__tb.v)
```
`timescale 1ns/100ps
`include "fulladder.v"
`include "fourbits__fulladder.v"

module add4__explicit__tb;
    
    reg [3:0] A, B;
    reg CIN;
    wire [3:0] SUM;
    wire COUT;
    
    add4__explicit  add4_explicit_tb(SUM, COUT, A, B, CIN);

    initial
    begin
        $dumpfile("hw_and_sw_hw1.vcd");
        $dumpvars(0, add4__explicit__tb);
        $monitor("A = %b, B = %b, SUM = %b, COUT = %b", A, B, SUM, COUT);

        CIN=4'b0000;
        #10 A={$random} % 16; B={$random} % 16;
        #10 A={$random} % 16; B={$random} % 16;
        #10 A={$random} % 16; B={$random} % 16;
        #10 A={$random} % 16; B={$random} % 16;
        #10 A={$random} % 16; B={$random} % 16;
        #10 A={$random} % 16; B={$random} % 16;
        #10 A={$random} % 16; B={$random} % 16;
        #10 A={$random} % 16; B={$random} % 16;
        #10 A={$random} % 16; B={$random} % 16;
        #10 A={$random} % 16; B={$random} % 16;
        #10 A={$random} % 16; B={$random} % 16;
        #10 A={$random} % 16; B={$random} % 16;
        #10 A={$random} % 16; B={$random} % 16;
        #10 A={$random} % 16; B={$random} % 16;
        #10 A={$random} % 16; B={$random} % 16;
        #10 $finish;
    end

endmodule
```
### 4. 使用 lcarus Verilog 經過 compile 產生 .vcd檔，並使用 GTKWave 查看 simulation 的波型結果

### 5. 開啟 Xilinx Vivado 並進行 Synthesis for FPGA

## 三、實作結果：

### ◎ schematic
![](https://hackmd.io/_uploads/HJzrs3Yep.png)
![](https://hackmd.io/_uploads/SkwSihtxp.png)
![](https://hackmd.io/_uploads/HkCBjhYla.png)

### ◎ .vcd
![](https://hackmd.io/_uploads/H1DUo3Yx6.png)


## 四、實驗心得：
本次的作業困擾我最多的地方在於對環境的不熟悉，撰寫 Verilog 程式本身不是最難的問題，而是在於在 Compile 過程中對於 tool 的陌生使得我在過程中頻頻出現報錯的警訊等等，尤其以在 VScode 中鍵入 make 時，看不懂腳本的我更是對於指令不知如何下而不知所措。所幸在同學的協助下告訴我 Top module 的設置方式才使的我的程式能順利完成編譯過程。

也謝謝教授親自拍攝了 VScode 的設定過程影片，使我能依樣畫葫蘆把環境建置好，謝謝教授的教導。

## 五、參考文獻：

> EEF946〈軟硬體協同設計〉課堂參考講義