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 clock
output wire LED // LED ouput
);
// create a binary counter
reg [31:0] cnt; // 32-bit counter
initial begin
cnt <= 32'h00000000; // start at zero
end
always @(posedge clk) begin
cnt <= cnt + 1; // count up
end
//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 analyzed
create_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 this
set_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