代碼和硬件之間的映射關係是一個很奇妙的過程,也展示出人類的智慧。單片機內部的硬件結構都是固定的,沒法改變,咱們經過代碼操做着寄存器的讀寫,來執行各類複雜的任務。FPGA的硬件結構並不像單片機同樣是固定好的,而是由更加原始的基本邏輯單元構成,咱們須要用HDL語言來描述咱們要實現的功能,而並不須要關心硬件的結構是如何構建的,咱們經過使用FPGA廠商的綜合器來將HDL所描述的功能代碼映射到咱們的FPGA基本邏輯單元上,而這個映射的過程是綜合器幫咱們自動完成的,咱們並無直接用語言去操做這些基本邏輯單元,這也能夠理解爲何HDL叫硬件描述語言,而不是硬件語言的緣由。app
咱們使用Verilog語言來描述功能,用Altera CycloneIV系列的EP4CE10F17C8芯片來驗證下面的例子,觀察咱們編寫的Verilog代碼綜合後到底映射到了哪些硬件結構上。咱們經過察看RTL Viewer、Technology Map Viewer(Post Mapping)、Chip Planner來得出驗證分析結果。工具
注:佈局
RTL Viewer:寄存器級的視圖,能夠看到寄存器和門電路,主要體現的是邏輯鏈接關係和模塊間的結構關係,和具體的FPGA器件無關;學習
Technology Map Viewer(Post Mapping):將RTL所表達的結構進行優化,增長或減小一些模塊,更接近於最後底層硬件映射的結果,以便於映射到具體的FPGA器件上。開發工具
Chip Planner:只有進行佈局佈線後纔可以看到,在版圖的模型中真實的表達所使用的資源以及相對位置信息,還有模塊之間的路徑與連線關係均可以顯示出。優化
咱們的例子是給一個輸入信號,而後不進行任何邏輯運算直接輸出spa
1 //-------------------------------------------------- 2 module line( 3 input wire in, 4 5 output wire out 6 ); 7 8 assign out = in; 9 10 endmodule 11 //--------------------------------------------------
代碼編寫完後點擊「Start Analysis & Synthesis」圖標進行分析和綜合。設計
雙擊「Netlist Viewers」下的「RTL Viewer」查看RTLcode
由於代碼就是對RTL級層次的描述,因此RTL視圖只有一根連線,這和咱們代碼設計思想的結果是徹底blog
雙擊「Netlist Viewers」下的「Technology Map Viewer(Post Mapping)」。
咱們能夠看到和RTL視圖不一樣的是輸入端口和輸出端口分別加上了buffer,這是咱們代碼中並無的設計,是綜合器優
雙擊上圖中藍色的buffer能夠看到下圖中三角形的緩衝器。
Chip Planner
點擊「Start Compilation」圖標進行全編譯,此過程會進行佈局不線。
點擊「Chip Planner」圖標打開版圖模型,在「Flow Summary」報告中也能夠看到全編譯後的信息後加詳細,其中只使用了兩個管腳資源。
Chip Planner打開後的界面如圖所示,咱們要找到代碼最後映射到版圖中的具體位置,咱們能夠在紅色框處的「Find what」處搜索定位,若是沒有找到「Find what」,按住鍵盤「Ctrl + F」就會自動出現。
在圖中紅色區域中的「Find what」搜索RTL代碼中的信號名「in」,而後點擊「List」。
繼續點擊「Go Next」。
紅色區域中深藍色的小矩形塊就是輸入信號「in」所映射到版圖模型中的位置
在選中「in」所映射的模塊的前提下點擊圖中左側「Generate Fan-Out Connections」圖標能夠將從該位置扇出的連線顯示出來,一直點擊此扇出線會一致追蹤下去。
咱們看到連線從「in」處開始,到」out「結束,並將」in「和」out「連到一塊兒,這也就說明了代碼中的「in」和「out」之間確實是用一根導線鏈接的。圖中的①至關於咱們外部的管腳輸入進來信號,通過內部連線,從管腳②輸出到外部。咱們分別雙擊①和②打開模塊內部觀察其映射的結構。
咱們看到了一個完整的IOE內部結構,其中藍色顯示的是真實使用到的結構,灰色的是未使用到的結構。第一個圖是輸入的,第二個圖是輸出的。
咱們根據信號的流向進行標號,①和⑦是PAD,爲硅片的管腳,封裝在芯片內部,用戶看不到,PAD的輸入輸出每每和外部的Pin有一段連線。②和⑥分別是輸入緩衝器和輸出緩衝器,咱們在Technology Map Viewer(Post Mapping)視圖中就已經看到過,這裏功能上是同樣的,只是具體的實現結構不一樣;③是一個輸入延時模塊,是用來調節輸入信號的相位延時(在靜態時序分析中會詳細講解其使用方法),右鍵點擊該模塊能夠設置延時的時間,這是綜合佈局佈線工具自動給咱們加的(當輸入信號綁定到時鐘管腳上時就不會自動鏈接到輸入延時模塊上),並非咱們在RTL代碼中設計的;④⑤⑧是和外部管腳以及其餘層鏈接的接觸點,能夠理解爲至關因而PCB中的過孔,⑧這裏用於鏈接到和外部信號輸入的管腳Pin上,④和⑤在內部經過導線鏈接到一塊兒。
上面的操做咱們並無進行管腳的綁定約束,是開發工具自動給咱們分配到一個任意位置的管腳,若是約束了具體的管腳,其在Chip Planner中映射的位置還會變化,但結構基本相同。
綜合器在幫咱們自動完成綜合和佈局佈線的過程當中會根據咱們的HDL代碼與實際的功能來作一些適當的優化,這些優化是爲了讓整個映射後的硬件更加適配具體的FPGA器件,因此有些時候咱們用HDL描述的功能並非咱們所認爲的會使用到那部分基本邏輯單元,而是進行了優化後的結果,這些優化包括:面積的優化、速度的優化、功耗的優化、佈局不線的優化、時序的優化等。FPGA開發工具一樣也給用戶預留了一些可供用戶優化的選項設置,但這都要在用戶可以熟練掌握開發工具和內部結構的前提下才可以實現。
歡迎加入FPGA技術學習交流羣,本羣致力於爲廣大FPGAer提供良好的學習交流環境,不按期提供各類本行業相關資料!QQ交流羣號:450843130