# 軟硬體協同設計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 腳位最後進行燒錄

## 三、實作結果:
### ◎ .vcd

### ◎ schematic

### ◎ reports

### ◎ .xdc 設定

> reset_n 與 preset 使用 switches 啟動。
### ◎ FPGA 實作畫面

## 四、實驗討論:
### 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〈軟硬體協同設計〉課堂參考講義