一、Lattice FPGA 概述与开发环境搭建
大家好,我是你们的FPGA讲师。今天咱们聊聊Lattice FPGA,这个在低功耗、小封装领域做得相当出色的品牌。说实话,我最早接触FPGA是从Xilinx开始的,但后来做便携式设备项目时,才真正体会到Lattice的优势——那叫一个省电、小巧。
1.1 Lattice半导体公司及其FPGA产品线
Lattice半导体公司,说白了就是FPGA领域的"轻骑兵"。它不像某些大厂那样追求极致性能,而是专注于低功耗、小尺寸、快速上市的场景。我个人习惯把Lattice的FPGA分成三大主力系列:
| 系列 | 定位 | 典型应用 |
|---|---|---|
| MachXO | 控制与桥接 | 系统管理、I/O扩展、上电时序控制 |
| ECP5 | 中端通用 | 视频处理、通信接口、嵌入式视觉 |
| CrossLink | MIPI桥接 | 摄像头/显示屏接口转换、传感器桥接 |
MachXO系列:这玩意儿我用的最多。它有个特点——非易失性,上电即用,不需要外部配置芯片。我在一个工业控制项目里,就用MachXO做PLC的I/O扩展,稳定跑了三年没出过问题。
ECP5系列:如果你需要做点正经的逻辑处理,比如图像缩放、简单的神经网络推理,ECP5是个好选择。它内置了DSP块和块RAM,性能足够应付大多数中端应用。我记得有个客户用它做4K视频的色域转换,效果相当不错。
CrossLink系列:这个系列专为MIPI接口而生。你想想看,现在手机摄像头、显示屏基本都是MIPI接口,但很多主控芯片的MIPI通道数不够。CrossLink就是干这个的——做MIPI的分路、聚合、协议转换。我曾经用CrossLink把两个MIPI摄像头的数据合并到一个处理器上,省掉了一颗昂贵的视频采集卡。
选型建议:做控制用MachXO,做处理用ECP5,做接口用CrossLink。别搞混了,不然成本会翻倍。
1.2 开发环境搭建:Diamond vs Radiant
Lattice有两款主流开发工具:Lattice Diamond(老牌工具)和Lattice Radiant(新工具)。嗯,这里要注意:Diamond支持MachXO、ECP5等老系列,Radiant支持CrossLink、CertusPro等新系列。如果你用的是MachXO3或ECP5,建议用Diamond;如果是CrossLink或更新的器件,用Radiant。
我个人习惯是两台电脑各装一个——一台装Diamond做老项目维护,一台装Radiant做新设计。但如果你刚入门,我建议先装Radiant,因为它的界面更现代,对新手更友好。
安装流程(以Radiant为例)
- 下载安装包:去Lattice官网注册账号,下载Radiant软件(约2GB)。注意选择对应操作系统的版本。
- 安装:双击安装包,一路Next。安装路径不要有中文,不要有空格。我曾经因为路径带了个"(1)",结果编译报错查了半天。
- License配置:安装完成后,打开License Manager。如果你有正版License文件,直接导入;如果是评估版,选择"Node-Locked"模式,输入你的网卡MAC地址生成License。
- 验证安装:打开Radiant,新建一个空工程,如果能正常打开综合和布局布线工具,说明安装成功。
避坑指南:我曾经遇到过License文件路径包含中文导致软件无法启动的问题。解决办法很简单——把License文件放在纯英文路径下,比如C:\licenses\。
1.3 第一个LED闪烁工程
好了,环境搭好了,咱们来点实际的。写一个LED闪烁程序,让FPGA的某个引脚输出一个1Hz的方波,驱动LED一亮一灭。这是FPGA界的"Hello World",你想想看,每个FPGA工程师都从这个开始。
创建工程
- 打开Radiant,点击File → New → Project。
- 输入工程名(比如"led_blink"),选择保存路径。
- 选择器件:比如我手头有块CrossLink-NX开发板,就选LIFCL-40-7BG400C。
- 点击Finish,工程创建完成。
编写Verilog代码
新建一个设计文件(File → New → HDL File),输入以下代码:
module led_blink (
input wire clk, // 系统时钟,假设12MHz
input wire rst_n, // 复位,低有效
output reg led // LED输出
);
reg [23:0] cnt;
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
cnt <= 24'd0;
else if (cnt == 24'd11_999_999) // 12MHz / 2 = 6MHz,再分频到1Hz
cnt <= 24'd0;
else
cnt <= cnt + 1'b1;
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
led <= 1'b0;
else if (cnt == 24'd11_999_999)
led <= ~led;
else
led <= led;
end
endmodule
这段代码很简单:用计数器对12MHz时钟进行分频,每12,000,000个时钟周期翻转一次LED。这样LED就以1Hz的频率闪烁了。
小技巧:如果你用的开发板时钟频率不同,记得修改计数器的上限值。比如25MHz时钟,上限就是24'd24_999_999。我刚开始学的时候经常算错,后来干脆写了个Python脚本自动算。
综合、布局布线与下载
- 综合(Synthesis):点击工具栏的"Synthesize"按钮。Radiant会调用Synplify Pro进行综合。如果代码有语法错误,这里会报错。我第一次写时忘了加分号,报错信息看得一头雾水——后来学会了看行号定位错误。
- 布局布线(Place & Route):综合通过后,点击"Place & Route"。这一步会把逻辑映射到FPGA的实际资源上。如果资源不够用,这里会报错。嗯,我遇到过LUT不够的情况,后来优化了代码结构才解决。
- 生成比特流:布局布线完成后,点击"Generate Bitstream"。生成.bit文件,这就是要下载到FPGA的配置文件。
- 下载到开发板:连接好下载器(比如FTDI或Lattice专用下载线),点击"Program Device"。选择生成的.bit文件,点击Program。如果一切顺利,LED应该开始闪烁了。
常见问题:下载时提示"Failed to open device"?检查下载器驱动是否安装,或者换个USB口试试。我曾经因为用了USB延长线导致下载失败,直接插主板USB口就好了。
1.4 本章知识体系
为了让你更直观地理解本章内容,我画了一张流程图:
这张图把本章的知识点串起来了:从产品选型开始,到环境搭建,最后到工程实践。你跟着这个流程走一遍,基本就入门了。
1.5 写在最后
好了,第一章的内容就到这里。说实话,搭建开发环境是最枯燥的一步,但也是必须跨过去的坎。我当年装Diamond时,因为License问题折腾了一整天,差点想放弃。但后来想想,哪个工程师不是从踩坑中成长起来的呢?
你只要按照上面的步骤,把LED点亮了,恭喜你——你已经正式踏入FPGA开发的大门了。后面的章节,咱们会一步步深入,从组合逻辑到时序逻辑,从简单接口到复杂协议,慢慢来,不着急。