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软件。操作步骤很简单:

  1. 新建工程,选择ECP5芯片型号(比如LFE5U-25F-6BG256C)
  2. 添加源文件:把led_ctrl.v加进来
  3. 添加约束文件:把.lpf加进来
  4. 点击Synthesize:综合,检查语法和逻辑
  5. 点击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 本章知识体系

下面这张图把整个流程串起来了。你对照着看,每一步做什么、产出什么,一目了然。

FPGA开发流程:点亮一颗LED 1. 编写Verilog led_ctrl.v 2. 管脚约束 .lpf文件 3. 综合与布线 .bit/.jed文件 4. 下载配置 LED亮起 核心产出: Verilog代码 → 硬件描述 .lpf文件 → 引脚映射 综合布线 → 逻辑映射到芯片资源 下载配置 → 硬件运行 常见问题排查: • LED不亮 → 检查下载器连接、板子供电、引脚约束 • 综合报错 → 检查Verilog语法、模块名是否一致 • 布局布线失败 → 检查资源是否超限、时序约束是否合理 💡 我的建议: 第一次走通后,把LED改成闪烁,再下载一次。确认代码确实在跑。

4.6 小结

这一章我们走完了FPGA开发的完整闭环。从写几行Verilog,到加管脚约束,再到工具链跑综合布线,最后下载到板子上看到LED亮起。你想想看,整个过程其实就四个文件:一个.v、一个.lpf、一个.bit、一个板子。

嗯,说起来简单,但每一步都有坑。我当年第一次跑通这个流程,花了整整一个下午——因为下载器驱动没装好。所以如果你卡住了,别急,大概率是某个小细节没注意到。

下一章我们会加点花样,让LED闪烁起来。到时候会用到计数器,也会接触到时序的概念。不过那是后话了。


公众号:蓝海资料掘金营,微信deep3321