## Decimal to 7-seg display with Reset實驗報告
### B1095165 黃瑄凱 指導教授:林宏益
## 一、實驗目的
>本實驗的目的是設計一個電路,將十進制數字轉換為7段顯示器的輸入,同時具有重置功能,以實現對數字的有效顯示和重置。
## 二、實驗原理&實驗背景
### 原理:
>在本實驗中,我們使用Verilog程式碼來實現數字轉換和7段顯示的控制。我們將使用Vivado軟體來合成和驗證我們的設計。
### 背景:
>7段顯示器是一種常見的數字顯示設備,通常由7個LED段組成,用於顯示0到9的數字。本實驗旨在演示如何將十進制數字轉換為7段顯示器的輸入信號,同時實現一個可重置的電路,以清除顯示。
## 三、實驗材料:
* Verilog HDL程式碼
* Testbench
* 電路示意圖
* VCS編譯器
* Verdi模擬工具
## 四、實驗步驟:
1.編寫Verilog HDL程式碼,包括數字轉換和重置功能。
2.創建相應的Testbench來驗證設計的正確性。
3.使用VCS編譯器進行合成。
4.使用Verdi工具進行模擬驗證。
## 五、實驗結果:
* Verilog HDL程式碼
```
module SEG(input [3:0] BCD, input reset_n, output reg [7:0] segment); //segment: abcdefg(dp)
always @(*) begin
if (reset_n == 1'b1) begin
case (BCD)
4'd0 : segment = 8'b00000011;
4'd1 : segment = 8'b10011111;
4'd2 : segment = 8'b00100101;
4'd3 : segment = 8'b00001101;
4'd4 : segment = 8'b10011001;
4'd5 : segment = 8'b01001001;
4'd6 : segment = 8'b01000001;
4'd7 : segment = 8'b00011111;
4'd8 : segment = 8'b00000001;
4'd9 : segment = 8'b00001001;
4'd10: segment = 8'b00010001;
4'd11: segment = 8'b11000001;
4'd12: segment = 8'b11100101;
4'd13: segment = 8'b10000101;
4'd14: segment = 8'b01100001;
4'd15: segment = 8'b01110001;
endcase
end
else segment = 8'b10010001;
end
endmodule
```
* Testbench模擬結果

* 電路圖

## 六、實驗討論:
>透過Reset的設定,我們能夠讓電路恢復到初始狀態並重新執行,並且在delay的部分也沒有問題。
>而在這次實驗中,遇到的問題是CLK沒有被讀取到,以及decimal input的部分為X沒有被讀取到,這些部分在修正HDL以及參考[1]的文獻才得以解決。
## 七、實驗心得:
>在這個實驗中,我們完成了七段顯示器,並且包含了reset的功能,不僅讓我熟悉到了Verilog的更多應用,還有深入了解的機會。
>一開始的RTL我參考了許多文獻的寫法,但因為他們沒有reset的部分,以及dp獨立寫。他們的寫法像是下面提及的程式碼:
```
module SevenSegmentDisplay(
input wire [3:0] input_number, // 4-bit input for the number to be displayed
output wire [6:0] segments // 7 output segments (a, b, c, d, e, f, g)
);
// 7-segment display patterns for numbers 0-9
reg [6:0] segment_patterns [9:0];
initial begin
segment_patterns[0] = 7'b1000000; // 0
segment_patterns[1] = 7'b1111001; // 1
segment_patterns[2] = 7'b0100100; // 2
segment_patterns[3] = 7'b0110000; // 3
segment_patterns[4] = 7'b0011001; // 4
segment_patterns[5] = 7'b0010010; // 5
segment_patterns[6] = 7'b0000010; // 6
segment_patterns[7] = 7'b1111000; // 7
segment_patterns[8] = 7'b0000000; // 8
segment_patterns[9] = 7'b0010000; // 9
end
assign segments = segment_patterns[input_number];
endmodule
```
>在這個寫法中我修改了許多次都沒能順利執行,最後跟同學討論使用統一賦值的方式來撰寫才順利完成這次的實驗。
## 八、參考文獻:
[1]How to Control 7-Segment Displays on Basys3 FPGA using Verilog in Vivado.
FPGA Discovery,2022
https://www.youtube.com/watch?v=ORhWNj8li4E&ab_channel=FPGADiscovery%28LearningHowtoWorkwithFPGAs%29
[2]桐桐花,"Verilog——7段数码管译码器."CSND博客,2021
https://blog.csdn.net/weixin_41788560/article/details/118085450
[3]李锐博恩,"FPGA基础知识极简教程(9)七段数码管显示的Verilog简单设计.",2020
https://blog.csdn.net/Reborn_Lee/article/details/106878249
## 九、實驗成果:
[模擬影片](https://youtu.be/i-Lb0uStMt4)
在這個實驗中,我們完美的達成了預期成果。