---
# System prepended metadata

title: 軟硬體協同設計HW2

---

# 軟硬體協同設計HW2
### ●　作業標題：BCD to Decimal Decoder with Preset/Reset
### ●　班級姓名座號：國立高雄大學電機系大四 B1095117 黃致衡
### ●　授課老師：林宏益教授

---

## 一、作業內容：
###
將 4bits 的binary inputs 訊號轉成 10bits 的 output 訊號，並使用 preset 與 reset_n 進行重設。

## 二、實作步驟：

### 1. 撰寫 BCD decoder 的 RTL code (bcd__decoder.v)
```
module bcd_decoder (
    in,         // I 4-bit
    out,        // O 10-bit
    preset,     // I 1-bit
    reset_n     // I 1-bit
    );

    input [3:0] in;
    input preset, reset_n;
    output [9:0] out;

    reg [9:0] out;


    always @(*) begin

        if (reset_n == 1)

            if (preset == 1)
                out = 10'b11110_00000;
                
            else
                case (in)
                    4'b0000:     out = 10'b11111_11110;
                    4'b0001:     out = 10'b11111_11101;
                    4'b0010:     out = 10'b11111_11011;
                    4'b0011:     out = 10'b11111_10111;
                    4'b0100:     out = 10'b11111_01111;
                    4'b0101:     out = 10'b11110_11111;
                    4'b0110:     out = 10'b11101_11111;
                    4'b0111:     out = 10'b11011_11111;
                    4'b1000:     out = 10'b10111_11111;
                    4'b1001:     out = 10'b01111_11111;
                    4'b1010:     out = 10'b11111_11111;
                    4'b1011:     out = 10'b11111_11111;
                    4'b1100:     out = 10'b11111_11111;
                    4'b1101:     out = 10'b11111_11111;
                    4'b1110:     out = 10'b11111_11111;
                    4'b1111:     out = 10'b11111_11111;
                endcase
        
        else
            out = 10'b00000_00000;

    end

endmodule
```
> 此處為使流程清晰化，並未使用 case 函數中的 default 語法。
### 2. 再撰寫 Testbench 並設定 $random 使其產生數組 in 測試數據(bcd__decoder__tb.v)
```
`timescale 1ns/100ps
`include "bcd__decoder.v"

module bcd_decoder_tb;

    reg [3:0] IN;
    reg PRESET, RESET_N;
    wire [9:0] OUT;

    integer i;

    bcd_decoder bcd_decoder_try (.in(IN), .out(OUT), .preset(PRESET), .reset_n(RESET_N));

    initial begin
        $dumpfile("hw_and_sw_hw2.vcd");
        $dumpvars(0, bcd_decoder_tb);
        $monitor("IN = %b, OUT = %b, PRESET = %b, RESET_N = %b", IN, OUT, PRESET, RESET_N);

        RESET_N = 1'b0;
        #10 RESET_N = 1'b1; PRESET = 1'b0;
        #50 PRESET = 1'b1;
        #30 PRESET = 1'b0;
    end

    initial begin
        for (i=1 ; i<=100 ; i=i+1)  #10 IN = {$random} % 16;
        #10 $finish;
    end

endmodule
```
> RESET_N 與 PRESET 皆參考真值表的結果所進行設定，將 high impedance 的結果設於初始狀態。

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

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

### 5. 更改所使用板子的 .xdc檔案中的 I/O 腳位最後進行燒錄
![305854_0.jpg](https://hackmd.io/_uploads/SkjdH2wXa.jpg)



## 三、實作結果：

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

### ◎ schematic
![](https://hackmd.io/_uploads/rJYeCo-Wa.png)

### ◎ reports
![](https://hackmd.io/_uploads/H1HIJhWZ6.png)

### ◎ .xdc 設定
![hw2_xdc.png](https://hackmd.io/_uploads/rkVPUhwQT.png)
> reset_n 與 preset 使用 switches 啟動。


### ◎ FPGA 實作畫面
![305855_0.jpg](https://hackmd.io/_uploads/HyDo72wmT.jpg)


## 四、實驗討論：

### 1. 請說明所撰寫的 RTL 與 schematic 是否有差別
###
如圖一，可見到在程式碼中使用了兩層的 if 語法來進行編寫，因此在 schematic 圖上則有兩層 MUX 的設計結果，符合我預期中的結構圖。
### 2. 依據 vivado 所提供的分析報告(功率分析, 面積報告或時序)，提供你什麼樣的想法？
### 
學生發現在**功率分析**的部分與我之前其他作業來比較為高，之前寫了一個 32bits 的加法器但功耗卻僅有 0.121W，而此份報告只是 combinational logic 但功耗卻已達到 2.675W ，不知是否為 Case 語法的因素使然。

而在**面積報告**的部分則可見到大部分的晶片面積都用在了 I/O 上，其餘的部分微乎其微。

最後在**時序分析**的部分則顯示為 N/A ，由於此份作業為 combinational logic ，並無 clock 等 squential logic 的介入，因此在時序分析上則為空白。

## 五、實驗心得：
### 
本次的作業屬於經典題目，不過可見到老師在 reset 的部分則進行了部分修改，使這份作業在製作的過程中，學生花費了些許的時間對波型進行了驗證，並由於在程式編寫的時候 $monitor 的位置亂放，導致在波型輸出的結果一開始並沒有從 0ns 開始，這樣的低級錯誤甚至有點讓本來就不充裕的信心有些許打擊。

而第二個打擊的部分是在 Xilinx Vivado 的設定，在跑出 reports 之前，學生好不容易通過了 synthesis 的過程，但在最後的 implementation 時卻跑出了錯誤，顯示我在對空電路進行模擬，瞬間一堆問號在我頭上展開，由於學生的畢業專題也使用過此環境撰寫 RTL code ，因此在面臨此問題時甚至是百思不得其解的，最後靠著先前上課的環境設定講義才把 implementation 的對象設定好，原來學生先前是在對 testbench 進行模擬阿......整個傻眼 = =

總之這次的作業在程式碼的部分，還有許多我認為可以改善的部分，尤其以超過 10 (含)以上的數值，皆用 (1111111111)~2~ 來表示的部分，學生想了解是否有其餘的方式可以節省其硬體使用資源等等。

## 六、參考文獻：

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




