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负责逻辑运算,EBR和分布式RAM负责数据存储,PLL提供时钟,UFM存配置,I/O Bank负责对外通信。它们之间通过内部总线互联,协同工作。
好了,这一章的内容就到这里。MachXO2的架构其实不复杂,关键是理解每个模块的定位和用法。下一章我们会深入PFU的配置细节,到时候再聊。