最近在使用 FPGA,感觉和 MCU 有很多不一样的地方,这里简单总结一下。我手头用的是 GW1NR-9K 系列,资源和价格都还算合适,除了支持相当多的电平标准之外,还有一些平时不太会用到的特性,值得记录。

4/8/16/24 mA 驱动能力
驱动能力表示管脚作为输出时能够提供的驱动强度。数值越大,上升沿和下降沿通常越快,但噪声、功耗和过冲也可能随之增大。它并不是要求外设必须消耗这么大的电流,而是给了一个能力上限的参考。
怎么用电流评估驱动能力?
GPIO 同时涉及电压和电流,只是它们由两个不同的配置分别决定。常见的 LVCMOS33 决定逻辑电压约为 0 V / 3.3 V,而 DRIVE=8 则决定管脚输出高低电平时的驱动能力约为 8 mA。
这个驱动强度并不是说管脚始终输出 8 mA,也不是一个恒流源。实际电流仍然取决于负载:
电流 = 电压 ÷ 负载阻抗
拿 ADC 的 DIN、SCLK 和 CS 来说,它们都属于高阻数字输入,稳态电流很小,主要只是在电平跳变时给线路和输入电容充放电。驱动强度越大,可以理解为 FPGA 输出端的等效电阻越小:能更快地给线路电容充放电,上升沿、下降沿更陡,带多个数字输入时更稳定,但也更容易产生过冲、振铃和电磁干扰。
比如 FPGA 输出高电平时,电压加载在等效输出电阻上,最后作用到线路电容和外设输入。选择 24 mA 通常比 4 mA 充电更快,但并不代表电压变成了 24 V,输出仍然约为 3.3 V。
一般来说,驱动强度选得不理想,主要影响信号边沿和稳定性。
Bus Keeper
管脚没有被外部驱动时,Bus Keeper 会弱保持最后一次高、低电平,而不是固定拉高或拉低。
常见的用途包括:多个设备共享数据总线、外设有三态输出信号、FPGA 管脚需要暂时保持前一状态等。它可以减少悬空输入导致的随机跳变、额外功耗和误触发。
它与上下拉的区别如下:
| 配置 |
外部释放后 |
| 上拉 |
固定趋向高电平 |
| 下拉 |
固定趋向低电平 |
| Bus Keeper |
保持最后一次电平 |
| 无任何配置 |
可能悬空并随机变化 |
需要提醒的是,Bus Keeper 的保持能力很弱,外部设备仍能轻松改变电平。它不能替代寄存器存储数据,也不能用于保持精确的模拟电压。
去迟滞
这个从字面上就能理解个大概。前几天的诺贝尔奖设备里就对数据做了延迟处理,这里的情况也差不多:走线时信号有的快有的慢,那就让快的稍微慢一点,和慢的对齐。
把某些输入信号人为延迟一小段时间,从而对齐数据和时钟,常用于高速并行总线、源同步接口、DDR 数据与时钟对齐、修正 PCB 走线长度差、调整输入建立时间和保持时间等场景。

但是需要注意,这种延迟通常只有纳秒或更小的调节范围,不能当作毫秒级定时器来用。
热插拔
支持热插拔意味着系统带电时插入或拔出连接器,I/O 具有一定的保护和安全行为。例如减少未供电器件被信号线反向供电、上电过程中尽量保持高阻、限制异常电流、避免电源顺序不同导致锁死等。
但 GPIO 即使支持热插拔,也不能直接接入超过额定范围的电压。

FPGA 确实挺好玩的,有一种放飞自我的感觉:

后面还有一个调整边沿的选项,这次就先不展开了。如果你也在折腾 FPGA,欢迎到 云栈社区 一起交流踩坑经验和心得。
|