# BCD to Decimal Decoder with Preset/Reset --- ### 學生: B1105142 李旼學 ### 指導教授:林宏益教授 --- ## 報告內容 ## 一.實驗目的: 使用vscode撰寫verilog的程式碼以及test bench,並匯入vivado進行模擬分析,並檢查是否與原先所設計的電路符合。 ## 二.實驗材料: vscode,vivado ## 三.實驗結果: ![螢幕擷取畫面 2023-11-08 104301.png](https://hackmd.io/_uploads/Hk5fIuump.png) ![螢幕擷取畫面 2023-11-08 104333.png](https://hackmd.io/_uploads/S1fNIu_7p.png) ![螢幕擷取畫面 2023-11-08 104407.png](https://hackmd.io/_uploads/S19V8_dQ6.png) ▴上圖為此次實驗的波形圖 根據老師以及碩班學長的經驗分享,應該先檢驗較為重要的reset以及preset, 再做其他部分的驗證,因此我稍微更改了testbench,來符合檢驗的步驟。首先 ,b是我的reset,c是我的preset。可以觀察到當reset腳位是0時,output全數為0,而當兩者同時為1時,輸出變為8'b11110000,而當reset為1且preset為0時,則觀察輸入腳位,此時輸入4'b0000,所以輸出為8'b11111110,也符合真值表的結果,後續的波形圖也都符合。 ![螢幕擷取畫面 2023-11-08 105852.png](https://hackmd.io/_uploads/BJc0tuuXp.png) ▴上圖為此次實驗的RTL schematic圖 ![螢幕擷取畫面 2023-11-08 110607.png](https://hackmd.io/_uploads/HksNiudQa.png) ▴上圖為此次實驗的implementation圖 ![S__2130008.jpg](https://hackmd.io/_uploads/BJgOK9uX6.jpg) [bcd_decoder](https://youtube.com/shorts/-gYq-IgniOQ) ▴以上是FPGA實驗,可從連結登入觀看影片 ## 四.程式碼: ``` module bcd_decoder(bcd_input,decimal_output,reset,preset); input [3:0] bcd_input; //4bit輸入 input reset; input preset; output [9:0] decimal_output; //10bit輸出 reg [9:0] decimal_output; always @(bcd_input or reset or preset) //使用always block寫case begin if(reset==0) decimal_output = 10'b0000000000; else if (reset==1 && preset==1) decimal_output = 10'b1111000000; else if (reset==1 && preset==0) case (bcd_input) 4'b0000: decimal_output = 10'b1111111110; 4'b0001: decimal_output = 10'b1111111101; 4'b0010: decimal_output = 10'b1111111011; 4'b0011: decimal_output = 10'b1111110111; 4'b0100: decimal_output = 10'b1111101111; 4'b0101: decimal_output = 10'b1111011111; 4'b0110: decimal_output = 10'b1110111111; 4'b0111: decimal_output = 10'b1101111111; 4'b1000: decimal_output = 10'b1011111111; 4'b1001: decimal_output = 10'b0111111111; 4'b1010: decimal_output = 10'b1111111111; 4'b1011: decimal_output = 10'b1111111111; 4'b1100: decimal_output = 10'b1111111111; 4'b1101: decimal_output = 10'b1111111111; 4'b1110: decimal_output = 10'b1111111111; 4'b1111: decimal_output = 10'b1111111111; endcase end endmodule ``` ▴以上為bcd_decoder.v檔 ``` module bcd_decoder_tb; reg [3:0] a; //bcd_input reg b; //reset reg c; //preset wire [9:0] d; //decimal_output initial begin $dumpfile("bcd_decoder.vcd"); $dumpvars(0, s); $monitor("a = %b, b = %b, c = %b | d=%b ", a, b, c, d); a=4'bxxxx; b=1'bx;c=1'bx; #50 b=1'b0; //令 reset為0 #50 b=1'b1; c=1'b1; //令 reset preset同時為1 #50 a=4'b0000; b=1; c=1'b0; //令reset為1 preset為0 repeat(15) begin #50 a=a+1; end end bcd_decoder s( .bcd_input(a), .reset(b), .preset(c), .decimal_output(d) ); endmodule ``` ▴以上為bcd_decoder_tb.v檔 ![螢幕擷取畫面 2023-11-08 111523.png](https://hackmd.io/_uploads/SyhDpuum6.png) ▴以上為實驗的vcd檔,由此表可發現與實驗之真值表相同 ## 五.實驗討論: ![img](https://hackmd.io/_uploads/BJ9ThJQ-a.png) ▴上圖為此次實驗的功耗分析 由此分析可看出在功耗中,I/O佔據了極大部分的消耗,大約是信號以及邏輯元件加起來的兩倍多,所以如果想降低此晶片的功耗,一大方式就是優化I/O電路 ,並且在降低功耗的同時,保證晶片的效能。 ![螢幕擷取畫面 2023-11-08 113610.png](https://hackmd.io/_uploads/HJtjGt_m6.png) ▴上圖為此次實驗的面積使用率 ## 六.實驗心得: 由於第一次實驗時,vivado一直無法安裝,所以只能用vscode撰寫完程式後跑出vcd檔檢驗程式碼是否正確。這次成功解決後,便能看到verilog合成出來的電路,感覺十分得不錯。不過在撰寫verilog時,我常常感到很煩惱,因為這是硬體描述語言,並非軟體程式語言,並非結果正確即可,也要考慮到晶片的功耗面積速度等問題,所以儘管有了想法並快速的coding出來,我還是會懷疑這是否是最好的設計方式,有甚麼可改進的地方,不過我也只是一個新手,對設計電路還沒那麼敏銳,有想法卻未必能簡單實現,但我相信透過課堂以及網路上資源的學習,會慢慢培養出感覺,並改進在設計上的缺陷。