# 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點,但能親手完成電路的執行,也收穫滿滿的成就感,希望再接續的實驗能夠繼續努力。