Vivado2018.3 FPGA硬件描述語言 入門筆記


聲明:本文章僅作爲個人學習FPGA的筆記記錄,可能多有疏略不嚴謹甚至是錯誤的地方,僅供參考。

1、創建工程

“quick start — create project” 或者 “file—project—new”
在這裏插入圖片描述
在這裏插入圖片描述
根據自己的需要選擇一款FPGA開發板:
在這裏插入圖片描述
進入開發界面,最左側爲流程導航欄(flow navigator),完整的開發工作可按照該欄中的個步驟執行。這裏先略過IP部分。右側爲工程管理界面。
在這裏插入圖片描述

2、添加源文件

在流程導航(flow navigator)中點擊“Adding Sources”,可添加三種源文件——設計源文件、仿真源文件、約束文件。

(1)設計源文件(design source)

  設計源文件是實現特定功能的代碼,像一個“函數”,有輸入和輸出。代碼負責對輸入進行運算和分析(算術運算和邏輯運算),得到輸出,如:y=f(x),其中x是輸入,y是輸出。同一個工程項目可以有多個源文件,源文件之間可以相互調用,這一點和C語言類似,這裏不作具體介紹。
  我們首先添加一個設計源文件,這裏命名爲d_latch是因爲要實現的功能爲一個鎖存器。暫時不設置I/O端口。添加後可以在下面的Sources窗格中看到多了一個設計源文件d_latch.v
在這裏插入圖片描述
雙擊設計源文件d_latch.v,輸入如下代碼(第一行在文件生成時已經給出):

`timescale 1ns / 1ps

module d_latch(d, clk, q);  // 定義模型d_latch
    input d;    // 輸入:控制信號d
    input clk;  // 輸入:時鐘信號clk
    output q;   // 輸出:q
    
    reg q;      // 聲明q爲寄存器類型(表示可修改)
    
    always @ (d, clk)   // 時序電路,反覆執行
        if(clk)         // 如果時鐘信號爲高
            q <= d;     // 將 d 阻塞賦值給 q

endmodule

上述代碼的功能是:當時鍾信號爲高時,輸出q的值與輸入d的值相等,否則輸出q的值保持不變,這便是基本的鎖存器功能。

(2)仿真源文件(simulation source)

用於驗證“設計源文件”的正確性的代碼,即判斷“設計源文件”能否實現所需要的功能。給出一系列具體的x的值,調用“設計源文件”中的module,查看輸出的y是否滿足y=f(x)。
在這裏插入圖片描述
添加仿真源文件d_latch_tb.v(這裏後綴tb表示test bench,可以令取任意符合語法要求的文件名),添加如下代碼:

`timescale 1ns / 1ns

module d_latch_tb;
    reg clk, d;
    wire q;
    
    d_latch u1(.d(d), .clk(clk), .q(q));
    
    initial
    begin
        clk = 1;
        d <= 0;
        forever
        begin
            # 60 d <= 1;    // 人爲生成毛刺
            # 22 d <= 0;
            # 2  d <= 1;
            # 2  d <= 0;
            # 16 d <= 0;    // 維持16ns的低電平,然後讓它作週期性的循環
        end
    end
    
    always #20 clk <= ~clk; // 時鐘半週期爲20ns,全週期爲40ns
    
endmodule

(3)約束文件(constraint)

在實際應用中,需要將上面的module放到FPGA硬件中(即燒寫),由於實現module的功能需要以實際的端口作爲基礎,故應當在燒寫之前根據FPGA的端口信息設定好程序的x和y對應的物理接口。實現這一點一般需要知道FPGA的IO引腳功能信息,但是Vivado提供了“自動設置”的功能,初學者可以藉此快速設置,方便學習使用。(這一部分後面再添加)


3、仿真

(1)行爲仿真

在添加仿真源文件之後,就可通過仿真行爲來檢驗源文件是否存在問題。

在這裏插入圖片描述
可以在工作區看到仿真的時序波形:
在這裏插入圖片描述
可以看出輸出和輸入均符合要求(如果不符合要求,則說明代碼可能有問題):
在這裏插入圖片描述

(2)綜合後仿真和應用後仿真

  在進行完下面的綜合(synthesis)和應用(implementation)之後,均可以進行仿真,其中後者更爲重要,一般會觀察到和行爲仿真不同的結果,結果中存在一定的延遲。


4、RTL分析

