# HW1 vivado usage (4-bit full adder ) --- [TOC] ## 1.實驗目的 此次實驗的目的是使用FPGA,模擬4-bit的full adder,讓我學會除了Cell-Based流程外,還兼具跑過整套FPGA的流程,這兩者的經驗。 ## 2.電路設計與驗證 4bit Full Adder電路的設計,是利用四個1bit full adder串接,組成一個4bit full adder電路。 ### (A).1bit_adder 1bit full adder的電路圖如下: ![](https://hackmd.io/_uploads/ByzDS5FxT.jpg) 由A、B、Cin作為輸入,並輸出S和進位Cout。 以下為1bit full adder的Verilog Code: ``` module fadd ( a, b, cin, s, cout ); input a,b,cin; output s,cout; wire s,cout; assign {cout,s} = a + b + cin; endmodule ``` ### (B).4bit_adder 4bit_full adder電路圖如下: ![](https://hackmd.io/_uploads/H1PLuqKep.jpg) 由四個1bit full adder串聯所組成,Top Module輸入為4bit的 r1 , r2 和1bit的 cin ,輸出為4bit的 sum 還有進位 cout,使用4個 1bit full adder Sub Module組成 以下為4bit full adder的Verilog Code。 ``` module add4_implict ( s, cout, r1, r2, ci ); input [3:0] r1, r2; input ci; output [3:0] s; output cout; wire [3:0] r1,r2; wire ci; wire [3:0] s; wire cout,c1,c2,c3; fadd u0( .a (r1[0]), .b (r2[0]), .cin (ci), .s (s[0]), .cout (c1) ); fadd u1( .a (r1[1]), .b (r2[1]), .cin (c1), .s (s[1]), .cout (c2) ); fadd u2( .a (r1[2]), .b (r2[2]), .cin (c2), .s (s[2]), .cout (c3) ); fadd u4( .a (r1[3]), .b (r2[3]), .cin (c3), .s (s[3]), .cout (cout) ); endmodule ``` ### (C ).電路驗證 testbench的設計上,利用迴圈來驗證輸出結果的正確性。 testbench驗證部分的Verilog Code如下: ``` integer i,j,k; initial begin #0 data_a = 4'd0; data_b = 4'd0; cin = 1'b0; $monitor("data_a = %b ,data_b = %b ,cin =%b ,sum = %b ,cout = %b",data_a,data_b,cin, sum,cout); for(k=0 ; k<2 ; k++) begin for( i=0 ; i<16 ; i++ ) begin for (j=0 ; j<16 ; j++ ) begin #10 data_b = data_b + 4'b1; end data_a = data_a + 4'b1; end cin = cin + 1'b1; end end ``` 驗證的結果圖,從Top Module 輸入 r1 , r2 , cin 皆為為 bit'0,到 r1 , r2 , cin 皆為bit'1中止,驗證圖如下: ![](https://hackmd.io/_uploads/SkQTEjtxp.jpg) 從輸入每一Bit皆為0開始模擬 ![](https://hackmd.io/_uploads/r1AkrsFgp.jpg) 模擬至輸入每一Bit皆為1 並且使用gtkwave進行波型的模擬。 波型圖如下: ![](https://hackmd.io/_uploads/SJgSLiFeT.jpg) 綠色波型為輸入r1,r2 橘色波型為輸入cin 黃色波型為輸出sum 紅色波型為進位cout ## 3.FPGA模擬 在設計完電路的Verilog和驗證後,接下來把Verilog Code和testbench丟進Vivado,來進行FPGA的模擬。 一開始丟進Vivado後,也可以在Vivado內觀測電路波型,如下圖: ![](https://hackmd.io/_uploads/SyzIVhYep.jpg) 模擬完波型後,就可以進行RTL分析了,觀察Elaborate Design。而什麼是Elaborate呢? Elaborate就是單純對RTL Code的設計上進行電路分析。 Elaborate Design開啟後,可以觀察到Default Layout,I/O Planning,Floor Planning.如下圖 ![](https://hackmd.io/_uploads/By6KUhFlT.jpg) 圖a.Defalut Layout ![](https://hackmd.io/_uploads/Sy_eqhFeT.jpg) 圖b.Default Layout內部電路圖 ![](https://hackmd.io/_uploads/BkPhI3tep.jpg) 圖c. I/O Planning ![](https://hackmd.io/_uploads/HJ3pU2Ygp.jpg) 圖d. Floor Planning 觀察完RTL後,就可以進入邏輯合成(Synthesis)的分析了。 再跑完Synthesis後,就可以看到最佳化邏輯閘的實體電路了,如下圖: ![](https://hackmd.io/_uploads/SJJZdnYg6.jpg) 同時,也能觀察到Power timing等等,例如Power觀測,如下圖: ![](https://hackmd.io/_uploads/BkGNdEcla.jpg) ## 4.實驗心得 初次FPGA學習體驗讓我深刻的體會到了使用FPGA來跑模擬的速度真的比Cell-Based來得快許多,並且還能夠直接下到FPGA版上去做模擬!這比起等待晶片下線的速度快上許多。 這次的實驗也讓我有了對FPGA的基本知識,讓我能夠跑完一次簡易的FPGA流程,但如同Cell-Based一般,還有許多的Constraint需要去做設定與調整,所以還有很多的經驗需要去繼續續學習。