4. MachXO2内部架构详解

各位同学,今天我们来聊聊MachXO2的内部架构。说实话,我第一次接触这颗芯片时,也被它丰富的资源吓了一跳。别担心,我们一个一个来看。

4.1 可编程逻辑单元(PFU)

PFU是FPGA的核心,说白了就是实现你逻辑功能的地方。MachXO2的PFU结构和Lattice其他系列一脉相承,但做了一些优化。

每个PFU包含4个查找表(LUT),每个LUT有4个输入。我个人习惯把PFU看作一个“小计算单元”——它能实现任何4输入的逻辑函数,还能做算术运算。

关键特性:

  • 每个PFU有4个LUT4 + 4个寄存器
  • 支持算术模式(加法器、计数器)
  • 支持RAM模式(分布式RAM)
  • 寄存器可配置为D触发器或锁存器

我在项目中遇到过一个问题:用PFU实现一个16位计数器,结果资源占用比预期高。后来发现是综合工具把算术逻辑和寄存器分开了。嗯,这里要注意——尽量让综合工具把LUT和寄存器放在同一个PFU内,这样布线更短,时序更好。

4.2 嵌入式块RAM(EBR)

EBR是MachXO2的“大容量仓库”。每个EBR是9Kbit,可以配置成不同位宽和深度。

配置模式 深度 位宽
单端口 8192 1
单端口 1024 8
单端口 512 16
双端口 1024 8
双端口 512 16

你想想看,9Kbit听起来不大,但做FIFO、数据缓冲绰绰有余。我曾经用两个EBR拼成一个18Kbit的异步FIFO,处理ADC采样数据,效果非常好。

我的经验:EBR的读写时序要特别注意。默认情况下,读操作是同步的——地址变化后,数据要等一个时钟周期才出来。如果你需要组合逻辑读,那就得用分布式RAM了。

4.3 分布式RAM

分布式RAM就是用PFU里的LUT搭出来的RAM。每个LUT4可以做成16x1的RAM。好处是延迟低,坏处是容量小。

什么时候用分布式RAM?我个人觉得,小容量、高速度的场景最合适。比如做一个8深度的指令队列,或者存几个配置参数。

避坑指南:我曾经把分布式RAM当EBR用,结果综合时报了一大堆警告——资源不够!分布式RAM会消耗PFU,而PFU还要做逻辑。所以,超过64bit的存储,我建议直接用EBR。

4.4 PLL与时钟资源

MachXO2内部有2个PLL(锁相环)。别小看这2个PLL,它们能做的事情可不少。

  • 输入频率范围:10MHz ~ 400MHz
  • 输出频率范围:3.125MHz ~ 400MHz
  • 支持倍频、分频、相位调整
  • 支持动态配置(运行时改频率)

为什么需要PLL?说白了,外部晶振通常只有几十MHz,但你的逻辑可能需要跑100MHz、200MHz。PLL就是用来“变魔术”的。

我记得有一次做视频处理项目,需要生成27MHz、74.25MHz、148.5MHz三个时钟。一个PLL搞定,省了一个晶振的钱。嗯,这里要注意——PLL的输出抖动和电源噪声关系很大,建议在PLL供电引脚上加LC滤波。

4.5 用户闪存(UFM)

UFM是MachXO2的一个特色资源。它是一块非易失性存储,掉电不丢数据。容量从64Kbit到256Kbit不等,具体看型号。

UFM能干什么?

  • 存储配置参数(比如校准系数)
  • 保存设备序列号
  • 存放启动代码
  • 做简易的日志记录

使用方式:UFM通过SPI接口访问。Lattice提供了免费的UFM控制器IP,直接例化就能用。读写时序和普通SPI Flash类似,但速度更快。

我曾经用UFM存了一组PID控制参数,上电后自动加载。这样即使断电,参数也不会丢。比外挂EEPROM省了一个芯片,还省了PCB面积。

4.6 I/O Bank与Bank电压

最后说说I/O。MachXO2的I/O分成多个Bank,每个Bank可以独立设置电压。

Bank 支持的电压 典型用途
Bank 0 1.2V / 1.5V / 1.8V / 2.5V / 3.3V 核心逻辑、配置
Bank 1 1.2V / 1.5V / 1.8V / 2.5V / 3.3V 通用I/O
Bank 2 1.2V / 1.5V / 1.8V / 2.5V / 3.3V 通用I/O
Bank 3 1.2V / 1.5V / 1.8V / 2.5V / 3.3V 通用I/O

为什么要分Bank?因为你的系统里可能有多种电压的设备。比如ARM处理器是1.8V,传感器是3.3V。把不同电压的信号接到不同Bank,各自供电,互不干扰。

我曾经犯过的错:把3.3V信号接到了1.8V Bank上,结果芯片冒烟了...虽然MachXO2有钳位二极管保护,但长期过压会损坏I/O。所以,一定要核对Bank电压和信号电平是否匹配

另外,每个Bank的VCCIO引脚必须接对应的电压。如果Bank 0用3.3V,那VCCIO0就得接3.3V。别偷懒,不接的话I/O不工作。

知识体系总览

下面这张图是我画的MachXO2内部架构关系图,帮你理清各个模块之间的联系:

MachXO2 内部架构总览 可编程逻辑单元 PFU 4x LUT4 + 4x Reg 算术模式 / RAM模式 分布式RAM (16x1/LUT) 嵌入式块RAM EBR 9Kbit / 块 单端口 / 双端口 FIFO / ROM 模式 PLL与时钟 2x PLL 10~400MHz 输入 倍频 / 分频 / 移相 动态配置 用户闪存 UFM 64~256Kbit SPI接口访问 非易失性存储 I/O Bank Bank 0 / Bank 1 / Bank 2 / Bank 3 独立Bank电压:1.2V / 1.8V / 2.5V / 3.3V 支持多种I/O标准:LVCMOS / LVTTL / SSTL 可编程驱动能力 / 上拉 / 下拉 数据总线 时钟网络 配置总线 数据总线 时钟分配

这张图展示了MachXO2的六大核心模块。PFU负责逻辑运算,EBR和分布式RAM负责数据存储,PLL提供时钟,UFM存配置,I/O Bank负责对外通信。它们之间通过内部总线互联,协同工作。

好了,这一章的内容就到这里。MachXO2的架构其实不复杂,关键是理解每个模块的定位和用法。下一章我们会深入PFU的配置细节,到时候再聊。


专注资料整理