---
# System prepended metadata

title: 軟硬體協同設計HW3、HW4

---

# 軟硬體協同設計HW3、HW4
### ●　HW3 作業標題：Decimal to 7-seg display with Reset
### ●　HW4 作業標題：FPGA implementation for Decimal to 7-Seg Display
### ●　班級姓名座號：國立高雄大學電機系大四 B1095117 黃致衡
### ●　授課老師：林宏益教授

---
## 一、作業內容：
###
將 4bits 的 binary inputs 訊號轉成 8bits 的 output 訊號以供七段顯示器使用，並使用 reset_n 進行重設。

## 二、實作步驟：

### 1. 撰寫 Decimal to 7-Seg 的 RTL code (decimal__to__7_seg.v)
```
module decimal_to_7_seg (
    dec_in,         // I 4-bit
    seven_seg_out,        // O 10-bit
    reset_n     // I 1-bit
    );

    input [3:0] dec_in;
    input reset_n;
    output [7:0] seven_seg_out;

    reg [7:0] seven_seg_out;


    always @(dec_in, reset_n) 
    begin

        if (reset_n == 0)
            seven_seg_out = 8'b10010001;                           //H

        else
            case (dec_in)
                4'b0000:     seven_seg_out = 8'b00000011;          //0
                4'b0001:     seven_seg_out = 8'b10011111;          //1
                4'b0010:     seven_seg_out = 8'b00100101;          //2
                4'b0011:     seven_seg_out = 8'b00001101;          //3
                4'b0100:     seven_seg_out = 8'b10011001;          //4
                4'b0101:     seven_seg_out = 8'b01001001;          //5
                4'b0110:     seven_seg_out = 8'b01000001;          //6
                4'b0111:     seven_seg_out = 8'b00011111;          //7
                4'b1000:     seven_seg_out = 8'b00000001;          //8
                4'b1001:     seven_seg_out = 8'b00001001;          //9
                4'b1010:     seven_seg_out = 8'b00010001;          //A
                4'b1011:     seven_seg_out = 8'b11000001;          //B
                4'b1100:     seven_seg_out = 8'b11100101;          //C
                4'b1101:     seven_seg_out = 8'b10000101;          //D
                4'b1110:     seven_seg_out = 8'b01100001;          //E
                4'b1111:     seven_seg_out = 8'b01110001;          //F
                default:     seven_seg_out = 8'b00000000;          //X
            endcase
    end

endmodule
```
> 此處使用 case 函數中的 default 語法以避免產生 latch 的可能，並將 default 值設定為七段顯示器會全亮的 (00000000)~2~。
> 
> 註解表七段顯示器愈顯示的數字與文字。
### 2. 再撰寫 Testbench 並設定使其從 0 數到 15 用以產生數組 DEC_IN 測試數據(decimal__to__7_seg__tb.v)
```
`timescale 1ns/100ps
//`include "decimal__to__7_seg.v"

module decimal_to_7_seg_tb;

    reg [3:0] DEC_IN;
    reg RESET_N;
    wire [7:0] SEVEN_SEG_OUT;

    integer i;

    decimal_to_7_seg decimal_to_7_seg_try (.dec_in(DEC_IN), .seven_seg_out(SEVEN_SEG_OUT), .reset_n(RESET_N));

    initial 
    begin
        RESET_N = 1'b0;
        #10 RESET_N = 1'b1;
    end

    initial
    begin
        for (i=0 ; i<=100 ; i=i+1)  #10 DEC_IN = i % 16;
        #10 $finish;
    end

    initial 
    begin
        $dumpfile("hw_and_sw_hw3.vcd");
        $dumpvars();
        //$sdf_annotate("decimal__to__7_seg.sdf", decimal_to_7_seg_tb);
        $fsdbDumpfile("decimal__to__7_seg.fsdb");
        $fsdbDumpvars;
        $monitor("IN = %b, OUT = %b, RESET_N = %b", DEC_IN, SEVEN_SEG_OUT, RESET_N);
    end

