目的
最近工作上有使用FPGA的需求,这里先拿个 Altera 的 EP4CE6E22C8N
来练练手。除去电脑,开发最低需求只需要一个核心板,一个 USB Blaster
下载器即可,加一起几十块钱就可以搞定。
软件与资料
开发软件
开发软件用的 Intel® Quartus® Prime Lite Edition Design Software Version 22.1.2 for Windows
,这个版本,免费且是最后一个仿真可以直接选ModelSim的版本(现在新的仿真软件Questa入门版也是免费的,不过我这里其它地方有用ModelSim的需求):
https://www.intel.com/content/www/us/en/software-kit/785086/intel-quartus-prime-lite-edition-design-software-version-22-1-2-for-windows.html
我这里下载单个文件的方式,只需要用到下面的软件和器件数据就够了:
仿真软件
仿真软件用的 ModelSim-Intel® FPGAs Standard Edition Software Version 20.1.1
,安装时选择入门版不需要License:
https://www.intel.com/content/www/us/en/software-kit/750666/modelsim-intel-fpgas-standard-edition-software-version-20-1-1.html
芯片资料
EP4CE6E22C8N
属于Cyclone IV
系列的FPGA:
资料可以从下面页面找到:
https://www.intel.com/content/www/us/en/docs/programmable/767845/current/cyclone-iv-featured-documentation-quick.html
开发入门
这里并不介绍上图这种通用的FPGA开发流程,只是讲一讲上面的软件和单片机的大致开发过程步骤。
这里将实现一个LED灯闪烁的功能,过程中涉及新建项目文件、IP核使用、仿真、引脚分配、下载等。
首先介绍软件界面主要需要用到的部分按钮:
新建项目和文件
可以从 File -> New Project Wizard
选择创建新项目:
新建项目后选择创建代码文件(这里保持为 blink.v
):
使用IP核
接下来就可以直接写代码了。不过这里用个软件自带的IP核来实现计时功能:
我的核心板上芯片的外部时钟是50MHz的,我准备用这个作为计数器输入,这样计数 25000000
次就是500ms。
编写代码和分析综合
接下来在 blink.v
中写点灯的功能代码:
module blink( // 声明模块
clk,
led
);
input clk; // clk为输入信号
output reg led = 0; // led为输出信号
wire [27:0] count;
counter counter_inst(
.clock(clk), // 连接计数器时钟和clk
.q(count) // 连接计数器计数值和count
);
always@(posedge clk) // 在clk上升沿时
if (count == 0) // 当count为0时
led <= !led; // 对led值取反
endmodule
完成代码后可以执行分析和综合,没有错误的话可以看到设计情况:
仿真测试
接下来新建 blink_tb.v
文件(这种 xxx_tb.v
的命名方式只是一种常见写法 testbench )用于仿真测试,代码如下:
`timescale 1ns/1ns // 仿真时间尺度和精度
module blink_tb();
reg sig_clk;
wire sig_led;
blink blink_inst(
.clk(sig_clk),
.led(sig_led)
);
initial sig_clk = 0; // 设置初值
always #10 sig_clk = ~sig_clk; // 每 10*1ns 翻转一次sig_clk(即50MHz信号)
initial begin // 开始执行
#2_000_000_000; // 延时 2_000_000_000 纳秒(即 2000ms 或 2秒钟)
$stop; // 停止执行
end
endmodule
分析综合没问题就可以开始用软件仿真了,首先在 Quartus Prime
中设置 ModelSim
的路径:
选择你自己的软件安装地址,比如我这里是 C:/intelFPGA/20.1/modelsim_ase/win32aloem
。
接下来添加仿真文件:
点击 QuartusPrime
软件中的仿真按钮会自动打开 ModelSim
,这里因为设置仿真时间为2秒,会非常非常慢,需要耐心等待仿真完成:
可以看到2秒内led信号确实每500ms翻转一次。
放大看信号的仿真情况符合设计:
需要注意的是每次仿真前都需要先关闭 ModelSim
软件。
分配引脚
引脚分配根据实际的电路图来,我这里用到下面两个引脚:
在软件中进行引脚分配和电平设置:
对于未使用到的引脚也可以根据需求统一设置:
编译下载
分配好引脚后可以进行编译,编译完成后会生成 .sof
文件可以通过下载器下载到芯片中:
下载前确保正确安装了下载器驱动:
在软件中选择下载器和文件进行下载,下载完成可以看到板子上LED灯闪烁:
生成固件烧录到Flash
前面的 .sof
文件烧录掉电后就失效了,想要固化的话需要烧录到Flash中。
我的板子上外部Flash用的 W25Q16JVSIQ
,它直接和FPGA相连,并没有引出别的烧录脚。所以我这里需要生成 .jic
文件,然后使用下载器通过FPGA将固件下载到Flash中。
在软件中生成 .jic
文件:
生成后就可以下载了,注意下载到Flash中会慢一些:
下载后需要上电重启板子观察效果。
除了使用 QuartusPrime
来下载,官方也提供了独立的 QuartusProgrammer
软件可以用来下载固件。
总结
现在来说因为工具软件生态等的完善,目前 Altera 的 FPGA 开发入门点个灯什么的还是非常简单的。能跑通流程,剩下的就是具体业务开发的工作了。