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 全部设置完成
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 的下拉项中选择 DE-SoC ,然后点击 Close 。
18 图 1-26 Cable 选择
7e. 点击 Auto Detect ,识别开发板的 JTAG 链。
图 1-27 自动侦测
选择 5CSEBA6 FPGA 器件。
19 图 1-28 器件选择
7f. 添加 .sof 文件
右键点击 5CSEBA6 器件的 File 栏,选择 Change File 。
图 1-29 Change File
7g. 导向 output_file 文件夹,选择 blink.sof ,然后点击 Open 。
20 图 1-30 选择 .sof 文件
这里的 blink.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