# Decimal to 7_seg display with Reset
---
## 學生: B1105142 李旼學
## 指導教授:林宏益教授
---
## 報告內容
### 一.實驗目的:
使用vscode撰寫verilog和testbench, 並使用EDA cloud 進行模擬分析.
### 二.實驗材料:
vscode , EDA cloud , vivado
### 三.實驗結果:

▴上圖為此次實驗在EDA cloud跑出的波形圖
可以發現在reset為0時,不論輸入如何改動,輸出始終保持為8'b10010001,而當reset變為1時,觀察out的16進制輸出,對應到7段顯示器的a到g以及dp,可看出符合我們想設計的7段顯示器真值表。

▴上圖為此次實驗在vivado跑出的波形圖
可看出基本上與在EDA cloud跑出的結果一致

▴上圖為RTL schematic圖
基本上與寫出的verilog相符,由reg宣告的4個變數以及reset,通過mux選擇後輸出7段顯示器的output。

▴上圖implementation圖

[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檔
### 五.實驗討論:

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

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