4. 点亮一颗LED:从代码到硬件跑起来
好,咱们正式开始动手了。这一章的目标很简单——让板子上的一颗LED亮起来。别小看这一步,它背后串起了FPGA开发的完整流程:写代码、加约束、综合布线、下载配置。你走通了这一遍,后面所有项目都是这个套路。
核心流程: Verilog代码 → 管脚约束(.lpf) → 综合与布局布线 → 下载配置
4.1 先写Verilog代码:让LED亮起来
FPGA说白了就是一堆可编程的逻辑门。你要告诉它:把某个输出引脚拉高,或者拉低。LED电路通常是低电平点亮,所以我习惯把输出写成0。
来看代码,这是最简的顶层模块:
module led_ctrl (
input wire clk, // 系统时钟,50MHz
input wire rst_n, // 复位,低有效
output wire led // LED输出
);
// 直接拉低,点亮LED
assign led = 1'b0;
endmodule
嗯,就这么几行。但我要多说一句:实际项目中,我从来不会让LED直接常亮。为什么?因为调试时你根本分不清是代码跑起来了,还是板子本来就通电。我习惯让LED先闪烁几下,再进入工作状态。不过这一章咱们先走通流程,常亮就够。
我的习惯: 每个模块都加上clk和rst_n。哪怕这次没用上,也留着。后面加功能时不用改顶层端口。
4.2 管脚约束:把代码和物理世界连起来
代码写完了,但FPGA不知道你写的led对应板子上哪个引脚。这时候就需要管脚约束文件——对于ECP5,就是.lpf文件。
我曾经见过新手把约束写错,结果下载后板子没反应,查了半天发现是引脚号写反了。所以这一步要仔细。
打开你的开发板原理图,找到LED对应的FPGA引脚。假设LED接在PIO2-3,时钟接在GPI0-0,复位接在GPI0-1。那么.lpf文件这样写:
# LED管脚约束
IO_LOC "led" 2;
IO_TYPE "led" LVCMOS33;
# 时钟管脚约束
IO_LOC "clk" 0;
IO_TYPE "clk" LVCMOS33;
# 复位管脚约束
IO_LOC "rst_n" 1;
IO_TYPE "rst_n" LVCMOS33;
格式很简单:IO_LOC指定引脚号,IO_TYPE指定电平标准。ECP5的Bank电压是3.3V,所以用LVCMOS33。
注意: 引脚号不要照抄我的,一定要看你的原理图。不同开发板LED引脚不一样。我曾经帮同事排查问题,结果发现他用的板子LED是PIO3-5,不是PIO2-3。
4.3 综合与布局布线:把代码变成硬件
这一步是FPGA工具链的活。你写的是硬件描述语言,不是软件。工具要把它翻译成逻辑门,再放到芯片的LUT、FF、布线资源里。
我用的是Lattice Diamond软件。操作步骤很简单:
- 新建工程,选择ECP5芯片型号(比如LFE5U-25F-6BG256C)
- 添加源文件:把led_ctrl.v加进来
- 添加约束文件:把.lpf加进来
- 点击Synthesize:综合,检查语法和逻辑
- 点击Map & Place & Route:布局布线
综合完成后,你会看到资源使用报告。对于这个最简单的设计,大概只用了1个LUT和1个IO Buffer。嗯,几乎没占什么资源。
关键点: 布局布线后一定要看时序报告。虽然这个设计没有时序要求,但养成习惯。后面复杂项目里,时序不满足,下载进去也是白搭。
4.4 下载配置:让代码跑在芯片上
布局布线完成后,工具会生成一个.bit或.jed文件。这就是要下载到FPGA的配置文件。
连接好下载器(比如FTDI或者Lattice自家的编程器),在Diamond里点击Programmer,选择文件,点击Program。几秒钟后,进度条走完——板子上的LED应该亮了。
如果不亮,别慌。我遇到过的情况:
- 下载器没插紧(最常见)
- 板子没上电
- 引脚约束写错了
- LED是反的(高电平点亮,你写成了0)
一个一个排查。FPGA调试就是这样,耐心点。
我的经验: 第一次下载成功后,把LED改成闪烁(加个计数器),再下载一次。确认代码确实在跑,不是运气好。这一步能帮你排除很多后续的坑。
4.5 本章知识体系
下面这张图把整个流程串起来了。你对照着看,每一步做什么、产出什么,一目了然。
4.6 小结
这一章我们走完了FPGA开发的完整闭环。从写几行Verilog,到加管脚约束,再到工具链跑综合布线,最后下载到板子上看到LED亮起。你想想看,整个过程其实就四个文件:一个.v、一个.lpf、一个.bit、一个板子。
嗯,说起来简单,但每一步都有坑。我当年第一次跑通这个流程,花了整整一个下午——因为下载器驱动没装好。所以如果你卡住了,别急,大概率是某个小细节没注意到。
下一章我们会加点花样,让LED闪烁起来。到时候会用到计数器,也会接触到时序的概念。不过那是后话了。
公众号:蓝海资料掘金营,微信deep3321