# 軟硬體協同設計HW3、HW4 ### ● HW3 作業標題:Decimal to 7-seg display with Reset ### ● HW4 作業標題:FPGA implementation for Decimal to 7-Seg Display ### ● 班級姓名座號:國立高雄大學電機系大四 B1095117 黃致衡 ### ● 授課老師:林宏益教授 --- ## 一、作業內容: ### 將 4bits 的 binary inputs 訊號轉成 8bits 的 output 訊號以供七段顯示器使用,並使用 reset_n 進行重設。 ## 二、實作步驟: ### 1. 撰寫 Decimal to 7-Seg 的 RTL code (decimal__to__7_seg.v) ``` module decimal_to_7_seg ( dec_in, // I 4-bit seven_seg_out, // O 10-bit reset_n // I 1-bit ); input [3:0] dec_in; input reset_n; output [7:0] seven_seg_out; reg [7:0] seven_seg_out; always @(dec_in, reset_n) begin if (reset_n == 0) seven_seg_out = 8'b10010001; //H else case (dec_in) 4'b0000: seven_seg_out = 8'b00000011; //0 4'b0001: seven_seg_out = 8'b10011111; //1 4'b0010: seven_seg_out = 8'b00100101; //2 4'b0011: seven_seg_out = 8'b00001101; //3 4'b0100: seven_seg_out = 8'b10011001; //4 4'b0101: seven_seg_out = 8'b01001001; //5 4'b0110: seven_seg_out = 8'b01000001; //6 4'b0111: seven_seg_out = 8'b00011111; //7 4'b1000: seven_seg_out = 8'b00000001; //8 4'b1001: seven_seg_out = 8'b00001001; //9 4'b1010: seven_seg_out = 8'b00010001; //A 4'b1011: seven_seg_out = 8'b11000001; //B 4'b1100: seven_seg_out = 8'b11100101; //C 4'b1101: seven_seg_out = 8'b10000101; //D 4'b1110: seven_seg_out = 8'b01100001; //E 4'b1111: seven_seg_out = 8'b01110001; //F default: seven_seg_out = 8'b00000000; //X endcase end endmodule ``` > 此處使用 case 函數中的 default 語法以避免產生 latch 的可能,並將 default 值設定為七段顯示器會全亮的 (00000000)~2~。 > > 註解表七段顯示器愈顯示的數字與文字。 ### 2. 再撰寫 Testbench 並設定使其從 0 數到 15 用以產生數組 DEC_IN 測試數據(decimal__to__7_seg__tb.v) ``` `timescale 1ns/100ps //`include "decimal__to__7_seg.v" module decimal_to_7_seg_tb; reg [3:0] DEC_IN; reg RESET_N; wire [7:0] SEVEN_SEG_OUT; integer i; decimal_to_7_seg decimal_to_7_seg_try (.dec_in(DEC_IN), .seven_seg_out(SEVEN_SEG_OUT), .reset_n(RESET_N)); initial begin RESET_N = 1'b0; #10 RESET_N = 1'b1; end initial begin for (i=0 ; i<=100 ; i=i+1) #10 DEC_IN = i % 16; #10 $finish; end initial begin $dumpfile("hw_and_sw_hw3.vcd"); $dumpvars(); //$sdf_annotate("decimal__to__7_seg.sdf", decimal_to_7_seg_tb); $fsdbDumpfile("decimal__to__7_seg.fsdb"); $fsdbDumpvars; $monitor("IN = %b, OUT = %b, RESET_N = %b", DEC_IN, SEVEN_SEG_OUT, RESET_N); end endmodule ``` > $fsdbDumpfile 與 $fsdbDumpvars 為後續使用 EDA cloud 時所需的語法設定。 > > timescale 在使用 VCS compiler 時需隱藏。 ### 3. 使用 lcarus Verilog 經過 compile 產生 .vcd檔,並使用 GTKWave 預先查看合成前 simulation 的波型結果 ![](https://hackmd.io/_uploads/rkgzyp5GT.png) > 可見得 simulation 之結果符合 truth table 預期,因此得以進行下列步驟。 ### 4. 使用 EDA cloud 將上述步驟改於工作站進行,並重新撰寫 Verilog codes ### 5. 將 (decimal__to__7_seg.v) 與 (decimal__to__7_seg__tb.v) 使用設定好的 filelist.f 與 makefile 後,改用 VCS compiler 產生 (decimal__to__7_seg.fsdb) 檔 ### 6. 開啟 Verdi 檢視 RnWave 波型運行結果 ### 7. 登出 EDA cloud,開啟 Xilinx Vivado 並進行 Synthesis for FPGA ![](https://hackmd.io/_uploads/H1KQgp5M6.png) > 得到 implemantation 的結果。 ### 8. 更改所使用板子的 .xdc 檔案中的 I/O 腳位最後進行燒錄 ![hw3_xdc.png](https://hackmd.io/_uploads/rJTFD3DQ6.png) > reset_n 使用 switches 啟動。 ![20231107_172051.jpg](https://hackmd.io/_uploads/SyqJk2PXa.jpg) ## 三、實作結果: ### ◎ RnWave ![](https://hackmd.io/_uploads/HyZLus0fp.png) ### ◎ schematic #### 1. 在 Vivado 上開啟合成前圖片 ![](https://hackmd.io/_uploads/rkUMM6qGp.png) #### 2. 在 Vivado 上開啟合成後圖片 ![](https://hackmd.io/_uploads/rkUIM6qMa.png) #### 3. 使用 Verdi 開啟 ![](https://hackmd.io/_uploads/rkocfpcG6.png) ### ◎ FPGA 實作畫面 ![305837_0.jpg](https://hackmd.io/_uploads/Sy8hZhPXT.jpg) > 當輸入 reset_n == 0 時,輸出 H 字型。 ![305836_0.jpg](https://hackmd.io/_uploads/SyRCGhP7T.jpg) ![305838_0.jpg](https://hackmd.io/_uploads/ryYczhDQT.jpg) ![305839_0.jpg](https://hackmd.io/_uploads/r1YcGhvX6.jpg) ![305840_0.jpg](https://hackmd.io/_uploads/rJK5MhDXa.jpg) ![305841_0.jpg](https://hackmd.io/_uploads/HyKcM2wmp.jpg) ![305842_0.jpg](https://hackmd.io/_uploads/HyYqz3DQ6.jpg) ![305843_0.jpg](https://hackmd.io/_uploads/H1YqGhwmp.jpg) ![305844_0.jpg](https://hackmd.io/_uploads/Bks3M2DX6.jpg) ![305845_0.jpg](https://hackmd.io/_uploads/Bk23z2DmT.jpg) ![305846_0.jpg](https://hackmd.io/_uploads/H1h3z3DXp.jpg) ![305847_0.jpg](https://hackmd.io/_uploads/B1n3f3wXa.jpg) ![305848_0.jpg](https://hackmd.io/_uploads/H133G2vXp.jpg) ![305849_0.jpg](https://hackmd.io/_uploads/B12hM3Dm6.jpg) ![305850_0.jpg](https://hackmd.io/_uploads/Sknnzhw76.jpg) ![305853_0.jpg](https://hackmd.io/_uploads/H1n2z2Dmp.jpg) ![305852_0.jpg](https://hackmd.io/_uploads/HJ23M2vma.jpg) ## 四、實驗心得: ### 本次的作業在撰寫 Verilog 的部分不算過於困難,與 HW2 的內容相似,但在使用 EDA cloud 的部分可就麻煩了,由於不熟悉工作站的指令操作以及其所涵蓋的軟體資源,可以說在使用工作站時所遇到的問題是困難重重,再加上學生所使用的筆記型電腦的 CPU 為 i3-3120M 屬於年代久遠的硬體設備,完全無法支撐運行虛擬機 NX client 的運行環境,只好換一台設備再繼續戰。 ## 五、參考文獻: > EEF946〈軟硬體協同設計〉課堂參考講義