endmodule
```
> $fsdbDumpfile 與 $fsdbDumpvars 為後續使用 EDA cloud 時所需的語法設定。
>
> timescale 在使用 VCS compiler 時需隱藏。

### 3. 使用 lcarus Verilog 經過 compile 產生 .vcd檔，並使用 GTKWave 預先查看合成前 simulation 的波型結果
![](https://hackmd.io/_uploads/rkgzyp5GT.png)
> 可見得 simulation 之結果符合 truth table 預期，因此得以進行下列步驟。

### 4. 使用 EDA cloud 將上述步驟改於工作站進行，並重新撰寫 Verilog codes

### 5. 將 (decimal__to__7_seg.v) 與 (decimal__to__7_seg__tb.v) 使用設定好的 filelist.f 與 makefile 後，改用 VCS compiler 產生 (decimal__to__7_seg.fsdb) 檔

### 6. 開啟 Verdi 檢視 RnWave 波型運行結果

### 7. 登出 EDA cloud，開啟 Xilinx Vivado 並進行 Synthesis for FPGA
![](https://hackmd.io/_uploads/H1KQgp5M6.png)
> 得到 implemantation 的結果。

### 8. 更改所使用板子的 .xdc 檔案中的 I/O 腳位最後進行燒錄
![hw3_xdc.png](https://hackmd.io/_uploads/rJTFD3DQ6.png)
> reset_n 使用 switches 啟動。

![20231107_172051.jpg](https://hackmd.io/_uploads/SyqJk2PXa.jpg)



## 三、實作結果：

### ◎ RnWave
![](https://hackmd.io/_uploads/HyZLus0fp.png)

### ◎ schematic
#### 1. 在 Vivado 上開啟合成前圖片
![](https://hackmd.io/_uploads/rkUMM6qGp.png)

#### 2. 在 Vivado 上開啟合成後圖片
![](https://hackmd.io/_uploads/rkUIM6qMa.png)

#### 3. 使用 Verdi 開啟
![](https://hackmd.io/_uploads/rkocfpcG6.png)

### ◎ FPGA 實作畫面
![305837_0.jpg](https://hackmd.io/_uploads/Sy8hZhPXT.jpg)
> 當輸入 reset_n == 0 時，輸出 H 字型。

![305836_0.jpg](https://hackmd.io/_uploads/SyRCGhP7T.jpg)
![305838_0.jpg](https://hackmd.io/_uploads/ryYczhDQT.jpg)
![305839_0.jpg](https://hackmd.io/_uploads/r1YcGhvX6.jpg)
![305840_0.jpg](https://hackmd.io/_uploads/rJK5MhDXa.jpg)
![305841_0.jpg](https://hackmd.io/_uploads/HyKcM2wmp.jpg)
![305842_0.jpg](https://hackmd.io/_uploads/HyYqz3DQ6.jpg)
![305843_0.jpg](https://hackmd.io/_uploads/H1YqGhwmp.jpg)
![305844_0.jpg](https://hackmd.io/_uploads/Bks3M2DX6.jpg)
![305845_0.jpg](https://hackmd.io/_uploads/Bk23z2DmT.jpg)
![305846_0.jpg](https://hackmd.io/_uploads/H1h3z3DXp.jpg)
![305847_0.jpg](https://hackmd.io/_uploads/B1n3f3wXa.jpg)
![305848_0.jpg](https://hackmd.io/_uploads/H133G2vXp.jpg)
![305849_0.jpg](https://hackmd.io/_uploads/B12hM3Dm6.jpg)
![305850_0.jpg](https://hackmd.io/_uploads/Sknnzhw76.jpg)
![305853_0.jpg](https://hackmd.io/_uploads/H1n2z2Dmp.jpg)
![305852_0.jpg](https://hackmd.io/_uploads/HJ23M2vma.jpg)



## 四、實驗心得：
### 
本次的作業在撰寫 Verilog 的部分不算過於困難，與 HW2 的內容相似，但在使用 EDA cloud 的部分可就麻煩了，由於不熟悉工作站的指令操作以及其所涵蓋的軟體資源，可以說在使用工作站時所遇到的問題是困難重重，再加上學生所使用的筆記型電腦的 CPU 為 i3-3120M 屬於年代久遠的硬體設備，完全無法支撐運行虛擬機 NX client 的運行環境，只好換一台設備再繼續戰。

## 五、參考文獻：

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





