Intel® Cyclone® 10 LP FPGA 板 - 如何编程您的第一个 FPGA
本教程将指导您完成创建“Hello World”的硬件等效程序:一个闪烁的 LED。这是一个入门练习,可帮助您开始使用 Intel® Quartus® Prime Software Lite 版软件进行 FPGA 开发。
本教程将指导您完成创建“Hello World”的硬件等效程序:一个闪烁的 LED。这是一个入门练习,可帮助您开始使用 Intel® Quartus® Prime Software Lite 版软件进行 FPGA 开发。
您将学习如何编译 Verilog 代码,进行引脚分配,创建时序约束,然后对 FPGA 进行编程以闪烁开发板上的四个用户 LED 中的一个。您将使用 50 MHz 的时钟输入(来自板载振荡器)来驱动计数器,并将 LED 分配给计数器输出位之一。
级别:初学者
材质
硬件
Cyclone 10 LP 套件
Cyclone 10 LP 评估套件是一个易于使用的平台,可用于开始使用 Intel 的低功耗 Intel® Cyclone® 10 LP FPGA 和 Nios® II 可配置 32 位处理器进行开发。您可以在此处购买该套件。
软件
Intel® Quartus® Prime Software Suite Lite 版
这里使用的 FPGA 设计软件非常适合初学者,因为它免费下载且无需许可证文件。您可以在此处下载该软件。
注意:安装文件很大(几 GB),下载和安装可能需要很长时间。为最大限度地减少下载时间和所需的磁盘空间,我们建议您只下载本练习所需的文件。当提示选择要下载的文件时,取消选中“全选”,仅选择 Intel Quartus Prime 和 Intel Cyclone 10 LP 器件支持。
下载并安装 Intel® Quartus® 软件后,您就可以开始创建项目了!
Quartus 下载为什么这么大?
Quartus 下载包含用于创建自定义芯片设计的几项高级工具,例如模拟器、综合工具、布局布线引擎、时序分析器和器件编程器等。几乎所有这些功能都内置在 Quartus Prime FPGA 设计软件本身中。下载还包括 Nios II 软 CPU 的嵌入式软件设计套件,以及一个或多个 FPGA 系列数据库,在本例中是 Cyclone 10 FPGA 数据库。
注意:屏幕截图基于最新版本 v17.0。使用早期或更晚版本的 Intel® Quartus® 软件时,用户体验可能会有所不同。
步骤 1:创建 Intel® Quartus® 软件项目
步骤 1.a:打开 Intel® Quartus® Prime Software Suite Lite 版。
步骤 1.b:打开“新建项目向导”
步骤 1.c:选择“下一步”
步骤 1.d:目录、名称、顶层实体
选择一个目录来存放您的项目。在此,我们将项目命名为“Blink”,并将其放在 intelFPGA_lite 文件夹下,但您可以将其放在任何您喜欢的位置。选择“下一步”。
当提示创建目录时,请选择“是”。
我应该将未来的项目文件放在哪里?
在选择项目目录时,请遵循以下几条准则:
- 请勿将项目放在 Quartus 工具目录下。新版本的 Quartus 每六个月发布一次,因此将其放在特定版本目录下会在安装新版本后导致它们成为“孤儿”。更糟的是,如果您删除了旧的工具版本,您可能会丢失它们。
- 避免使用名称中带有空格的路径,因为某些工具不支持目录路径中的空格。
- 使用您具有读/写权限的目录。这听起来很直观,但有时 IT 部门会限制管理员权限。请确保您创建的文件夹不需要管理员权限。
步骤 1.e:项目类型
选择“空项目”,然后单击“下一步”。
步骤 1.f:添加文件
这里不需要添加任何文件。单击“下一步”。
步骤 1.g:系列、器件和开发板设置(注意:您可能需要展开窗口以查看更多器件名称)
选择以下选项
系列:Cyclone 10 LP
器件名称:10CL025YU256I7G
点击**下一步**。
步骤 1.h:EDA 工具设置
我们将使用默认的 EDA 工具和设置,因此无需进行任何更改。单击“下一步”。
步骤 1.i:摘要
单击“完成”
将显示以下屏幕。
步骤 2:创建 HDL 文件
硬件描述语言 (HDL)
我们使用 Verilog 作为 HDL。如果您熟悉 C 语言但刚开始学习 HDL 编程,Verilog 就像 C 一样,您需要在每个语句的末尾加上分号“;”。
步骤 2.a:导航到“文件”选项卡(主窗口),然后选择“新建”。
选择“Verilog HDL 文件”,然后单击“确定”。
步骤 2.b:选择“文件” > “另存为”。将文件名设置为“blink”。这是您的顶层文件名,必须与项目名称(blink)匹配。单击“保存”。
步骤 3:创建 Verilog 模块
步骤 3.a:将此 Verilog 代码复制并粘贴到 blink.v 窗口中,然后保存文件。
// create module
module blink (
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
步骤 3.b:分析与综合
右键单击“分析与综合”,然后单击“开始”以执行 Verilog 代码的语法检查和综合。
分析与综合过程中会发生什么?
分析与综合过程
- 检查设计文件是否存在语法和语义错误
- 执行网表提取,构建一个集成所有设计文件的数据库
- 将硬件描述语言 (HDL) 代码综合成适合目标 FPGA 系列的硬件块
如果过程成功完成,将在“分析与综合”旁边显示一个绿色的勾号。如果出现错误,请检查您的语法,并确保它与上面提供的代码块完全匹配。请确保您在步骤 3.a 中复制文本时使用了“查看源”按钮。
步骤 4:选择引脚分配
步骤 4.a:在顶部导航栏中,选择“分配” > “引脚规划器”。
步骤 4.b:逐一单击以高亮显示每个引脚的“位置”列,然后输入 LED 和 clk 信号的引脚位置,如下图所示。其余列将自动填充数据(其中一些将是我们将要在下一步中修改的默认值)。
节点名称 | Location |
---|---|
LED | PIN_L14 |
clk | PIN_E1 |
您还需要将“I/O 标准”、“电流强度”和“压摆率”列从默认设置更改为下图所示的值。
节点名称 | Location | I/O 标准 | 电流强度 | 压摆率 |
---|---|---|---|---|
LED | PIN_L14 | 3.3-V LVTTL | 8ma | 2 |
clk | PIN_E1 | 2.5V | 8ma |
步骤 4.c:要更改“I/O 标准”,请双击每个单元格,将出现一个下拉菜单。单击向下箭头图标并滚动到所需值。将 I/O 标准从默认的 2.5V 更改为 3.3-V LVTTL。
步骤 4.d:LED 输出的“电流强度”保持为 8ma(默认),输入(clk)和输出(LED)均如此。
步骤 4.e:LED 输出的“压摆率”保持为 2(默认)。您不需要为 clk 设置压摆率。将其留空。
步骤 4.f:关闭引脚规划器。
步骤 5:创建 SDC 文件
在编译 Verilog 代码之前,您需要为设计提供时序约束。您将创建一个 SDC(Synopsis Design Constraints)文件,其中包含命令,让 Intel® Quartus® 软件知道如何实现设计的时序。没有它,您将在编译过程中收到警告消息,因为 Intel® Quartus® 软件不知道如何实现设计的时序。
要创建 blink.sdc 并将其添加到 blink 文件目录,请执行以下操作:
步骤 5.a:导航到“文件”选项卡(主窗口),然后选择“新建”。
选择“Synopsys Design Constraints 文件”,然后单击“确定”。
步骤 5.b:选择“文件” > “另存为”。将文件名设置为“blink.sdc”。单击“保存”。
将以下内容复制并粘贴到 blink.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
# it’s 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]
什么是 SDC 文件,为什么我需要它?
SDC 代表 Synopsys Design Constraints,它是一种行业标准格式,用于定义硬件(硅)设计的时序约束,例如器件的目标频率以及与外部外设的时序。SDC 文件为 Quartus 提供了验证生成的系统是否满足其时序要求的方法。
在 FPGA 的综合过程中,Quartus 会调用一个名为 TimeQuest 的设计工具,该工具读取时序约束文件,计算 FPGA 内部信号的时序,并将这些时序与 SDC 文件指定的时序要求进行比较。将生成一个报告,该报告验证时序是否满足要求,以及/或标识未能满足时序要求并需要优化的信号。
步骤 6:编译 Verilog 代码
步骤 6.a
右键单击“编译设计”,然后单击“开始”。然后,工具将对设计进行综合、布局布线、组装和时序分析。由于只有几行代码,编译应该只需要几分钟就能完成。
拟合器(布局布线)过程中会发生什么?
拟合器将综合后的设计逻辑放置并布线到目标器件资源中。可以将其想象成一个路由器,它像布局印制电路板一样,使用铜走线将各种器件连接在一起。但在此情况下,器件是逻辑资源(例如查找表、寄存器、内存、乘法器等),走线是 FPGA 器件内部的布线“导线”。
汇编器过程中会发生什么?
汇编器根据成功的拟合生成一个可编程映像,然后该映像可以下载到 FPGA 器件。
什么是时序分析?
时序分析是在综合、布局和布线后,评估器件中逻辑时序的过程,以确保所有时序要求都得到满足。目标是实现“时序收敛”,即所有时序约束都得到满足。
编译完成后,您将看到一个类似以下的摘要报告。
编译 Verilog 代码后,您就可以对 FPGA 进行编程了。
步骤 7:对 FPGA 进行编程
最后一步是对 FPGA 进行编程。
步骤 7.a:通过 USB Blaster 端口将开发板连接到您的计算机。使用“未知”套件附带的 USB 数据线(mini-b 连接器)。将 mini-b 连接器插入“未知”开发板上的 USB Blaster 端口 (J17),并将 Type-A 端插入主机计算机上的标准 USB 端口。
步骤 7.b:为开发板供电,并确认 J13 USB Blaster II 端口附近有一个蓝色的 LED 点亮。
步骤 7.c:右键单击以打开“编程设备”。
步骤 7.d:硬件设置
选择“硬件设置”
在“当前选定的硬件”下拉菜单下,选择“Cyclone 10 LP 评估套件 [USB-1]”,然后单击“关闭”。
步骤 7.e:单击“自动检测”以识别开发板上的 JTAG 链。
选择器件 **10CL025Y**。这是 FPGA 器件。
步骤 7.f:添加 .sof 文件。
右键单击 **10CL025Y** 器件的“文件”列,然后选择“更改文件”。
步骤 7.g:导航到 output_files 文件夹,选择 blink.sof,然后单击“打开”。
在这里,blink.sof 是您的编程文件。SRAM 对象文件(.sof 文件)是二进制文件,包含使用 Intel® Quartus® 软件编程设备(也称为 Programmer)来配置 SRAM 基础器件(我们的 FPGA 就是基于 SRAM 的)的数据。编程器会读取 SOF 文件并获取器件的编程比特流。
步骤 7.h:选中“编程/配置”列,然后单击“开始”。
步骤 8:观察闪烁的 LED
如果您的进度条显示 100%(成功),请观察 LED0 闪烁。
自行尝试
更改闪烁速率
现在您已经成功完成了一个闪烁 LED 的实验,您可以通过使用计数器的另一个“位”来修改 LED 的闪烁速率。1 赫兹等于 1/秒(每秒周期数),以 1 Hz 闪烁意味着 LED 每秒闪烁一次。对于 2 Hz,LED 每秒闪烁两次。而 0.25 Hz 则意味着 LED 每 4 秒闪烁一次(慢速闪烁)。要实现更慢的闪烁,请使用计数器的较高位;要实现更快的闪烁,请使用较低位(例如,cnt[22])。尝试不同的计数器位,看看会得到什么结果。
时钟和计数器计算
cnt[n] where n = the counter bit
2^n; we've chosen n = 24 in our Verilog code sample
2^24 = 16,777,216
我们的时钟是 50 MHz,即 50,000,000
Clock / 2^n = blinks per second
50,000,000 / 16,777,216 = 2.9802
这大约是每秒 3 次闪烁。
要进行此更改,您需要
- 修改 Verilog 文件 (blink.v) 并在赋值语句中选择一个不同的计数器位。
- 重新编译设计
- 重新编程 FPGA
添加更多 LED
尝试将剩余的 3 个 LED 中的一个或多个连接到其他计数器位,让它们以不同的速率闪烁。例如,您可以添加一个连接到计数器位 23 的新 LED,它将比位 24 快两倍的速度闪烁。或者,您可以添加所有剩余的 3 个 LED,并将每个 LED 连接到一个唯一的计数器位。
要进行此更改,您需要
- 修改 Verilog 代码(步骤 3a)
- 将新 LED 添加到模块定义中
- 将新 LED 列为输出
- 将每个新 LED 分配给一个唯一的计数器位 (cnt[n])
- 运行分析与综合(步骤 3b)
- 使用引脚规划器将 LED 输出分配给引脚(步骤 4b - 4e)。
务必设置正确的 I/O 标准、驱动强度和压摆率。连接到 LED 的 I/O 引脚如下所示:
LED0:PIN_L14
LED1:PIN_K15
LED2:PIN_J14
LED3:PIN_J13
- 重新编译设计(步骤 6a)
- 重新编程器件(步骤 7h)