# 軟硬體協同設計HW2 ### ● 作業標題:BCD to Decimal Decoder with Preset/Reset ### ● 班級姓名座號:國立高雄大學電機系大四 B1095117 黃致衡 ### ● 授課老師:林宏益教授 --- ## 一、作業內容: ### 將 4bits 的binary inputs 訊號轉成 10bits 的 output 訊號,並使用 preset 與 reset_n 進行重設。 ## 二、實作步驟: ### 1. 撰寫 BCD decoder 的 RTL code (bcd__decoder.v) ``` module bcd_decoder ( in, // I 4-bit out, // O 10-bit preset, // I 1-bit reset_n // I 1-bit ); input [3:0] in; input preset, reset_n; output [9:0] out; reg [9:0] out; always @(*) begin if (reset_n == 1) if (preset == 1) out = 10'b11110_00000; else case (in) 4'b0000: out = 10'b11111_11110; 4'b0001: out = 10'b11111_11101; 4'b0010: out = 10'b11111_11011; 4'b0011: out = 10'b11111_10111; 4'b0100: out = 10'b11111_01111; 4'b0101: out = 10'b11110_11111; 4'b0110: out = 10'b11101_11111; 4'b0111: out = 10'b11011_11111; 4'b1000: out = 10'b10111_11111; 4'b1001: out = 10'b01111_11111; 4'b1010: out = 10'b11111_11111; 4'b1011: out = 10'b11111_11111; 4'b1100: out = 10'b11111_11111; 4'b1101: out = 10'b11111_11111; 4'b1110: out = 10'b11111_11111; 4'b1111: out = 10'b11111_11111; endcase else out = 10'b00000_00000; end endmodule ``` > 此處為使流程清晰化,並未使用 case 函數中的 default 語法。 ### 2. 再撰寫 Testbench 並設定 $random 使其產生數組 in 測試數據(bcd__decoder__tb.v) ``` `timescale 1ns/100ps `include "bcd__decoder.v" module bcd_decoder_tb; reg [3:0] IN; reg PRESET, RESET_N; wire [9:0] OUT; integer i; bcd_decoder bcd_decoder_try (.in(IN), .out(OUT), .preset(PRESET), .reset_n(RESET_N)); initial begin $dumpfile("hw_and_sw_hw2.vcd"); $dumpvars(0, bcd_decoder_tb); $monitor("IN = %b, OUT = %b, PRESET = %b, RESET_N = %b", IN, OUT, PRESET, RESET_N); RESET_N = 1'b0; #10 RESET_N = 1'b1; PRESET = 1'b0; #50 PRESET = 1'b1; #30 PRESET = 1'b0; end initial begin for (i=1 ; i<=100 ; i=i+1) #10 IN = {$random} % 16; #10 $finish; end endmodule ``` > RESET_N 與 PRESET 皆參考真值表的結果所進行設定,將 high impedance 的結果設於初始狀態。 ### 3. 使用 lcarus Verilog 經過 compile 產生 .vcd檔,並使用 GTKWave 查看 simulation 的波型結果 ### 4. 開啟 Xilinx Vivado 並進行 Synthesis for FPGA ### 5. 更改所使用板子的 .xdc檔案中的 I/O 腳位最後進行燒錄 ![305854_0.jpg](https://hackmd.io/_uploads/SkjdH2wXa.jpg) ## 三、實作結果: ### ◎ .vcd ![](https://hackmd.io/_uploads/HyOX0sZZp.png) ### ◎ schematic ![](https://hackmd.io/_uploads/rJYeCo-Wa.png) ### ◎ reports ![](https://hackmd.io/_uploads/H1HIJhWZ6.png) ### ◎ .xdc 設定 ![hw2_xdc.png](https://hackmd.io/_uploads/rkVPUhwQT.png) > reset_n 與 preset 使用 switches 啟動。 ### ◎ FPGA 實作畫面 ![305855_0.jpg](https://hackmd.io/_uploads/HyDo72wmT.jpg) ## 四、實驗討論: ### 1. 請說明所撰寫的 RTL 與 schematic 是否有差別 ### 如圖一,可見到在程式碼中使用了兩層的 if 語法來進行編寫,因此在 schematic 圖上則有兩層 MUX 的設計結果,符合我預期中的結構圖。 ### 2. 依據 vivado 所提供的分析報告(功率分析, 面積報告或時序),提供你什麼樣的想法? ### 學生發現在**功率分析**的部分與我之前其他作業來比較為高,之前寫了一個 32bits 的加法器但功耗卻僅有 0.121W,而此份報告只是 combinational logic 但功耗卻已達到 2.675W ,不知是否為 Case 語法的因素使然。 而在**面積報告**的部分則可見到大部分的晶片面積都用在了 I/O 上,其餘的部分微乎其微。 最後在**時序分析**的部分則顯示為 N/A ,由於此份作業為 combinational logic ,並無 clock 等 squential logic 的介入,因此在時序分析上則為空白。 ## 五、實驗心得: ### 本次的作業屬於經典題目,不過可見到老師在 reset 的部分則進行了部分修改,使這份作業在製作的過程中,學生花費了些許的時間對波型進行了驗證,並由於在程式編寫的時候 $monitor 的位置亂放,導致在波型輸出的結果一開始並沒有從 0ns 開始,這樣的低級錯誤甚至有點讓本來就不充裕的信心有些許打擊。 而第二個打擊的部分是在 Xilinx Vivado 的設定,在跑出 reports 之前,學生好不容易通過了 synthesis 的過程,但在最後的 implementation 時卻跑出了錯誤,顯示我在對空電路進行模擬,瞬間一堆問號在我頭上展開,由於學生的畢業專題也使用過此環境撰寫 RTL code ,因此在面臨此問題時甚至是百思不得其解的,最後靠著先前上課的環境設定講義才把 implementation 的對象設定好,原來學生先前是在對 testbench 進行模擬阿......整個傻眼 = = 總之這次的作業在程式碼的部分,還有許多我認為可以改善的部分,尤其以超過 10 (含)以上的數值,皆用 (1111111111)~2~ 來表示的部分,學生想了解是否有其餘的方式可以節省其硬體使用資源等等。 ## 六、參考文獻: > EEF946〈軟硬體協同設計〉課堂參考講義