1.1. 概述 
 
 这是一个简单的练习, 可以帮助初学者开始了解如何使用Intel Quartus 软件进行 FPGA 开发。  
 
 
 在本章节中,您将学习如何编译 Verilog 代码,进行引脚分配,创建时序约束,然后对 FPGA 进行编程,驱动开发板上8 个绿色 LED 的其中一个。您将使用一个 50MHz 的时钟输入(来自 板载晶振)来驱动计数器,并将LED 指定给其中一个计数器的输出位。  
 
 
 教程级别 : 初学者  
 
 
 1.2. 准备工作 
 
 ◼  硬件  
 
 ⚫  Terasic DE2-115 套件  
 
 
 基于  Cyclone IV  FPGA 芯片。 
 
 
 
 
 作为扬名海内外的DE2开发板的升级款,DE2-115凭借功耗低、逻辑资源多、1存储器容量大、DSP功能、以及接口丰富等特性,可满足用户对多媒体、高品质图像处理、数字信号处理等各类开发要求,深受国内外高校师生的青睐。到目前为止,成千上万片的DE2-115已经在全球千余所名校实验室里“安家”,扮演着数字逻辑、EDA、数字系统设计等多项课程的“实力派网红”!主角儿,可谓是FPGA 教育界的新一代。 
 
 
 
 ◼  软件  
 
 ⚫  Intel Quartus Prime 软件套件 Lite 版  
 
 此版本  FPGA  设计软件非常适合初学者,因为它可以免费下载而且不需要任何许可文  
 
 件。您可以通过链接:https://fpgasoftware.intel.com/?edition=lite 或者是 https://www.intel.com/content/www/us/en/software-kit/669444/intel-quartus-prime-lite-edition-design-software-version-17-1-for-windows.html 下载。  
 
 
 注 :安装文件较大(几千兆字节),而且需要花费很长时间才能下载和安装。为了最大  
 
 限度减少下载时间和所需的磁盘空间,我们建议您只下载本练习中所需的项目。取消选  
 
 中的“ Select All ” ,  仅选择  Quartus Prime  和  Cyclone V device support 。如下图。  
 
 
 
 
 
 
 
 
 当下载并安装完 Intel Quartus 软件,您可以开始准备创建工程。  
 
 
 ?  为什么  Intel Quartus  软件下载如此之大(请参考  1.5  章节的解释)  
 
 注 :本文档中的截图基于  v17.1 。使用较早版本或更高版本的  Intel Quartus  软件时,用 户体验可能有所差异。  
 
 
 
 1.3. 创建  FPGA  工程  
 
 步骤  1.  创建  Intel Quartus  软件工程  
 
 1a.  打开  Intel Quartus Prime  软件套件  Lite  版本  
 
 
 
 
 图  1-2 Intel Quartus Prime  软件窗口  
 
 
 4 1b.  打开  New Project Wizard 
 
 
 
 图  1-3  点击  New Project Wizard  按钮  
 
 
 1c.  在  Introduction  对话框下点击  Next  
 
 
 
 图  1-4 Introduction  对话框  
 
 
 5 1d. Directory , Name , Top-Level Entity  
 
 选择目录,用于存放工程。直接在桌面新建一个my_first_fpga的文件夹,并将工程路径指定到这个文件夹,工程名称和顶层实体都取名为my_first_fpga: 
 
 夹。点击  Next 。  
 
 
 
 图  1-5  工程位置明细  
 
 
 
 
 此工程目录用于本示例教程,但对于以后创建新的工程我们不做推荐。  
 
 ? 以后的工程文件放在哪里 (请参考 1.5 章节的解释)  
 
 
 6 1e.  工程类型  
 
 继续选择Next,选择  Empty Project ,然后点击  Next 。  
 
 
 
 图  1-7 Project Type  对话框  
 
 
 1f.  添加文件  
 
 此处不必添加任何文件。点击  Next 。  
 
 
 
 图  1-8 Add Files  对话框  
 
 
 7 1g. Family, Device & Board Settings  
 
 注 :您可能需要展开窗口查看更多器件名称。  
 
 选择以下器件:  
 
 •  Family :  Cyclone IV E 
 
 •  Device name : EP4CE115F29C7 
 
 注 :为了选择指定的器件,您需要点击向上 / 向下箭头,滚动器件支持清单直到 发现  EP4CE115F29C7 。或者您可以在 Name filter  框中输入器件名称,以缩小器 件清单。您也可能要展开 Name  区域查看整个器件名称。  
 
 
 
 图  1-9 Family  和  Device  对话框  
 
 
 点击  Next 。  
 
 1h. EDA Tool Settings  
 
 我们将使用默认的  EDA  工具和设置,所以不需要改变。点击  Next 。  
 
 
 
 8 图  1-10 EDA Tools  对话框  
 
 
 1i. Summary  
 
 点击  Finish 。 
 
 
 
 
 图  1-11 Summary  对话框  
 
 
 9 将显示以下窗口。  
 
 
 
 
 图  1-12 Your First Project  窗口  
 
 
 步骤  2.  创建  HDL  文件  
 
 
 硬件描述语言( HDL )  
 
 
 我们以  Verilog  作为  HDL  来使用。如果您熟悉  C  编程语言但对于  HDL  还是新 手,Verilog  与  C  相似。  
 
 
 2a.  前往  File  选项( Quartus  软件主窗口),点击  New 。选择  Verilog HDL File ,然 后点击 OK 。  
 
 
 
 
 图  1-13  选择  New Verilog HDL File  
 
 
 10 2b.  选择  File > Save As ,选择  my_first_fpga 作为文件名。这是顶层文件名(my_first_fpga.v)。点击  Save 。  
 
 
 
 图  1-14  保存  Verilog HDL  文件  
 
 
 步骤  3. 设计 Verilog  模块  
 
 3a. my_first_fpga.v 文件内容如下:  
 
 
