第一個FPGA工程—LED流水燈

這一章咱們來實現第一個FPGA工程—LED流水燈。咱們將經過流水燈例程向你們介紹一次完整的FPGA開發流程,重新建工程,代碼設計,綜合實現,管腳約束,下載FPGA程序。掌握本章內容,你們就算正式的開始入門FPGA開發了。 網絡

1.1.1.電路說明

1.1.2.新建工程

第一步:從開始菜單啓動Quartus II 13.1(64 bit) ,以下圖。 架構

第二步:菜單欄選擇File>New Project Wizard,新建工程。 編輯器

第三步:彈出新建工程對話框,點擊Next,下一步。 工具

第三步:以下圖,依次設置工程的存放路徑,工程名稱,頂層文件名稱,如圖依次設置好,這裏咱們將全部工程相關的文件放在prj文件夾內,便於工程文件與源碼文件的管理,同時要保持工程名稱與頂層實體名稱一致,繼續Next 佈局

第四步:添加設計文件,這一步咱們不須要添加,後續咱們會新建相應的代碼文件。這裏繼續Next 學習

第五步:選擇FPGA器件,如圖所示,這裏咱們選擇器件家族是CycloneIV系列的,封裝是FBGA,管腳數爲256,速度等級爲8。這裏速度等級越小,速度越快。這裏咱們FPGA的具體型號爲EP4CE6F17C8。你們經過這個對話框瞭解這個器件的基本資源。這裏我簡單介紹一下這些資源的名稱,在後面的章節裏咱們還會詳細講解FPGA內部資源與結構。 編碼

一、CoreVoltage是內核電壓,Cyclone IV的內核電壓是1.2V spa

二、LEAltera最基本的邏輯單元,LEs表示FPGA的全部的邏輯資源,   咱們這款芯片的邏輯資源數爲6272 設計

三、User I/Os表示用戶IO數,這裏共有180IO能夠供用戶使用。 3d

四、Memory Bitsembedded multiplier 9-bit elements實際是一回事,後者簡稱M9KM9K就是指位寬爲9bit,深度爲1KRAM。這裏一共有30M9K,你們計算一下9*1024*30=276480就是Memory Bits

五、PLL鎖相環,內部一共有兩個鎖相環。

六、Global clocks全局時鐘網絡數,這裏一共有10個。設計中的時鐘信號會優先全局時鐘資源。

第六步:設置EDA工具,這裏咱們就設置一下仿真工具,使用默認Modelsim

-Altera,語言選擇Verilog。實際後面咱們不建議你們使用Modelsim-Altera。咱們會推薦你們在直接使用Modelsim-SE,後者的通用性更強。繼續Next

       第七步:總結新建工程的基本信息。到這裏就完成工程的創建。

1.1.3.代碼設計

你們閱讀本節前,首先應該對Verilog語法有必定了解,其次閱讀咱們提供的編碼規範文件,瞭解基本的命名規則和工程架構,從一開始就培養良好的編碼習慣。

第一步:新建verilog源文件,以下圖,點擊新建文件圖標,或者經過菜單欄File>New打開新建文件嚮導。

第二步:在新建文件嚮導中,選擇Verilog HDL File,點擊OK

第三步:由於咱們已經配置過UltraEdit爲默認編輯器,此時會打開UltraEdit(注意:UltraEdit編輯Verilog代碼前,要添加語法高亮文件,詳見3.3.3節內容),彈出新建源文件,將源文件另存至src文件夾下,命名爲led_test.v與頂層實體名稱一致。咱們將源碼文件和工程文件放在不一樣文件夾下,方便往後的工程維護。

第四步:編寫代碼邏輯,這裏咱們實現了一個流水燈。這裏咱們用了一個27位的計數器,時鐘頻率爲50MHz,週期爲20ns,當計數到第25位置位時,計數器值爲25’d16777216,此時時間爲16777216*20ns=335ms。這樣每大約通過335ms,計數器的[26:24]位就會加1。咱們第一個always實現計數器,第二個always實現控制不一樣時間時LED的輸出,即每隔335ms改變一次LED的輸出狀態。

1.  module led_test

2.      (

3.          input                  i_clk,      //input clk ,50mhz

4.          input                  i_rst_n,    //reset, active low

5.          output reg  [3:0]o_led      //led out

6.      );

7.      reg    [26:0]         led_count;   

8.  //-------------------------------------------------------------------

9.  // 流水燈計數器

10. //------------------------------------------------------------------- 

11.     always @ (posedge i_clk or negedge i_rst_n)

12.     begin

13.         if(!i_rst_n)

14.             led_count  <=27'd0;  

15.         else

