# BCD to Decimal Decoder with Preset/Reset
---
### 學生: B1105142 李旼學
### 指導教授:林宏益教授
---
## 報告內容
## 一.實驗目的:
使用vscode撰寫verilog的程式碼以及test bench,並匯入vivado進行模擬分析,並檢查是否與原先所設計的電路符合。
## 二.實驗材料:
vscode,vivado
## 三.實驗結果:



▴上圖為此次實驗的波形圖
根據老師以及碩班學長的經驗分享,應該先檢驗較為重要的reset以及preset,
再做其他部分的驗證,因此我稍微更改了testbench,來符合檢驗的步驟。首先
,b是我的reset,c是我的preset。可以觀察到當reset腳位是0時,output全數為0,而當兩者同時為1時,輸出變為8'b11110000,而當reset為1且preset為0時,則觀察輸入腳位,此時輸入4'b0000,所以輸出為8'b11111110,也符合真值表的結果,後續的波形圖也都符合。

▴上圖為此次實驗的RTL schematic圖

▴上圖為此次實驗的implementation圖

[bcd_decoder](https://youtube.com/shorts/-gYq-IgniOQ)
▴以上是FPGA實驗,可從連結登入觀看影片
## 四.程式碼:
```
module bcd_decoder(bcd_input,decimal_output,reset,preset);
input [3:0] bcd_input; //4bit輸入
input reset;
input preset;
output [9:0] decimal_output; //10bit輸出
reg [9:0] decimal_output;
always @(bcd_input or reset or preset) //使用always block寫case
begin
if(reset==0)
decimal_output = 10'b0000000000;
else if (reset==1 && preset==1)
decimal_output = 10'b1111000000;
else if (reset==1 && preset==0)
case (bcd_input)
4'b0000: decimal_output = 10'b1111111110;
4'b0001: decimal_output = 10'b1111111101;
4'b0010: decimal_output = 10'b1111111011;
4'b0011: decimal_output = 10'b1111110111;
4'b0100: decimal_output = 10'b1111101111;
4'b0101: decimal_output = 10'b1111011111;
4'b0110: decimal_output = 10'b1110111111;
4'b0111: decimal_output = 10'b1101111111;
4'b1000: decimal_output = 10'b1011111111;
4'b1001: decimal_output = 10'b0111111111;
4'b1010: decimal_output = 10'b1111111111;
4'b1011: decimal_output = 10'b1111111111;
4'b1100: decimal_output = 10'b1111111111;
4'b1101: decimal_output = 10'b1111111111;
4'b1110: decimal_output = 10'b1111111111;
4'b1111: decimal_output = 10'b1111111111;
endcase
end
endmodule
```
▴以上為bcd_decoder.v檔
```
module bcd_decoder_tb;
reg [3:0] a; //bcd_input
reg b; //reset
reg c; //preset
wire [9:0] d; //decimal_output
initial
begin
$dumpfile("bcd_decoder.vcd");
$dumpvars(0, s);
$monitor("a = %b, b = %b, c = %b | d=%b ", a, b, c, d);
a=4'bxxxx; b=1'bx;c=1'bx;
#50 b=1'b0; //令 reset為0
#50 b=1'b1; c=1'b1; //令 reset preset同時為1
#50 a=4'b0000; b=1; c=1'b0; //令reset為1 preset為0
repeat(15)
begin
#50 a=a+1;
end
end
bcd_decoder s(
.bcd_input(a),
.reset(b),
.preset(c),
.decimal_output(d)
);
endmodule
```
▴以上為bcd_decoder_tb.v檔

▴以上為實驗的vcd檔,由此表可發現與實驗之真值表相同
## 五.實驗討論:

▴上圖為此次實驗的功耗分析
由此分析可看出在功耗中,I/O佔據了極大部分的消耗,大約是信號以及邏輯元件加起來的兩倍多,所以如果想降低此晶片的功耗,一大方式就是優化I/O電路
,並且在降低功耗的同時,保證晶片的效能。

▴上圖為此次實驗的面積使用率
## 六.實驗心得:
由於第一次實驗時,vivado一直無法安裝,所以只能用vscode撰寫完程式後跑出vcd檔檢驗程式碼是否正確。這次成功解決後,便能看到verilog合成出來的電路,感覺十分得不錯。不過在撰寫verilog時,我常常感到很煩惱,因為這是硬體描述語言,並非軟體程式語言,並非結果正確即可,也要考慮到晶片的功耗面積速度等問題,所以儘管有了想法並快速的coding出來,我還是會懷疑這是否是最好的設計方式,有甚麼可改進的地方,不過我也只是一個新手,對設計電路還沒那麼敏銳,有想法卻未必能簡單實現,但我相信透過課堂以及網路上資源的學習,會慢慢培養出感覺,並改進在設計上的缺陷。