3. 第一个工程:从零点亮一颗LED
好,咱们正式开始动手了。
这一章,我会带你完整走一遍MachXO系列芯片的开发流程。从创建工程、写Verilog代码,到综合、布局布线,最后生成JEDEC文件并下载到板子上。说白了,就是让板子上的LED灯闪起来。
别小看这个LED闪烁。我做了十几年FPGA,每次拿到新板子,第一个跑的一定是它。为什么?因为这是验证整个工具链、下载链路、芯片是否正常工作的最快方式。灯亮了,后面的事才有意义。
本章核心目标:
- 掌握Diamond软件创建工程的标准步骤
- 编写第一个Verilog代码(LED闪烁)
- 完成综合、布局布线、生成JEDEC文件
- 将程序下载到开发板,看到LED闪烁
3.1 创建Diamond工程
打开Diamond软件,界面看起来可能有点复杂。别慌,咱们一步步来。
- 新建工程:点击
File → New → Project,或者直接点工具栏上的“新建”图标。 - 填写工程信息:给工程起个名字,比如
led_blink。路径建议不要有中文和空格。我习惯在D盘建一个machxo_projects文件夹,所有工程都放里面。 - 选择器件:这一步很关键。根据你手上的开发板,选择对应的MachXO系列型号。比如
LCMXO2-1200HC-4TG100C。如果你不确定,看板子上的芯片丝印,或者问卖家要原理图。 - 选择综合工具:Diamond内置了Lattice自家的综合工具,选
Lattice LSE就行。我个人觉得LSE对MachXO系列优化得不错,没必要换别的。 - 添加源文件:先跳过,我们后面手动添加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 下载到开发板
最后一步,也是最激动人心的一步——把程序烧进芯片。
- 连接硬件:用下载线(通常是USB线或JTAG线)连接电脑和开发板。确保板子供电正常。
- 打开下载工具:Diamond自带
Programmer工具。点击Tools → Programmer打开。 - 配置下载选项:
- 选择
Device:自动识别或手动选择你的芯片型号。 - 选择
File:加载刚才生成的.jed文件。 - 操作模式选
Program或Flash Program。MachXO系列支持SRAM和Flash两种模式。SRAM模式掉电丢失,Flash模式可以永久保存。我建议第一次用Flash模式,这样拔电后程序还在。
- 选择
- 点击Program:等待进度条走完。如果一切顺利,你会看到板子上的LED开始闪烁!
避坑指南: 下载失败时,先检查下载线是否插紧。我曾经花了半小时排查,最后发现是USB线松了。另外,有些开发板需要按住复位键再下载,具体看板子的说明书。
3.6 常见问题与调试
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 综合报错:语法错误 | 代码中漏了分号或括号 | 检查Verilog语法,注意 endmodule 和分号 |
| 布局布线失败 | 资源不足或约束错误 | 检查芯片型号是否正确,减少逻辑资源使用 |
| 下载失败:无法识别设备 | 驱动未安装或下载线问题 | 重新安装Diamond驱动,更换USB线 |
| LED不闪烁 | 时钟频率或计数器值不对 | 确认时钟频率,调整 CNT_MAX 参数 |
好了,到这里你已经完成了第一个完整的FPGA开发流程。从创建工程到LED闪烁,每一步都是基本功。以后无论做多复杂的项目,都离不开这些步骤。
我个人觉得,FPGA开发就像搭积木。LED闪烁是最小的一块积木,但它能让你理解整个工具链的运作方式。把这个流程跑通,后面学什么都会快很多。
公众号:蓝海资料掘金营,微信deep3321