---
# System prepended metadata

title: HW2_BCD to Decimal Decoder with Preset/Reset

---

# HW2 BCD to Decimal Decoder with Preset/Reset
---
[TOC]
## 1.實驗目的
由下圖所指定的真值表，來完成一個BCD to Decimal Decoder with Preset/Reset電路。
![](https://hackmd.io/_uploads/ryRX4DXZT.jpg)
**圖:真值表**

## 2.電路撰寫與驗證
根據上圖的真值表，進行由輸入BCD對應到輸出Decimal的運算，並使用case寫法，運算後先丟進out_reg腳位暫存，在確認完Priority後再輸出。
而Reset/Preset/out_reg的Priority順序，使用了if-else電路決定輸出結果為何。
Priority : Reset > Preset >out_reg

以下是RTL與testbench的Code:
### RTL
```
module bcd_to_decimal_decoder (
    Reset_n,      //Reset the circult to 0
    Preset,       //Preset the circult
    bcd_in,       //BCD Input to decide decimal_out
    decimal_out   //Decimal Output
  );

  input Reset_n;
  input Preset;
  input [3:0] bcd_in;

  output [9:0] decimal_out;

  reg [9:0] decimal_out;
  reg [9:0] out_reg;           //output register to store compute value

  always @(bcd_in)            //BCD Input Computation
  begin
    case(bcd_in)
      4'd0:
        out_reg = 10'b1111111110;
      4'd1:
        out_reg = 10'b1111111101;
      4'd2:
        out_reg = 10'b1111111011;
      4'd3:
        out_reg = 10'b1111110111;
      4'd4:
        out_reg = 10'b1111101111;
      4'd5:
        out_reg = 10'b1111011111;
      4'd6:
        out_reg = 10'b1110111111;
      4'd7:
        out_reg = 10'b1101111111;
      4'd8:
        out_reg = 10'b1011111111;
      4'd9:
        out_reg = 10'b0111111111;
      default:
        out_reg = 10'b1111111111;
    endcase
  end

  always@(*)
  begin
    if(!Reset_n)                      //Reset Primary
      decimal_out = 10'd0;
    else if (Preset)                  //Preset Secondoary
      decimal_out = 10'b0000001111;
    else                              //BCD Input Computation Last
      decimal_out = out_reg;
  end

endmodule
```
### testbench
```
`timescale 1ns / 10ps
module bcd_to_decimal_tb;

  reg Reset_n;
  reg Preset;
  reg [3:0] data_in;
  wire [9:0] dec_out;

  initial
  begin
    $dumpfile("bcd_to_decimal.vcd");
    $dumpvars(0,bcd_to_dec);
  end

  integer i;

  initial
  begin
    $monitor("Reset_n = %b, Preset = %b, bcd_in = %b, decimal_out = %b",
             Reset_n, Preset, data_in, dec_out);
             
    #0  Reset_n = 1'b0; Preset = 1'b1; data_in = 4'd0;            //Test Reset
    #10 Reset_n = 1'b1; Preset = 1'b1; data_in = 4'd0;            //Test Preset
    for( i=0 ; i<16 ;i++)
    begin
      #10 Reset_n = 1'b1; Preset = 1'b0; data_in = i;
    end

    #10 $finish;
  end

  bcd_to_decimal_decoder bcd_to_dec(
                           .Reset_n(Reset_n),
                           .Preset(Preset),
                           .bcd_in(data_in),
                           .decimal_out(dec_out)
                         );
endmodule
```
### 電路驗證圖
![](https://hackmd.io/_uploads/Skjt5Dmba.jpg)
**Reset_n驗證**
![](https://hackmd.io/_uploads/B1ZCTdXZp.jpg)

**Preset驗證**
![](https://hackmd.io/_uploads/Hyd-iPQ-p.jpg)
**Input Computation驗證**

驗證結果皆與真值表相同

## 3.FPGA模擬
### A.波型模擬
![](https://hackmd.io/_uploads/HJrWKsEbT.jpg)
1.Reset 
![](https://hackmd.io/_uploads/S1SXKiNZT.jpg)
2.Preset 
![](https://hackmd.io/_uploads/B1jEYjEZp.jpg)
3.BCD經過Decoder，運算成Decimal結果。
### B.Elaborate Design 
![](https://hackmd.io/_uploads/rkImDOXWa.jpg)
**圖:Defalt Layout**

![](https://hackmd.io/_uploads/SJfwduQ-a.jpg)
**圖:I/O Planning**

![](https://hackmd.io/_uploads/BkwuduXb6.jpg)
**圖:Floorplanning**

### C.Synthesis
![](https://hackmd.io/_uploads/S1fH2OXW6.jpg)
**圖:synthesis後Layout**

![](https://hackmd.io/_uploads/SkIOh_XWp.jpg)
**圖:Power**

![](https://hackmd.io/_uploads/SkDvsdQbp.jpg)
**圖:Timing**

![](https://hackmd.io/_uploads/HyuyvmEWp.jpg)
**圖:Area**

## 4.FPGA開發板模擬
xdc腳位配置為:
左變的兩顆Switch由左向右分別是Reset_n/Preset
右邊的四個Bottom由左至由分別為bcd_input的MSB到LSB
輸出則由PModA/PModB輸出至右邊的LED燈，由下往上分別為decimal_output的MSB到LSB

結果討論:
![Reset0Preset0.jpg](https://hackmd.io/_uploads/rJcEOOP7p.jpg)
1.Reset_n=0, Preset=0,不論輸入,輸出皆為0

![Reset0Preset1.jpg](https://hackmd.io/_uploads/r1ilYuw7a.jpg)
2.Reset_n=0, Preset=1,由於Reset的優先權更高，所以執行Reset功能,輸出0

![Reset1Preset1.jpg](https://hackmd.io/_uploads/By64K_vma.jpg)
3.Reset_n=1, Preset=1,由於Preset_n沒有啟動,故執行Preset功能,輸出00_0000_1111

**接下來的Reset_n=1, Preset=0,故結果將由bcd_in進行決定:**
![input0.jpg](https://hackmd.io/_uploads/BJOM5dw7p.jpg)
a. bcd_in=0000(0), dec_out=11_1111_1110
![input1.jpg](https://hackmd.io/_uploads/ByR4cuP7T.jpg)
b. bcd_in=0001(1), dec_out=11_1111_1101
![input2.jpg](https://hackmd.io/_uploads/HyBL9_PQa.jpg)
c. bcd_in=0010(2), dec_out=11_1111_1011
![input3.jpg](https://hackmd.io/_uploads/rJmtanPQa.jpg)
d. bcd_in=0011(3), dec_out=11_1111_0111
![input4.jpg](https://hackmd.io/_uploads/BJ03pnvma.jpg)
e. bcd_in=0100(4), dec_out=11_1110_1111
![input5.jpg](https://hackmd.io/_uploads/r10C6hPmT.jpg)
f. bcd_in=0101(5), dec_out=11_1101_1111
![input6.jpg](https://hackmd.io/_uploads/S13x0hDm6.jpg)
g. bcd_in=0110(6), dec_out=11_1011_1111
![input7.jpg](https://hackmd.io/_uploads/BkXQAhvmT.jpg)
h. bcd_in=0111(7), dec_out=11_0111_1111
![input8.jpg](https://hackmd.io/_uploads/SJtr02wXT.jpg)
i. dec_in=1000(8), dec_out=10_1111_1111
![input9.jpg](https://hackmd.io/_uploads/BkS2AhPQa.jpg)
j. dec_in=1001(9), dec_out=01_1111_1111
![input10.jpg](https://hackmd.io/_uploads/ryodx6wm6.jpg)
k. dec_in=1010(10), dec_out=11_1111_1111(全亮)
(輸入10-15輸出結果皆為11_1111_1111，所以只顯示輸入10結果)

結果都與真值表相同!

## 5.實驗心得與討論
觀察下來，Schematic與我所設計的RTL一致，經由ROM先儲存由BCD計算出的Decimal結果，再由兩個MUX決定Reset/Preset/Decoder Compute的輸出Priority選擇。

Power方面，Core因為是小電路，只有0.034W
Timing因為是Combinational電路，所以沒有Slack的問題
Area因為是小電路，所以暫的總比例也很小。

並且也實際利用了FPGA開發版進行測試，讓我們操作完整的FPGA流程，及對開發版的使用上更加熟練，並增加對此電路的理解。

經過這次實驗下來，我認為可以嘗試去做不同的設計，並觀測不同設計做出來的結果誤差，並思考如何trade-off和最佳化是很重要的

## 6.參考文獻
https://www.ti.com/lit/ds/sdls109/sdls109.pdf

