3. 第一个工程:从零点亮一颗LED

好,咱们正式开始动手了。

这一章,我会带你完整走一遍MachXO系列芯片的开发流程。从创建工程、写Verilog代码,到综合、布局布线,最后生成JEDEC文件并下载到板子上。说白了,就是让板子上的LED灯闪起来。

别小看这个LED闪烁。我做了十几年FPGA,每次拿到新板子,第一个跑的一定是它。为什么?因为这是验证整个工具链、下载链路、芯片是否正常工作的最快方式。灯亮了,后面的事才有意义。

本章核心目标:

  • 掌握Diamond软件创建工程的标准步骤
  • 编写第一个Verilog代码(LED闪烁)
  • 完成综合、布局布线、生成JEDEC文件
  • 将程序下载到开发板,看到LED闪烁
创建工程 Diamond新建 编写代码 Verilog LED 综合布局布线 Synthesis + P&R 生成JEDEC 下载文件 下载 到板子 图:LED闪烁工程完整开发流程

3.1 创建Diamond工程

打开Diamond软件,界面看起来可能有点复杂。别慌,咱们一步步来。

  1. 新建工程:点击 File → New → Project,或者直接点工具栏上的“新建”图标。
  2. 填写工程信息:给工程起个名字,比如 led_blink。路径建议不要有中文和空格。我习惯在D盘建一个 machxo_projects 文件夹,所有工程都放里面。
  3. 选择器件:这一步很关键。根据你手上的开发板,选择对应的MachXO系列型号。比如 LCMXO2-1200HC-4TG100C。如果你不确定,看板子上的芯片丝印,或者问卖家要原理图。
  4. 选择综合工具:Diamond内置了Lattice自家的综合工具,选 Lattice LSE 就行。我个人觉得LSE对MachXO系列优化得不错,没必要换别的。
  5. 添加源文件:先跳过,我们后面手动添加Verilog文件。

小技巧: 创建工程时,勾选 Copy source files into project 选项。这样所有文件都会复制到工程目录下,方便打包和备份。我曾经因为没勾这个,换电脑后代码找不到了……

3.2 编写Verilog代码(LED闪烁)

现在我们来写真正的代码。在工程里新建一个Verilog文件:File → New → File,选择 Verilog File,命名为 led_blink.v

LED闪烁的原理很简单:用计数器对时钟分频,产生一个人眼可见的闪烁频率。比如50MHz的时钟,计数到25_000_000,就是0.5秒翻转一次,LED就会以1秒为周期闪烁。

下面是我写的代码,你可以直接复制使用:

module led_blink (
    input  wire clk,      // 系统时钟,50MHz
    input  wire rst_n,    // 复位信号,低电平有效
    output reg  led       // LED输出
);

    // 计数器最大值:50MHz / 2 = 25MHz,即0.5秒翻转一次
    parameter CNT_MAX = 25_000_000;

    reg [24:0] cnt;

    // 计数器逻辑
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt <= 0;
        else if (cnt >= CNT_MAX - 1)
            cnt <= 0;
        else
            cnt <= cnt + 1;
    end

    // LED翻转逻辑
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            led <= 1'b0;
        else if (cnt == CNT_MAX - 1)
            led <= ~led;
        else
            led <= led;
    end

endmodule

注意: 这里的 CNT_MAX 我设成了25_000_000。如果你的板子时钟频率不同,记得调整。比如25MHz时钟,就改成12_500_000。另外,复位信号是低电平有效,很多开发板上的复位按键就是低电平复位,别搞反了。

3.3 综合与布局布线

代码写完了,接下来让工具帮我们把代码变成芯片能识别的电路。

  • 综合(Synthesis):点击 Process → Synthesis,或者直接按 F5。工具会把Verilog代码转换成门级网表。这个过程一般几秒钟。如果报错,检查语法和端口定义。
  • 布局布线(Place & Route):综合通过后,点击 Process → Place & Route,或者按 F6。这一步会把逻辑单元分配到芯片的具体位置,并连接起来。时间稍长,但一般也就十几秒。

嗯,这里要注意:布局布线完成后,一定要看 Report 窗口。检查有没有时序违规(Timing Violation)。对于LED闪烁这种低速设计,基本不会有问题。但养成看报告的习惯,以后做复杂设计时能救命。

我的经验: 有一次我做高速接口,布局布线后时序一直不过。折腾了两天,最后发现是综合选项里优化等级设得太高了,导致逻辑被过度优化。所以,遇到问题先检查设置,别急着改代码。

3.4 生成JEDEC文件

布局布线成功后,就可以生成下载文件了。MachXO系列使用JEDEC格式(.jed文件)。

操作很简单:点击 Process → Export Files,或者直接双击 Export Files 流程。工具会自动生成 led_blink.jed 文件。

JEDEC文件包含了芯片配置的所有信息。说白了,它就是芯片的“灵魂”。没有它,板子就是一块废铁。

3.5 下载到开发板

最后一步,也是最激动人心的一步——把程序烧进芯片。

  1. 连接硬件:用下载线(通常是USB线或JTAG线)连接电脑和开发板。确保板子供电正常。
  2. 打开下载工具:Diamond自带 Programmer 工具。点击 Tools → Programmer 打开。
  3. 配置下载选项
    • 选择 Device:自动识别或手动选择你的芯片型号。
    • 选择 File:加载刚才生成的 .jed 文件。
    • 操作模式选 ProgramFlash Program。MachXO系列支持SRAM和Flash两种模式。SRAM模式掉电丢失,Flash模式可以永久保存。我建议第一次用Flash模式,这样拔电后程序还在。
  4. 点击Program:等待进度条走完。如果一切顺利,你会看到板子上的LED开始闪烁!

避坑指南: 下载失败时,先检查下载线是否插紧。我曾经花了半小时排查,最后发现是USB线松了。另外,有些开发板需要按住复位键再下载,具体看板子的说明书。

3.6 常见问题与调试

问题现象 可能原因 解决方法
综合报错:语法错误 代码中漏了分号或括号 检查Verilog语法,注意 endmodule 和分号
布局布线失败 资源不足或约束错误 检查芯片型号是否正确,减少逻辑资源使用
下载失败:无法识别设备 驱动未安装或下载线问题 重新安装Diamond驱动,更换USB线
LED不闪烁 时钟频率或计数器值不对 确认时钟频率,调整 CNT_MAX 参数

好了,到这里你已经完成了第一个完整的FPGA开发流程。从创建工程到LED闪烁,每一步都是基本功。以后无论做多复杂的项目,都离不开这些步骤。

我个人觉得,FPGA开发就像搭积木。LED闪烁是最小的一块积木,但它能让你理解整个工具链的运作方式。把这个流程跑通,后面学什么都会快很多。


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