## 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模擬結果 ![](https://hackmd.io/_uploads/rJpxah0zp.png) * 電路圖 ![](https://hackmd.io/_uploads/SyNJ1aCMT.png) ## 六、實驗討論: >透過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) 在這個實驗中,我們完美的達成了預期成果。