module my_first_fpga(input  wire clk,        // 50MHz input clockoutput wire LED         // LED ouput
);// create a binary counter
reg [31:0] cnt;                 // 32-bit counterinitial begincnt <= 32'h00000000;            // start at zeroendalways @(posedge clk) begincnt <= cnt + 1;                 // count upend//assign LED to 25th bit of the counter to blink the LED at a few Hz
assign LED = cnt[24];endmodule
拷贝如上代码到 my_first_fpga.v 文件中: 
 
 
 
 图  1-15  在文本编辑器中粘贴  Verilog HDL  代码  
 
 
 3b. Analysis & Synthesis  
 
 右键点击  Analysis & Synthesis ,然后点击  Start ,对  Verilog  代码执行语法检查和  
 
 综合。 
 
 
 
 
 或者直接点击Task窗格的Analysis & Synthesis如果您没有看到 Task  窗格,请到  View  菜单选择  Utility Windows ,然后选 择 Tasks 。 
 
 
 
 再或者直接点击如下如的按钮进行Analysis & Synthesis: 
 
 
 
 
 图  1-16  开始  Analysis & Synthesis  
 
 
 12 ? 在  Analysis & Synthesis  过程中发生了什么?(请参考  1.5  章节的解释)  
 
 如果该过程成功完成, Analysis & Synthesis  旁边将显示一个绿色勾型标记。如果在该过程  
 
 中提示有错误,请检查您的  Verilog  代码语法 ,  确保与上述代码模块完全一致。  
 
 
 
 
 图  1-17 Analysis  完成  
 
 
 步骤  4.  选择引脚分配  
 
 4a.  在  Quartus  顶部导航栏,选择  Assignments  >  Pin Planner  
 
 
 
 
 图  1-18 Pin Planner  窗口  
 
 
 
 请注意, input (clk) 与  output (LED) 在  Node Name  下面已经列出,因为您已经运行  
 
 了  Analysis & Synthesis 。  
 
 
 
 图  1-19 Pin Planner Location  设置  
 
 
 4b.  依次点击每一个引脚,使  Location  列突出显示,然后输入以下表格中的  LED 和 clk  信号的引脚位置。其余列会自动填充数据(目前保持 默认值即可)。  
 
 
 
 
 
 
 
 图  1-20 Pin Planner  全部设置完成  
 
 
