Lattice CrossLinkNx LIFCL-40实战指南:从零搭建50Hz方波生成工程
1. 认识你的开发伙伴Lattice CrossLinkNx与Radiant软件第一次接触FPGA开发的朋友可能会被各种术语吓到但别担心我们今天要用的这套工具组合其实非常友好。Lattice CrossLinkNx系列FPGA特别适合需要高速接口的项目比如视频处理或者传感器数据采集。我手头这块LIFCL-40-7MG121C开发板虽然看起来小巧但内部可是藏着不少好东西。Radiant软件是Lattice官方提供的开发环境最新2.0.1版本用起来比之前的Diamond流畅多了。安装过程我就不赘述了记得勾选所有驱动组件就行。有个小技巧分享给大家安装完成后建议重启电脑否则有时候USB识别会出问题。我第一次用的时候就卡在这折腾了半天才发现是驱动没完全加载。开发板连接也很简单用Type-C线接上电脑看到电源指示灯亮起就说明硬件准备就绪。这里有个细节要注意有些笔记本的USB供电不足可能会导致开发板工作不稳定。如果你发现程序烧录后运行不正常可以尝试换到台式机或者接个带电源的USB Hub。2. 从零创建你的第一个工程打开Radiant软件迎面而来的界面可能会让你有点懵。别慌跟着我一步步来。点击左上角的File - New - Project就像我们平时新建Word文档一样简单。给工程起名时我建议用有意义的英文名比如这次我们就叫wave_50hz。路径最好不要包含中文和空格这是很多开发工具的通用规则。我见过有人把工程放在桌面\新建文件夹里结果综合时报了一堆莫名其妙的错误。选择器件型号时要仔细核对LIFCL-40有好几个变种。我的板子上用的是LIFCL-40-7MG121C你们要根据自己板子上的丝印来选。选错型号的话后面的引脚约束都会对不上。第一次用的时候我就犯了这个错误浪费了一个多小时查问题。3. 时钟配置的艺术OSC IP核使用详解FPGA没有外部晶振怎么工作这就是CrossLinkNx厉害的地方了。它内置了一个450MHz的高精度振荡器我们可以通过OSC IP核来调用。在IP Catalog里找到OSC双击创建实例。关键参数HFCLK Divider设置为9这样450MHz除以9正好得到我们需要的50MHz系统时钟。这个值不是随便设的要保证分频后的时钟能满足你的设计需求。我曾经在一个项目里设错了分频值导致整个时序都不满足。生成IP核后建议立即右键选择View HDL Instantiation Template这样能看到例化模板。复制这个模板到你的顶层文件里后面写代码时会省事很多。这个小技巧是我踩过几次坑才总结出来的。4. Verilog编码实战50Hz方波生成现在来到最核心的部分——写代码生成50Hz方波。先解释下原理50Hz意味着周期20ms我们用50MHz时钟驱动每个时钟周期20ns所以要计数1000000次20ms/20ns。但直接计数到100万需要20位的计数器资源消耗比较大。这里我用了个小技巧先产生1kHz的中间信号再用这个信号生成50Hz输出。这样计数器只需要10位大大节省了逻辑资源。// 50MHz到1kHz的分频 always (posedge w_chip_clk_50m) begin if(r_counter 24999) begin r_counter 0; r_1khz ~r_1khz; end else begin r_counter r_counter 1; end end // 1kHz到50Hz的分频 always (posedge r_1khz) begin if(r_50hz_counter 9) begin r_50hz_counter 0; r_50hz_wave ~r_50hz_wave; end else begin r_50hz_counter r_50hz_counter 1; end end代码风格也很重要。我见过有人把所有逻辑都写在一个always块里虽然功能没问题但后期维护简直是噩梦。建议按功能分块写每个always块只做一个功能这样调试时会轻松很多。5. 约束文件硬件与软件的桥梁约束文件(.pdc)告诉工具你的设计如何映射到实际硬件。新手最容易忽略这个文件结果代码仿真都通过了下载到板子上就是不工作。首先指定输出引脚我用的G1你也可以根据自己板子的原理图选择其他引脚。电平标准要设对CrossLinkNx支持多种电平这里我们用1.8V LVCMOSldc_set_location -site {G1} [get_ports o_wave_50hz] ldc_set_port -iobuf {IO_TYPELVCMOS18H SLEWRATESLOW} [get_ports o_wave_50hz]然后是配置JTAG和SPI Flash的参数。这里有个坑要注意MASTER_SPI_PORT的时钟频率不能设太高特别是当你用的Flash型号比较老的时候。我一般从3MHz开始试稳定后再逐步提高。6. 综合与实现生成比特流文件点击Export Files按钮Radiant会自动完成整个流程综合、布局布线、生成比特流。这个过程可能会花几分钟取决于你的电脑性能。如果遇到时序违例的警告先别慌。对于这种低频设计大多数警告可以忽略。但如果是关键路径的违例就需要回头检查代码了。我建议新手养成看日志的习惯很多问题都能从警告信息里找到线索。生成bit文件后建议先用Open Timing View看看关键路径。虽然我们的设计很简单但这个习惯对以后做复杂项目很有帮助。你会慢慢理解FPGA是如何把你的代码转换成实际电路的。7. 程序下载与调试下载bit文件有两种方式直接下载到FPGA的SRAM或者烧写到SPI Flash永久保存。调试阶段建议用SRAM方式这样修改后可以快速验证。SRAM下载的配置很简单Target Memory选SRAMPort Interface选JTAGOperation选Fast Configuration如果要用SPI Flash记得先通过JTAG配置FPGA再切换到JTAG2SPI模式。这里最容易出错的是Flash的起始地址设置一定要参考你板子的手册。我有次烧写后程序不运行就是因为地址设错了导致FPGA找不到配置数据。8. 实测验证与问题排查最后用示波器测量输出引脚应该能看到干净的50Hz方波。如果没有信号按照这个顺序排查检查开发板供电是否正常确认bit文件确实下载成功用Signal Tap逻辑分析仪看内部信号检查约束文件里的引脚号是否正确有时候问题可能很简单比如我遇到过示波器探头接触不良的情况折腾半天才发现是测量方式不对。建议新手准备些杜邦线方便跳线测量。