16.             led_count  <=led_count   +   27'd1;                  

17.     end

18. //-------------------------------------------------------------------

19. //  計數器bit241,表示已大約計數335ms,每隔335msled_count[26:24]自動加1

20. //-------------------------------------------------------------------      

21.    always @ (posedge clk or negedge i_rst_n)

22.     begin

23.         if(!i_rst_n)

24.             o_led   <=4'b1111;    

25.         else begin

26.             case(led_count[26:24]) //when 25th bit set= 335ms

27.                 3'b000:     o_led<=  4'b1110;       

28.                 3'b001:     o_led<=  4'b1101;   

29.                 3'b010:     o_led<=  4'b1011;  

30.                 3'b011:     o_led<=  4'b0111;  

31.                 3'b100:     o_led<=  4'b1100;      

32.                 3'b101:     o_led<=  4'b1001;  

33.                 3'b110:o_led   <=  4'b0011;

34.                 3'b111:     o_led<=  4'b0000;      

35.                 default:    o_led<=  o_led;  

36.             endcase

37.         end

38.     end   

39. endmodule    

1.1.4.綜合實現

對於剛接觸FPGA的同窗可能不太瞭解綜合實現的意思,其實簡單裏說,綜合實現就至關於單片機的編譯過程。而FPGA的編譯過程不像其餘高級語言的編譯過程,FPGA編譯過程實際是相應硬件電路的實現過程。

第三小節,咱們完成了代碼設計,咱們就能夠綜合實現了。步驟就是雙擊task窗口下的「Compile Design」,就會開始綜合實現了。

AlteraFPGA編譯過程大體分爲如下幾個過程:分析綜合,佈局佈線,生成燒寫文件,時序分析,EDA網表生成。以下圖所示。

分析綜合:這個過程首先是完成對源碼文件的語法編譯,其次是將咱們設計的語言綜合成相應的網表文件,而這個網表文件實際是與FPGA上資源是相互映射的。首先什麼是網表文件?網表文件描述了相應工程的FPGA設計中包含了FPGA資源,一樣描述了這些資源又是如何鏈接的。其次,FPGA有哪些資源?咱們會在後續章節詳細介紹,這裏就說一個最簡單的資源——觸發器,這個是咱們數電裏面學習過的,在FPGA裏通常叫作寄存器。例如咱們這個工程中,最終led_counto_led都會映射到相應的寄存器。

佈局佈線:這個過程是根據分析綜合中獲得的網表文件進行的,若是你們有PCB設計經驗可能會更好理解。所謂佈局,就像PCB佈局,將設計中用到的資源佈局到FPGA器件內部不一樣的位置。所謂佈線,一樣相似PCB佈線,將FPGA內部用到的資源根據網表文件中描述的連接關係連在一塊兒。

生成燒寫文件:這個過程比較好理解,基於上述過程產生的文件,再生成用燒寫FPGA的文件。

EDA網表生成:這個過程則是用來生成仿真所需網表文件。仿真時會用到。

1.1.5.管腳分配

這一節咱們將介紹管腳分配,管腳分配過程當中咱們會同時講解關於Altera FPGA管腳主要特色及分類。

第一步:管腳分配前應該先將源碼文件進行綜合,讓Quartus獲取相應的IO信息。這一步第四小節已經講了,我就不作詳細介紹了。

第二步:打開管腳分配工具Pin Planner,以下圖。或者能夠經過菜單欄Assignments>Pin Planner打開,也能夠下圖所示快捷圖標打開。

    

第三步:分配管腳以前,咱們先介紹一下FPGAIO分佈狀況、管腳的特色及種類,以及Pin Planner工具的使用。以下圖爲Pin Planner界面。

Pin Planner工具界面大體可分爲如下幾個部分:

整體管腳佈局區域:如圖所示,中間器件圖描述了每一個管腳的位置。

Report區域:經過這個區域,將相應信息打上√,就能夠高亮咱們所關心的IO信息。這裏咱們高亮IObank信息。FPGA的管腳是分bank的,並且每一個bankIO的電平均可以獨立配置的。

Tasks區域:這個區域包含了不少IO信息,咱們能夠雙擊須要的IO信息,相應的信息就會添加到Repoat區域中。

Pin Legend區域:這裏具體說明IO的全部種類,並用不一樣的顏色和形狀表示出來。而FPGAIO管腳大體分爲 用戶IO,配置管腳,電源管腳這幾類。

管腳分配區域:咱們在這個區域內對咱們設計中的IO進行分配。

第四步:分配管腳。在Location欄中輸入相應管腳的位置,完成管腳分配。

1.1.6.程序燒寫



相關文章
相關標籤/搜索