---
# System prepended metadata

title: BCD to Decimal Decoder with Preset/Reset

---

# BCD to Decimal Decoder with Preset/Reset 
---
### 學生: B1105142 李旼學
### 指導教授:林宏益教授

---

## 報告內容


## 一.實驗目的:
 使用vscode撰寫verilog的程式碼以及test bench，並匯入vivado進行模擬分析，並檢查是否與原先所設計的電路符合。

## 二.實驗材料:
vscode，vivado

## 三.實驗結果:
![螢幕擷取畫面 2023-11-08 104301.png](https://hackmd.io/_uploads/Hk5fIuump.png)
![螢幕擷取畫面 2023-11-08 104333.png](https://hackmd.io/_uploads/S1fNIu_7p.png)
![螢幕擷取畫面 2023-11-08 104407.png](https://hackmd.io/_uploads/S19V8_dQ6.png)
▴上圖為此次實驗的波形圖

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

![螢幕擷取畫面 2023-11-08 105852.png](https://hackmd.io/_uploads/BJc0tuuXp.png)
▴上圖為此次實驗的RTL schematic圖

![螢幕擷取畫面 2023-11-08 110607.png](https://hackmd.io/_uploads/HksNiudQa.png)
▴上圖為此次實驗的implementation圖

![S__2130008.jpg](https://hackmd.io/_uploads/BJgOK9uX6.jpg)
[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檔
![螢幕擷取畫面 2023-11-08 111523.png](https://hackmd.io/_uploads/SyhDpuum6.png)

▴以上為實驗的vcd檔，由此表可發現與實驗之真值表相同

## 五.實驗討論:
![img](https://hackmd.io/_uploads/BJ9ThJQ-a.png)
▴上圖為此次實驗的功耗分析

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

![螢幕擷取畫面 2023-11-08 113610.png](https://hackmd.io/_uploads/HJtjGt_m6.png)
▴上圖為此次實驗的面積使用率

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













