一,建立工程:
1,啟動 Quartus12.1 開發環境, 選擇菜單 File->New Project Wizerd。
2,在彈出的對話框中輸入工程名和工程存放的目錄, 點擊 Next ,top-level design entity name跟工程名字一樣。
3,add files 可以添加項目的設計文件,沒有,就先不添加,點擊 Next。
4,在接下來的對話框選擇所用的 FPGA 器件型號 。
5,Simulation 這一項我們選擇已經安裝的 ModelSim,格式選擇 Verilog HDL。
二,代碼編寫:
1,新建 LED 的 verilog 代碼文件(點擊菜單 File->New....)
2,在彈出的窗口中選擇 Verilog HDL File 項, 點擊 OK。 (這里 Altera 的設計文件種類有很多,但對於用戶來說學好其中最常用的一兩種就已經足夠了)
3,編寫代碼如下:代碼介紹見:https://www.cnblogs.com/caiya/p/9865463.html
`timescale 1ns / 1ps module LED( clk, // 開發板上輸入時鍾: 50Mhz rst_n, // 開發板上輸入復位按鍵 led // 輸出 LED 燈,用於控制開發板上四個 LED(LED0~LED3) ); input clk; input rst_n; output [3:0] led; //寄存器型數據對象的定義 reg [31:0] timer; reg [3:0] led; always @(posedge clk or negedge rst_n) begin if(~rst_n) timer <=0; else if(timer==32'd199_999_999) timer<=0; else timer<=timer+1'b1; end always @(posedge clk or negedge rst_n) begin if(~rst_n) led<=4'b0000; else if(timer==32'd49_999_999) led<=4'b0001; else if(timer==32'd99_999_999) led<=4'b0010; else if(timer==32'149_999_999) led<=4'b0100; else if(timer==32'd199_999_999) led<=4'b1000; end endmodule
4,編寫好代碼后點擊保存按鈕, 另存為LED.v ,在 Files 界面,我們可以看到 LED.v 文件已經自動添加到項目中的 files 下 ;
三,管腳約束和編譯 :
1,編譯前先配置一下 IO 的電壓和雙功能管腳的功能,右鍵選中 Cyclone IV E FPGA 芯片,選擇 Device。
2,點擊 Device and Pin Options 按鈕。
3,設置 DCLK, Data[0]....等這些雙功能的 Pin 為普通的 IO,設置 I/O 的 Default 電壓為 3.3-V LVTTL, 設置完成后點擊 OK。
4,點擊 compile Design 按鈕開始編譯工程。
5,編譯成功的話, 編譯窗口的每一項前面會出現一個綠色的勾, 我們在 Flow Summary 窗口可以觀察 FPGA 資源使用的情況 ;
6,我們再來為 led_test 添加管腳約束,讓編譯器知道工程中的每個端口信號對應 FPGA 的哪個管腳。 選擇菜單 Assignment->Pin Planner ;
7,在 Location 這列輸入每個信號對應 FPGA 管腳號, 這個管腳具體的對應關系大家需要參考開發板的用戶手冊或者原理圖,這里的復位管腳"rst_n"我們使用開發板上的按鍵 Reset 作為復位管腳。 輸入管腳號后如下圖:
四,時序的約束 :(個人覺得簡單系統一般不需要這個)
時序約束是告訴 Quartus 編譯器在編譯程序的時候需要按照你的時序要求去布局布線。一般的項目只需要對全局時鍾進行約束,高速信號的設計還需要對各個節點,輸出輸入端口的延遲進行約束。以下為全局時鍾約束的方法:
1. 點擊菜單 Tool->TimeQuest Timing Analyzer, 打開 TimeQuest Timing Analyzer 界面。
2. 點擊菜單 Tools->TimeQuest Timing Analyzer Wizard..
3. 進入 TimeQuest Timing Analyzer Wizard 向導,點 Next
4. 這里我們增加了一個時鍾的約束, clock Name 項輸入 clk, input Pin 項選擇 clk, period是時鍾周期,這個要和板子上的輸入時鍾周期一樣,我們板上的時鍾輸入是 50Mhz, 也就是20ns, Rising 設置為 0, Falling 設置為 10,這樣時鍾的占空比就是 50%。
5, 接下來是輸入管腳對應時鍾的約束,這里是定義高速輸入的數據對於時鍾的約束,比如數據的 setup 的時間(tsu)和 holdup 的時間(th)。因為這里輸入信號只有 rst 信號,是個按鍵復位,無需約束。點擊 next 。
6,接下來是輸出管腳對應時鍾的約束,也是設置輸出管腳對於時鍾上升沿的數據最小保持時間(mintco)和最大保持時間(tco)。在本例程中我們只輸出 LED 燈,這項也沒有必要設置,點擊next。
7,程序會自動生成一個 LED.sdc 的約束文件,並添加到工程中。點擊 Finish。
8,關閉 TimeQuest Timing Analyzer 窗口,在 Quartus 的 Files 欄里我們可以看到一個LED.sdc 文件已經添加到項目中。
五,編譯和 FPGA 下載 :
1. 全部保存工程, 再點擊 compile Design 按鈕重新編譯一下工程。
2. 編譯完成后, Quartus 會在 output file 文件夾內生成一個 led_test.sof 文件,下面我們會使用這個 sof 文件來下載 FPGA。
3. 現在我們可以把 SOF 文件下載到 FPGA 芯片中,看一下 LED 實際運行的效果。 在下載程序之前先要確認下載器已經連接, FPGA 開發板已經上電。 再點擊 Program Device(OpenProgrammer) 打開 Programmer 軟件進行 FPGA 的下載。
4. 打開后的 Programmer 的界面如下圖所示:
5. 點擊“Hardware Setup...”按鈕 。
6. 在 Hardware Setup 的界面里選擇 Currently Select hardware 為 USB-Blaster[USB-0],再點擊 Close。
7. 再來添加我們剛才生成的 LED.sof 文件,點擊“Add File...”按鈕添加。
8. 打開 output_files 目錄下的 led_test.sof 文件。
9. 點擊"Start"按鈕開始 Program FPGA。
10,下載成功, Progress 欄會出現 100%(Successful)的字樣。
六,JIC 文件生成 :
可能已經有朋友發現下載 SOF 文件到 FPGA 后,開發板重新上電后配置程序已經丟失,還需要 JTAG 重新下載。這豈不麻煩!好吧,這一節我們來介紹如何把 FPGA 程序下載到開發板上的 FLASH 中,這樣不用擔心掉電后程序丟失了。在我們的開發板上有一個 8Pin 的 16Mbit 的 SPI FLASH M25P16, 用於存儲 FPGA 的配置程序。我們不能直接把 SOF 文件下載到這個 FLASH 中,需要先把 SOF 文件轉換成 JIC 文件。下面是 SOF 文件轉換成 JIC 文件的具體步驟:
1 . 在 Quartus 中選擇菜單 File→Convert Programming File...
2. 在 Convert Programming File 界面里選擇輸出的文件類型為.jic; Configuration device為 EPCS16, 這個型號跟我們開發板上的 M25P16 是兼容的 ; File name 欄輸入 JIC 文件的存放地址和文件名,這里我們輸入LED.jic,保存在 output_files 目錄下。
3. 選中 Input files to convert 框里的 Flash Loader, 點擊右邊的“Add Device...”按鈕 。
4,在 Device family 列表里選擇"Cyclone IV E", Devices name 框中選中 EP4CE6(如果是AX4010 的用戶選擇"EP4CE10"),再點擊 OK 完成。
5. 再選中 Input files to convert 框里的 SOF Data, 點擊右邊的“Add File...”按鈕添加 SOF文件。 選擇 output_files 目錄下的 LED.sof 文件,並打開。
6.點擊“Generate”按鈕生成 JIC 文件 。出現 Success 對話框, jic 文件生成成功。
【】生成了 JIC 文件后,我們就可以通過 JTAG 把 JIC 文件下載到開發板的 FLASH 中了。
1 . 雙擊 Quartus 界面里的 Program Device 打開 Programmer 界面。
2. 點擊"Add File..."按鈕添加編程文件。 選擇剛才生成的 led_test.jic 文件並打開。
3. 選中 Program/Configure 列中的選擇框。
4. 點擊"Start"按鈕開始對 Flash 進行編程。
等待 Progress 狀態為 100%(Successful), Flash 燒寫成功。