其实上面表格的引脚分配信息来自DE2-115_v.x.x.x_SystemCD\DE2_115_schematic\de2-115_mb.pdf文件或者来自DE2-115_v.x.x.x_SystemCD\\DE2_115_user_manual\DE2_115_User_manual.pdf: 
 
 
 
 
 
 4f.  关闭  Pin Planner 。 Pin Planner  退出时会自动保存修改。  
 
 
 步骤  5.  创建  SDC  文件  
 
 
 编译  Verilog  代码之前,您需要为设计提供时序约束。您将创建  SDC(Synopsis  
 
 Design Constraints) 文件,其中包含有指示  Quartus  软件如何关闭设计中的时序的指  
 
 令。如果没有这个文件的话,您将在编译过程中遇到警告消息,因为  IntelQuartus  
 
 软件不知道如何关闭设计中的时序。  
 
 
 5a.  在  my_first_fpga  工程目录下创建  my_first_fpg.sdc  文件。与  Verilog  文件( .v  扩展文件)在同一  
 
 个目录下。将 如下 文件内容拷贝到 my_first_fpg.sdc 文件。 
 
 
# inform quartus that the clk port brings a 50MHz clock into our design so
# that timing closure on our design can be analyzedcreate_clock -name clk -period "50MHz" [get_ports clk]# inform quartus that the LED output port has no critical timing requirements
# its a single output port driving an LED, there are no timing relationships
# that are critical for thisset_false_path -from * -to [get_ports LED] 15 5b.  保存  blink.sdc  文件。  
 
 
 ? 什么是  SDC  文件,为什么需要它(请参考  1.5  章节的解释)  
 
 
 
 
 图  1-21 SDC  文件位置  
 
 
 5c.  现在把该  SDC  文件添加到  Intel Quartus  软件工程。选择  Project >  Add/Remove  
 
 Files in Project .  在出现的  Settings  对话框中,点击  File name  文本框右侧的 “…”  
 
 浏览按钮。显示文件浏览对话框。选择  blink.sdc  文件,并点击  Open  按钮关闭  
 
 该对话框。这时候  blink.sdc  文件会在工程文件清单里,点击  OK  按钮关闭  
 
 Settings  对话框。  
 
 
 步骤  6.  编译  Verilog  代码  
 
 
 6a.  右键点击  Compile Design ,然后点击  Start .  这些工具会对设计进行综合、布局  
 
 布线、组合和执行时序分析。因为只有少数代码行,编译只需花几分钟就可完  
 
 成。  
 
 ? 布局布线过程中发生了什么(请参考  1.5  章节的解释)  
 
 
 ? Assembler  过程中发生了什么(请参考  1.5  章节的解释)  
 
 
 ? 什么是时序分析(请参考  1.5  章节的解释)  
 
 
 
 
 16 图  1-22  编译设计  
 
 
 编译完成后,将会出现类似于如下的总结报告。  
 
 
 
 
 图  1-23  编译总结  
 
 
 编译完  Verilog  代码后,就可以对  FPGA  进行编程。  
 
 
 步骤  7.  对  FPGA  编程  
 
 
 最后一步就是对  FPGA  进行编程。 
 
 
 对  FPGA  进行编程,需要通过  USB Blaster  端口将开发板与电脑连接。  
 
 
 17 7a.  通过 USB Blaster  端口将开发板与电脑连接。 
 
 
 7b.  开发板连接电源 。  
 
 
 
 7c.  右键点击  Program Device  (Open Programmer)  打开  Programmer  窗口。  
 
 
 
 
 图  1-24  打开  Quartus  软件的  Programmer  工具  
 
 
 7d.  选择  Hardware Setup 。  
 
 
 
 图  1-25  硬件设置  
 
 
 在  Currently selected hardware  的下拉项中选择 USB-Blaster[USB-0] ,然后点击  Close 。  
 
 
 
 图  1-26 Cable  选择  
 
 
 
 7e.  添加 .sof  文件  
 
 右键点击 EP4CE115F29 器件的  File  栏,选择  Change File 。  
 
 
 
 图  1-29 Change File  
 
 
 7g.  导向  output_file  文件夹,选择 my_first_fpga .sof ,然后点击  Open 。  
 
 
 
 
 20 图  1-30  选择 .sof  文件  
 
 
 这里的 my_first_fpga.sof 是配置文件, SRAM Object Files (.sof  文件 ) 是二进制文件包含  
 
 配置  SRAM-based  器件的数据,我们的  FPGA  是基于  SRAM  的。 Intel Quartus  软  
 
 件的  Program Device ( 也称为  Quartus Programmer) 查看  SOF  文件并为  FPGA  器  
 
 件获取下载的  bit stream 。  
 
 
 7h.  勾选  Program/Con fi gure ,然后点击  Start 。  
 
 
 
 图  1-31  开始编程  
 
 
 21 步骤  8.  观察闪烁的  LED  
 
 如果  Progress  进度显示  100% (Successful) , LED[0] 将闪烁。  
 
 
 
 
 图  1-32  编程成功  
 
 
 
 图  1-33 LED  闪烁  
 
 
 1.4. 拓展实验  
 
 ◼  更改闪烁频率  
 
 到此,您已经获得一个成功的 LED 闪烁工程,可以使用计数器的不同 bit 来修改 LED 的闪烁 22频率。 1HZ 即 1 次每秒( 1 秒一个周期),以 1HZ 的频率闪烁意味着 LED 每秒闪烁一次。 2HZ 就 是LED 每秒闪烁 2 次。 0.25HZ 就是指每 4 秒 LED 闪烁一次(慢闪)。使用计数器更高的 bit 获得 更慢的闪烁,使用低位的bit 可以获得更快闪烁(例如 cnt[22] )。测试不同的计数器位来观察 LED闪烁情况。  
 
 
 时钟和计数器公式  
 
 cnt[n]  其中  n  等于计数器位  
 
 2  𝑛  ;  在  verilog  示例代码中设置  n  为  24  
 
 2  24  = 16777216  
 
 时钟是  50MHZ  或  50 , 000 , 000HZ  
 
 Clock  / 2  n  等于每秒闪烁次数  
 
 50,000,000 / 16,777,216 = 2.9802  
 
 大约每秒三次闪烁。  
 
 
 您需要做以下三点进行更改  
 
 1.  修改  Verilog  文件( blink.v ),在赋值语句中选择一个不同的计数器  bit  
 
 2.  重新编译设计  
 
 3.  重新为  FPGA  器件编程  
 
 
 ◼  添加更多  LED 
 
 试着将剩余的 7 个 LED 中的一个或多个连到其他计数器 bits, 每个 LED 以不同的频率闪烁。例 如,可以将一个新LED 连到计数器 bit23 ,会闪烁两次,和 bit 24 闪烁一样快。或者添加其余 全部7 个 LED ,每一个都连到特定的计数器 bit 。  
 
 
 您需要做以下几点进行更改:  
 
 
 1.  修改  verilog  代码  
 
 (a)  在模块定义中添加新的  LED  
 
 (b)  列出新的  LED ,作为输出  
 
 (c)  将每个新的  LED  赋给特定的计数器  bit ( cnt[n] )  
 
 
 ? 我对硬件设计不熟悉,在哪能获取包含这些更改的  Verilog  代码?(请参考  1.5  章节的解  
 
 释)  
 
 2.  运行  Analysis & Synthesis  
 
 
 3.  用  Pin Planner  分配  LED  输出给引脚  
 
 
 23 确保设置合适的  I/O standard, current strength  和  slew rate 。 I/O  引脚与  LED  的连接如  
 
 下所示:  
 
 
 
   
 4.  重新编译设计  
 
 
 5.  重新对器件编程  
 
 
 1.5. 解释  
 
 为什么  Intel Quartus  下载量如此之大?  
 
 Intel Quartus  下载包含很多不同精密工具,用于创建自定义芯片设计,比如模拟 ,  综合工具,  
 
 布局和布线引擎,时序分析仪和器件编程。几乎所有的这些功能都嵌入到  Intel Prime  
 
 Software  套件  FPGA  设计软件本身。下载也包括针对  Nios II soft CPU  的嵌入式软件设计  
 
 套件,以及一个或多个  FPGA  种类数据库 — 如本实例中的  Cyclone V FPGA  数据库。  
 
 
 以后的工程文件需要放在哪?  
 
 以下是在为工程选择目录时应该采取的一些指导 :  
 
 • 不要将工程放到  Intel Quartus  软件工具目录。新的  Intel Quartus  版本每  6  个月发布,  
 
 所以将它们放到具体版本的目录,会使得它们在每个新版本安装后会显得孤立。更坏  
 
 的情况是,如果您删除旧版本的工具,工程可能会丢失。  
 
 • 避免工程路径名称有空格,因为一些工具的目录路径不允许有空格。在路径名称中,  
 
 需要用下划线或连接符代替空格  
 
 • 使用您有读 / 取权限的路径作为目录。听起来很直观,但是有时候  IT  部门会限制管理  
 
 员权限。确保创建的文件夹不需要管理员权限。  
 
 
 在  analysis &synthesis  过程中发生了什么?  
 
 Analysis & Synthesis  过程:  
 
 24 • 检查设计文件的语法和语义错误。  
 
 • 执行  netlist extraction  构建一个集成了所有设计文件的数据库。  
 
 • 将硬件描述语言 (HDL) 代码综合到适合目标  FPGA  种类的硬件模块  
 
 
 什么是  SDC  文件?为什么需要他?  
 
 SDC  代表  Synopsys Design Constraints ,是一种行业标准格式,它定义了硬件 (silicon) 设计的  
 
 时序约束,例如器件的目标频率,以及外围设备的时序。 SDC  文件为  Intel Quartus  软件提  
 
 供了一种验证所生成的系统是否满足其计时要求的方法。  
 
 在  FPGA  的综合过程中, Intel Quartus  软件调用了一个名为  TimeQuest  的设计工具,它读取  
 
 时序约束文件,计算内部  FPGA  信号的时序,并将这些时序与  SDC  文件指定的时序要求进  
 
 行比较。此过程将会创建一个报告,该报告验证是否满足时序要求,并 / 或识别未能满足时  
 
 序要求并需要优化的信号。  
 
 
 布局布线过程中会发生什么?  
 
 fitter  将综合设计的逻辑布局布线到目标器件资源中。把它想象成一个布线器,上面陈列一  
 
 块印制电路板,用铜线把各种器件连接在一起。在这里,器件是逻辑资源 ( 例如查找表、寄  
 
 存器、内存、乘法器等 ) ,而  traces  是  FPGA  器件内的“导线”。  
 
 
 Assembler  过程中发生了什么?  
 
 Assembler  从一个成功的布局布线生成一个编程镜像,然后下载到  FPGA  器件。  
 
 
 什么是时序分析?  
 
 时序分析是对器件中的逻辑的时序进行综合、布局布线,以确保满足所有时序要求的过程。  
 
 目的是在满足所有时序约束的情况下实现“时序收敛”。  
 
 
 
 我对硬件设计不熟悉,我在哪能获得包含这些更改的  Verilog  代码?  
 
 就在这里:  
 
1. // create module
2. module blink(
3. input wire clk, // 50MHz input clock
4. output wire [7:0] LED // array of 8 LEDs
5. );
6.
7. // create a binary counter
8. reg [31:0] cnt; //32 bit counter
9.
10. initial begin
11.
12. cnt <= 32’h00000000; // start count at zero
13.
14. end
15.
16. always @(posedge clk) begin
17.
18. cnt <= cnt+1; // count up
19.
20. end
21.
22. //assign LEDs to bits 28 through 21 of the counter
23.
24. assign LED = cnt[28:21];
25.
26. endmodule