通過RTL分析,可以查看自動生成的與d_latch.v對應的數字電路
在這裏插入圖片描述
在這裏插入圖片描述

5、綜合(synthesis)

用於對工程進行綜合,具體含義爲:將上述代碼功能與實際的FPGA可支持的功能進行綜合,綜合後查看synthesis下面的schematic可以發現電路使用的模塊與上面那張圖有所不同(使用的元件全部源於FPGA開發板本身)。
在這裏插入圖片描述

6-1、應用(Implementation)

點擊左側流程欄中的Implementation,進行應用操作,該過程將進一步對源文件和FPGA進行綜合,給代碼中的變量分配具體的引腳。如果之前沒有進行任何約束設置(constraint),則該過程將自動爲工程項目分配引腳:
在這裏插入圖片描述
由於上面的引腳分配僅僅是臨時的,我們應當進行保存。勾選上圖中每個端口的Fixed,將端口鎖定,ctrl+s快捷鍵保存,會自動詢問是否要保存該臨時約束文件,給約束文件命名(這裏命名爲d_latch_IO),點擊OK
在這裏插入圖片描述
可以發現source欄中多出了一個d_latch_IO.xdc文件,即爲約束文件
在這裏插入圖片描述
雙擊打開該文件後可發現其中的具體端口約束代碼。
在這裏插入圖片描述

6-2、約束文件

注:本小節與6-1小節是並列關係,都可實現約束文件的添加。

其實在implementation之前,便可以自行新建約束文件,在文件中添加上述代碼也可(或者點擊window中的package,可手動添加引腳)。如果不知道FPGA具體的引腳信息,則可以使用自動分配引腳的方法。下面具體介紹該方法:

點擊左邊側欄中Synthesis中的Open Synthesized Design,此時可在頂部工具欄的Window點開I/O port,I/O端口信息會在屏幕底部顯示,此時還沒有分配引腳
在這裏插入圖片描述
在欄目內右擊,點擊Autoplace I/O Ports,
在這裏插入圖片描述
可見端口已經自動分配,但這只是臨時的,要想固定這一選擇,可以點擊Fixed(打對號),然後ctrl+s保存,
在這裏插入圖片描述
選擇一個已存在的文件,即之前創建好的d_latch_IO.xdc空文件
在這裏插入圖片描述
點擊Reload重新加載:
在這裏插入圖片描述
就得到了和6-1中一樣的結果:
在這裏插入圖片描述

6-3、應用後仿真

在這裏插入圖片描述

應用到FPGA之後,從下圖可以看出,仿真結果出現延時,但基本的功能仍然支持。
在這裏插入圖片描述

7、生成比特流文件(Generate Bitstream)

在這裏插入圖片描述
出現失敗!
在這裏插入圖片描述
原因是我使用了默認的I/O端口初始值,I/O Std 顯示爲Default(LVCMOS18),我們要確定選擇LVCMOS18纔可以(改成如下圖所示),ctrl+s保存,重寫約束文件,
在這裏插入圖片描述
發現多了三行約束代碼:
在這裏插入圖片描述
然後重新跑Implementation和Generagte Bitstream,即可順利生成比特流文件。


附錄:

1、I/O Ports 重寫指南

如果不想從頭開始寫一個I/O端口約束文件,而是在原本的基礎上更改,可以參考下述步驟:
1、打開 Open Synthesis Design 或 Open Implementation Design,兩者都可。這時,可以在軟件頂部點擊Window—>I/O Ports,則I/O Ports會在屏幕底部出現。
【注意:I/O Ports的最左側欄可以拉開並顯示代碼中定義的名稱】
在這裏插入圖片描述

2、選擇需要更改的I/O端口對應的Package Pin,選擇所需的端口(Package速覽方法:Window—>Package),點擊Fixed,並緊接着ctrl+s保存,彈出文件已更改的提示窗口點擊OK,右彈出如下窗口,提示保存新的約束Constraint。
在這裏插入圖片描述
【1】如果之前沒有創建Constraint文件,或者想要新建一個約束文件夾,則可以由此創建。
【2】如果已經有Constraint文件,則可以選擇Overwrite,如下圖所示,即對文件夾constrs_1進行重寫。重寫之後,關閉文件夾constrs_1中的約束文件(如果之前一直打開着的話),並重新打開,則可以發現端口已經更改。

在這裏插入圖片描述
可見下圖中d對應的端口已經由U14改變爲U15:
在這裏插入圖片描述
(不定時更新中…)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章