---
# System prepended metadata

title: Decimal to 7_seg display with Reset

---

#  Decimal to 7_seg display with Reset
---
## 學生: B1105142 李旼學
## 指導教授:林宏益教授
---

## 報告內容

### 一.實驗目的:
使用vscode撰寫verilog和testbench, 並使用EDA cloud 進行模擬分析.

### 二.實驗材料:
vscode , EDA cloud , vivado

### 三.實驗結果:

![螢幕擷取畫面 2023-11-07 222439.png](https://hackmd.io/_uploads/ryyJDYd7T.png)
▴上圖為此次實驗在EDA cloud跑出的波形圖
可以發現在reset為0時,不論輸入如何改動,輸出始終保持為8'b10010001,而當reset變為1時,觀察out的16進制輸出,對應到7段顯示器的a到g以及dp,可看出符合我們想設計的7段顯示器真值表。

![螢幕擷取畫面 2023-11-08 120839.png](https://hackmd.io/_uploads/ryvRYKuX6.png)
▴上圖為此次實驗在vivado跑出的波形圖
可看出基本上與在EDA cloud跑出的結果一致

![螢幕擷取畫面 2023-11-08 121216.png](https://hackmd.io/_uploads/By4pct_X6.png)
▴上圖為RTL schematic圖
基本上與寫出的verilog相符,由reg宣告的4個變數以及reset,通過mux選擇後輸出7段顯示器的output。

![螢幕擷取畫面 2023-11-08 121806.png](https://hackmd.io/_uploads/Hyyfht_X6.png)
▴上圖implementation圖

![S__2130007.jpg](https://hackmd.io/_uploads/SJIm-c_Xa.jpg)
[7seg_desplay](https://youtu.be/zVf8zq_Utc4)
▴以上是在FPGA上的實作,由於擔心圖片過多,可以點連結觀看錄影

### 四.程式碼:
```
module decimal_7seg(decimal_input,seg7_output,reset_n);

input  [3:0] decimal_input;
input  reset_n;
output [7:0] seg7_output ;
reg    [7:0]seg7_output ;

always @(decimal_input or reset_n)
begin
    if(reset_n==1)
    case(decimal_input)
    4'b0000: seg7_output = 8'b00000011;
    4'b0001: seg7_output = 8'b10011111;
    4'b0010: seg7_output = 8'b00100101;
    4'b0011: seg7_output = 8'b00001101;
    4'b0100: seg7_output = 8'b10011001;
    4'b0101: seg7_output = 8'b01001001;
    4'b0110: seg7_output = 8'b01000001;
    4'b0111: seg7_output = 8'b00011111;
    4'b1000: seg7_output = 8'b00000001;
    4'b1001: seg7_output = 8'b00001001;
    4'b1010: seg7_output = 8'b00010001;
    4'b1011: seg7_output = 8'b11000001;
    4'b1100: seg7_output = 8'b11100101;
    4'b1101: seg7_output = 8'b10000101;
    4'b1110: seg7_output = 8'b01100001;
    4'b1111: seg7_output = 8'b01110001;
    endcase
    else
        seg7_output = 8'b10010001;

end

endmodule
```
▴以上是.v檔

```
module decimal_7seg_tb;

reg [3:0] ln; // decimal_input
reg reset_n;
wire[7:0] out;// 7seg_output
initial
begin
    $dumpfile("decimal_7seg.vcd");
    $dumpvars(0, s);
    $monitor("ln = %b, reset_n = %b | out=%b ",ln,reset_n,out );
    ln=4'b0000; reset_n=1'b0;
    repeat(15)
    begin
    #50 ln=ln+1;
    end
    ln=4'b0000; reset_n=1'b1;
    repeat(15)
    begin
    #50 ln=ln+1;
    end
end

decimal_7seg s(
    .decimal_input(ln),
    .reset_n(reset_n),
    .seg7_output(out)
);

endmodule
```
▴以上是tb.v檔

### 五.實驗討論:

![螢幕擷取畫面 2023-11-08 122422.png](https://hackmd.io/_uploads/S1156FOmT.png)
▴上圖是這次的功率分析

實際上這次的power report,我執行了兩次,因為第一次分析時,在程式碼以及電路圖都沒有更動的情況下,分析出來的功耗接近6w,而且junction temperature接近百度,導致結果看起來很奇怪。而在第二次執行時,就回復正常了,不知道是不是vivado本身程式上的問題。回到電路分析,在動態功率方面,I/O一樣佔了大宗,但稍微詢問過碩班學長,只需要專注在看logic的部分即可,而logic的功耗看起來並不吃掉電路本身大部分的功率,但由於無從比較,我想之後可以想出不同的設計方法,之後再透過分析,比較兩者之間logic上的功耗。

![螢幕擷取畫面 2023-11-08 124257.png](https://hackmd.io/_uploads/HyWJM5OQa.png)
▴以上是這次的面積使用率

### 六.實驗心得:
在這次的實驗中,學到了很多新東西,也應用到老師上課說的很多觀念,像是blocking跟nonblocking的概念,之前在寫case的時候,在裡面運算都是用<=的符號,但在組合邏輯中,只要寫=即可,雖然compier可能會自動幫忙修正,但還是要維持良好的codeing style,不能只依靠tool的幫忙。再來就是if-else的搭配,一個if必須搭配一個else,不然會合成出latch,所以這次在reset選擇的部分,就利用了這個觀念。最後就是FPGA的部分,雖然在第一個加法器的實驗很順利,但這次在跑bitstream時一直出問題,vivado顯示place_route error,經過助教幫忙調整了2hr左右,試過了很多可能出現的問題,但還是沒辦法解決,後來在程式碼等等資源沒變動的情況,莫名其妙的就過了,也算是實驗的一個小插曲,加上問助教問題的時間,就一路從4點待到了快11點,但能親手完成電路的執行,也收穫滿滿的成就感,希望再接續的實驗能夠繼續努力。










